Java 工程师核心基础

经常使用监听器、过滤器、拦截器等技术,开发者对 SpringMVC 项目的 web.xml 中关于它们的配置早已习以为常,可能忘了它们的底层细节:它们的启动顺序如何,多个 Filter 的执行顺序是什么,Filter 链上如何调用或者阻断下一个 Filter,什么业务场景下使用哪种技术 ……

就笔者的经验来说,监听器、过滤器、拦截器、Servlet 等概念,还是十年前入行时学的知识。从业之后,都是按需百度用法,项目中所涉及到的这些类都是复用组件,很少需要修改,它们隐藏在 web.xml 中,也就忽略了它们的存在。

近期,由于项目需要添加一个角色权限验的 Filter,它和已有会话校验 Filter 有依赖关系,所以突然意识到一个问题,怎么保证这种依赖顺序:请求必须先通过会话校验 Filter,成功之后,才能进入角色权限校验 Filter?

笔者将以此次工作的内容为契机,通过程序验证 web.xml 中这些配置类协同工作的流程,形成此篇 Chat,以唤醒开发者大脑深处对 Listener、Filter、Interceptor 的记忆。

准备:创建一个 SpringMVC 的 web 工程

首先,我们选用 SpringMVC 技术,整理出与之相关的几种必要组件如下:

SpringMVC 初始化 Servlet 类:DispatcherServlet;

自定义应用启动时需要的初始化操作Servlet类:AppInitServlet;

自定义用户登陆操作校验拦截器:SessionCheckerFilter;

解决请求参数乱码问题的编码拦截器:CharacterEncodingFilter,可自定义,也可用 Spring 自带的 Filter,如:

org.springframework.web.filter.CharacterEncodingFilter;

Log4j 监听器:Log4jConfigListener。

其次,创建一个 JavaWeb 工程,编写 web.xml 配置,其中 web-app 元素内容为:

    

    

        log4jConfigLocation

        classpath:config/log4j.properties

    

    

    

        log4jRefreshInterval

        100000

    

    

    

        org.springframework.web.util.Log4jConfigListener

        

    

    

    

        com.woodwang.common.TomcateCameraListener

        

    

    

    

        org.springframework.web.context.ContextLoaderListener

        

    

    

    

        contextConfigLocation

        

            classpath:config/spring.xml

        

    

    

    

        dispatcherServlet

        org.springframework.web.servlet.DispatcherServlet

        

        

            contextConfigLocation

            classpath:config/spring-mvc.xml

            

        

        1

    

    

    

    

        dispatcherServlet

        /controller/*

    

    

    

        encodingFilter

        com.woodwang.common.CharacterEncodingFilter

        

        

            encoding

            UTF-8

        

        

            forceEncoding

            true

        

    

    

        encodingFilter

        /*

    

    

    

        sessionChecker

        

            com.woodwang.common.SessionCheckFilter

        

        

            

            isEnabled

            true

        

        

            

            indexPage

            index.jsp

        

    

    

    

        xssFilter

        

            com.woodwang.common.XssCheckFilter

        

            

            

                isEnabled

                true

       

大家可能注意到,该配置文件中的 1 个 Listener、3 个 Filter 和 1 个 Servlet 都指向自定义的类名,这样我们就可以按需添加必要的日志信息以跟踪流程。接下来笔者将实现这几个自定义的组件类,并通过执行的日志信息来带领读者了解 Listener、Filter、Interceptor 的用法。

猜你喜欢

转载自www.cnblogs.com/ibrigd/p/12940943.html