Javaweb学习之过滤器(Filter)的使用

概念

过滤器就是对web资源进行拦截,进行一些处理后再交给下一个过滤器或servlet,甚至直接交给客户端或服务器;可以拦截request进行处理的,也可以对返回的response进行拦截后处理。并且一个请求或一个响应都可以经过多层过滤器,如下图所示:

用途

  • 自动登录

  • 设置统一的编码格式,避免乱码

  • 访问权限的控制

  • 进行敏感字符过滤(如经常遇到的不文明发言被过滤或者以“*”的形式显示出来)

    ......

示例

这里以一个servlet和一个filter作为示例。

servlet作为请求,向浏览器写入一串中文字符,发生乱码是意料之中的事情:

package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class show extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*        resp.setContentType("text/html;charset=utf-8");
        resp.setCharacterEncoding("UTF-8");*/
        resp.getWriter().write("好久不见,你还好吗?");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

servlet的注册:

<servlet>
    <servlet-name>show</servlet-name>
    <servlet-class>servlet.show</servlet-class>
</servlet><servlet-mapping>
    <servlet-name>show</servlet-name>
    <url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>show</servlet-name>
    <url-pattern>/show</url-pattern>
</servlet-mapping>

这里设置两个路径是为了方便测试过滤器是否起作用。下面的过滤器注册的路径是/servlet/*,意味着/servlet路径下面的页面才能实现过滤器。

当然,上述的servlet可以使用代码中被注释掉的部分进行编码的设置,防止乱码的发生。但此种方法需要无意义地重复,不推荐使用。而过滤器就可以完成这项工作。

使用步骤

  • 新建一个类,实现Filter接口

  • 重写三个方法

  • 在web.xml中注册(或使用注解)

需要重写的三个方法的作用:

void init(FilterConfig var1) throws ServletException; //过滤器初始化,在服务器启动时就自动执行了。

void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; //过滤器的主体部分,过滤的代码在这里编写。

void destroy(); //过滤器的销毁,在服务器关闭时实现。

package filter;
import javax.servlet.*;
import java.io.IOException;
public class Encode implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter 初始化");
    }
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
​
        System.out.println("过滤器执行前");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("过滤器执行后");
    }
    public void destroy() {
        System.out.println("Filter 已被销毁");
    }
}

最后是注册,完成后即可使用:

<filter>
    <filter-name>Encode</filter-name>
    <filter-class>filter.Encode</filter-class>
</filter>
<filter-mapping>
    <filter-name>Encode</filter-name>
    <url-pattern>/servlet/*</url-pattern>
</filter-mapping>

 

posted @ 2020-07-28 10:08  HaydenWong211  阅读(308)  评论(0编辑  收藏  举报