Filter

前言

1、Filter

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

  • Filter 一定会随着 Tomcat 的启动而自启动。

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

    1
    严重: Context [] startup failed due to previous errors
  • 实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    /* 打印用户访问 ip 地址和访问的页面 */

    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class FirstFilter implements Filter {

    @Override
    public void destroy() {

    }

    @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 等等
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- 配置 web.xml -->

    <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>

2、中文处理

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

  • 使用 Filter 处理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class EncodingFilter implements Filter {

    @Override
    public void destroy() {

    }

    @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);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }
    }
  • 配置 web.xml

    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>

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、登陆验证
隐藏目录