Java Filter

前言

1、Filter

  • Filter 程序是一个实现了特殊接口的 Java 类,与 Servlet 类似,也是由 Servlet 容器进行调用和执行的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    String ip = request.getRemoteAddr(); // 获取来路用户的 ip 地址
    String url = request.getRequestURL().toString(); // 获取用户访问的页面地址
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date d = new Date();
    String date = sdf.format(d);

    System.out.printf("%s %s 访问了 %s%n", date, ip, url);

    chain.doFilter(request, response); // 过滤器放行,表示继续运行下一个过滤器,或者最终访问的某个 servlet, jsp, html 等等
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <filter>
    <filter-name>FirstFilter</filter-name>
    <filter-class>filter.FirstFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>FirstFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
  • Filter 一定会随着 Tomcat 的启动自启动。

  • Filter 是 web 应用非常重要的一个环节,如果 Filter 启动失败,或者本身有编译错误,不仅这个 Filter 不能使用,整个 web 应用会启动失败,导致用户无法访问页面。

2、中文处理

  • 通过 Filter 过滤器进行中文处理,那么所有的 Servlet 都不需要单独处理了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>filter.EncodingFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    request.setCharacterEncoding("UTF-8"); // 正确获取 UTF-8 编码的中文

    chain.doFilter(request, response);
    }

3、登陆验证

  • 与通过 Filter 处理中文问题一样,也可以通过 Filter 一次性解决所有的登陆验证问题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    String uri = request.getRequestURI();
    if (uri.endsWith("login.html") || uri.endsWith("login")) { // 首先判断是否是访问的 login.html 和 loginHero,因为这两个页面就是在还没有登陆之前就需要访问的
    chain.doFilter(request, response);
    return;
    }

    String userName = (String) request.getSession().getAttribute("userName"); // 从 Session 中获取 userName,如果没有,就表示不曾登陆过,跳转到登陆页面
    if (null == userName) {
    response.sendRedirect("login.html");
    return;
    }

    chain.doFilter(request, response);
    }
文章目录
  1. 1. 前言
  2. 2. 1、Filter
  3. 3. 2、中文处理
  4. 4. 3、登陆验证
隐藏目录