javaweb Filter过滤器

介绍

JavaWeb 的三大组件之一
JavaEE 的规范,就是接口

作用

拦截请求,过滤响应

工作原理

生命周期

  1. 启动Servlet容器时,通过反射创建实例,调用 init() 方法,仅调用一次。

  2. 当请求的url,与过滤路径匹配时,被 doFilter() 方法拦截

  3. Servlet容器关闭时,调用 destroy() 方法,然后销毁实例

应用场景

  • 设置字符集

  • 登录验证

  • 过滤IP

  • 权限检查

实现方式

实现 javax.servlet.Filter 接口

实现接口的 doFilter() 方法

配置web.xml

  • 将 Servlet 配置 web.xml 中

  • 注解(新方式)

设置字符集

javaweb Filter过滤器-设置字符集(简单版)

例子:登录验证

public class LoginFilter implements Filter {

    public LoginFilter(){
        System.out.println("LoginFilter构造方法");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init()方法");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain fc) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest)servletRequest;
        HttpServletResponse resp=(HttpServletResponse)servletResponse;

        //如果访问登录页面,不拦截
        String uri=req.getRequestURI();
        if(uri.contains("login.jsp")){
            fc.doFilter(req, resp);
            return;
        }

        HttpSession session=req.getSession();
        Object user=session.getAttribute("user");

        if(user!=null) {
            fc.doFilter(req, resp);
        }else {
            String contextPath=req.getContextPath();
            resp.sendRedirect(contextPath+"/login.jsp");
        }

    }


    @Override
    public void destroy() {
        System.out.println("destroy()方法");
    }
}

配置web.xml

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>top.malaoshi.LoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <!-- 任何请求都被拦截 -->
    <url-pattern>/*</url-pattern>
</filter-mapping>

原文出处:/show_1EF6NZ9g38tI.html