1. 过滤器


  • 23.12.17 21:59开始
  • 23.12.17 23:35更新

1.1. 过滤器实现原理图

1.2. 编写过滤器

第一步: 编写一个java类实现一个接口:jarkata.servlet.Filter,并且实现这个接口当中的doFilter方法。

  • init方法:在Filter对象第一次被创建之后调用,并且只调用一次。
  • doFilter方法:只要用户发送一次请求,则执行一次;发送N次请求,则执行N次;在这个方法中编写过滤规则。
  • destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次。

第二步: 在web.xml文件中对Filter进行配置。

<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.xxx.javaweb.filter1</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>/abc</url-pattern>
</filter-mapping>

或则使用注解@WebFilter({"*.do"})

1.3. 生命周期

  • Servlet对象默认情况下,在服务器启动的时候是不会新建对象的。
  • Filter对象默认情况下,在服务器启动的时候新建对象。
  • Servlet是单例的,Filter也是单例的。

1.4. 目标Servlet执行条件

  • 在过滤器当中是否编写了:chain.doFilter(request, response);
  • 用户发送的请求路径是否和Servlet的请求路径一致。

chain.doFilter(request, response);:执行下一个过滤器,如果下面没有过滤器了,执行最终的Servlet。

  • Filter的优先级高于Servlet:/a.do对应了一个Filter,也对应了一个Servlet,那么一定是先执行Filter。

1.5. Filter的配置路径

  • 精确匹配:/a.do/b.do/dept/save
  • 配置所有:/*
  • 后缀匹配:*.do
  • 前缀匹配:/dept/*

1.6. Filter执行顺序

  • 依靠filter-mapping标签的位置,越靠上优先级越高。
  • dofilter调用遵循栈结构,先进后出。
  • 使用注解方式:比较Filter类名的顺序,例如:FilterA和FilterB,则执行FilterA。

1.7. Filter设计模式

责任链设计模式:在程序运行阶段,动态的组合程序调用顺序。

1.8. Filter优点

在程序编译阶段下不会确定调用顺序,因为Filter的调用顺序是配置到web.xml文件中的,只要修改web.xml配置文件中的filter-mapping的顺序就可以吊证Filter的执行顺序。

显然Filter的执行顺序是在程序运行阶段动态组合的,那么这种设计模式被称为责任链设计模式。

1.9. 登录过滤器

1.9.1. 配置文件

<!-- 登录检查过滤器,过滤所有的路径 -->
<filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>com.xxx.javaweb.filter.LoginCheckFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

1.9.2. 过滤器

public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChina chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;

        HttpSession session = request.getSession(false);
        String servletPath = request.getServletPath();
        // 首页放行、欢迎页放行、去登录放行、退出放行、已登录放行
        if("/index.jsp".equals(servletPath) || "/welcome".equals(servletPath) || "/user/login".equals(servletPath) || "/user/exit".equals(servletPath) || (session != null && session.getAttribute("username") != null)) {
            // 继续往下走
            chain.doFilter(request, response);
        } else {
            response.sendRedirect(request.getContextPath() + "/index.jsp");
        }
    }
}

1.10. 视频

results matching ""

    No results matching ""