【Java从零到架构师第二季】【13】Filter_Listener


持续学习&持续更新中…

学习态度:守破离


Filter

什么是Filter

在这里插入图片描述

Filter拦截请求原理

chain.doFilter(request, response);相当于调用服务器的doGet或者doPost方法,如果不调用该方法的话,相当于不去调用服务器的doGet或者doPost方法,那么服务器就不会处理请求,于是就起到了拦截(过滤)请求的作用。

在这里插入图片描述

在这里插入图片描述

两种使用方式

注解(如果有好几个Filter的话,按照类名的字符串比较它们的大小,小的先执行。【request】):


@WebFilter("/*")
public class LoginFilter implements Filter {
    
    

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    
    
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        String uri = request.getRequestURI();

        // 优先放开的请求
        if (uri.contains("/asset/")
                || uri.contains("/contact/save")) {
    
    
            chain.doFilter(request, response);
        } else if (uri.contains("/admin")
                || uri.contains("/save")
                || uri.contains("/remove")
                || uri.contains("/user/password")
                || uri.contains("/user/updatePassword")) {
    
    
            // 需要作登录验证的请求
            Object user = request.getSession().getAttribute("user");
            if (user != null) {
    
     // 登录成功过
                chain.doFilter(request, response);
            } else {
    
     // 没有登录成功过
                response.sendRedirect(request.getContextPath() + "/page/login.jsp");
            }
        } else {
    
    
            chain.doFilter(request, response);
        }
    }
}

XML(如果有好几个Filter的话,哪个写在上面先执行哪个。【request】):

    <!-- 配置Filter -->
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.mj.xr.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

生命周期方法

在这里插入图片描述

    /**
     * 当Filter被加载到Web容器中调用(也就是当项目被部署到Web容器Tomcat时)
     * @throws ServletException
     */
    public void init(FilterConfig config) throws ServletException {
    
    
        // 适合做一些资源的加载、初始化(ServletContextListener更合适做资源的初始化和一次性加载)
        System.out.println("LoginFilter - init");
    }

    /**
     * 当Filter从Web容器中移除时调用(也就是当项目从Web容器中取消部署时)
     */
    public void destroy() {
    
    
        // 适合做一些资源的回收操作
        System.out.println("LoginFilter - destroy");
    }

dispatcherTypes属性

在这里插入图片描述

注解形式:

设置一个:

@WebFilter(value = "/*", dispatcherTypes = DispatcherType.REQUEST)
public class LoginFilter implements Filter {
    
    
// ......
}

两个都设置:

@WebFilter(value = "/*", dispatcherTypes = {
    
    DispatcherType.REQUEST, DispatcherType.FORWARD})
public class LoginFilter implements Filter {
    
    

XML形式:

    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.mj.xr.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <!--  可设置一个或两个都设置  -->
        <dispatcher>REQUEST</dispatcher> <!--  不会拦截转发请求  -->
        <dispatcher>FORWARD</dispatcher> <!--  只会拦截转发请求  -->
    </filter-mapping>

Listener

ServletContextListener

ServletContext:与项目“同生共死”。ServletContext就代表着项目的生命。

在这里插入图片描述

两种使用方式

注解:

@WebListener()
public class ContextListener implements ServletContextListener {
    
    
  
    // 项目被部署时调用
    @Override
    public void contextInitialized(ServletContextEvent sce) {
    
    
        // 在项目启动(部署)的时候做一些一次性的操作(资源加载)
        System.out.println("contextInitialized------------------");

//        null参数表示允许值为null
//        DateConverter dateConverter = new DateConverter(null);
//        dateConverter.setPatterns(new String[]{"yyyy-MM-dd"});
//        ConvertUtils.register(dateConverter, Date.class);
    }
    
    // 项目被取消部署时调用
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    
    
        // 回收资源
        System.out.println("contextDestroyed------------------");
    }

}

XML:

    <!-- 配置Listener -->
    <listener>
        <listener-class>com.mj.xr.listener.ContextListener</listener-class>
    </listener>

参考

李明杰: Java从0到架构师②JavaEE技术基石.


本文完,感谢您的关注支持!


おすすめ

転載: blog.csdn.net/weixin_44018671/article/details/121236054
おすすめ