首页 > 编程知识 正文

拦截器,过滤器,监听器执行顺序,拦截器和过滤器的执行顺序

时间:2023-05-05 07:44:10 阅读:17193 作者:2257

一、引言我想记录用户登录和登录后的权限管理、菜单管理方面的问题,但考虑使用Interceptor来解决这个问题,考虑到Interceptor 让我们在下一篇文章中讨论Interceptor如何解决权限和菜单管理问题。 关于味增。

二、区别1,过滤器(过滤器)首先说明过滤器的使用位置。 配置web.xml时,请始终通过放置以下段落来设置字符编码: 否则,就会发生乱码问题。

过滤器过滤器- name encoding/filter-name filter-class org.spring framework.web.filter .迷路的发卡/filter-class init -。 init-paraminit-param param-nameforceencoding/param-name param-valum filter-mapping filter-name encoding/file

(1)过滤器)过滤器) :依赖于servlet容器。 几乎可以过滤所有请求,但缺点是一个过滤器实例在容器初始化时只能调用一次。 使用过滤器的目的是通过一些过滤器操作来获取我们想要获取的数据。 例如,在Javaweb上,可以为收到的请求和响应预先过滤一些信息,预先设置一些参数,然后输入servlet或控制器进行业务逻辑操作通常,在过滤器中修改字符编码(迷路的发卡),在过滤器中修改HttpServletRequest的某些参数(XSSFilter )。 例如,过滤低俗文字和危险文字等。

2、拦截器拦截器配置一般在SpringMVC配置文件中使用拦截器标签。 具体配置如下。

MVC : interceptors MVC : interceptor MVC :映射路径='/* * '/bean class=' com.scorpios.atcrowdfunding.web.MVC : interceptor MVC : interceptor MVC :映射路径='/* * '/bean class=' com.scorpios.atcrowdfunding.web.MVC : interceptor/MVC : interceptors (2)解释器(解释器) ) 在实现中,基于Java的反射机制是面向片的编程(AOP )的一种操作,它在调用服务或方法之前调用方法,或在方法之后调用方法。 例如,动态代理是拦截器的简单实现,因为可以在调用方法之前打印字符串、在调用方法之后打印字符串或抛出异常的拦截器是基于web框架的调用此外,拦截器实例可以在控制器的生命周期中多次调用。 拦截器可以拦截处理静态资源的要求。

三、在代码下在一个项目中使用多个过滤器和多个拦截器,观察它们的执行顺序。(1)第一个过滤器:

publicclasstestfilter1implements filter { @ overrideprotectedvoiddofilter (httpservletrequestrequestrequest,http servlet response rese requequequest

vletException, IOException { //在DispatcherServlet之前执行 System.out.println("############TestFilter1 doFilterInternal executed############"); filterChain.doFilter(request, response); //在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后 System.out.println("############TestFilter1 doFilter after############"); } }

(2)第二个过滤器:

public class TestFilter2 implements Filter { @Override protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { //在DispatcherServlet之前执行 System.out.println("############TestFilter2 doFilterInternal executed############"); filterChain.doFilter(request, response); //在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后 System.out.println("############TestFilter2 doFilter after############"); } }

(3)在web.xml中注册这两个过滤器:

<!-- 自定义过滤器:testFilter1 --> <filter> <filter-name>testFilter1</filter-name> <filter-class>com.scorpios.filter.TestFilter1</filter-class> </filter> <filter-mapping> <filter-name>testFilter1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 自定义过滤器:testFilter2 --> <filter> <filter-name>testFilter2</filter-name> <filter-class>com.scorpios.filter.TestFilter2</filter-class> </filter> <filter-mapping> <filter-name>testFilter2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

再定义两个拦截器:
(4)第一个拦截器:

public class BaseInterceptor implements HandlerInterceptor{ /** * 在DispatcherServlet之前执行 * */ public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("************BaseInterceptor preHandle executed**********"); return true; } /** * 在controller执行之后的DispatcherServlet之后执行 * */ public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("************BaseInterceptor postHandle executed**********"); } /** * 在页面渲染完成返回给客户端之前执行 * */ public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("************BaseInterceptor afterCompletion executed**********"); } }

(5)第二个拦截器:

public class TestInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("************TestInterceptor preHandle executed**********"); return true; } public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("************TestInterceptor postHandle executed**********"); } public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("************TestInterceptor afterCompletion executed**********"); } }

(6)、在SpringMVC的配置文件中,加上拦截器的配置:

<!-- 拦截器 --> <mvc:interceptors> <!-- 对所有请求都拦截,公共拦截器可以有多个 --> <bean name="baseInterceptor" class="com.scorpios.interceptor.BaseInterceptor" /> <mvc:interceptor> <!-- 对/test.jsp进行拦截 --> <mvc:mapping path="/test.jsp"/> <!-- 特定请求的拦截器只能有一个 --> <bean class="com.scorpios.interceptor.TestInterceptor" /> </mvc:interceptor> </mvc:interceptors>

(7)、定义一个Controller控制器:

package com.scorpios.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class TestController { @RequestMapping("/test") public ModelAndView handleRequest(){ System.out.println("---------TestController executed--------"); return new ModelAndView("test"); } }

(8)、测试结果:
启动测试项目,地址如下:http://www.localhost:8080/demo,可以看到控制台中输出如下:

这就说明了过滤器的运行是依赖于servlet容器,跟springmvc等框架并没有关系。并且,多个过滤器的执行顺序跟xml文件中定义的先后关系有关。

接着清空控制台,并访问:http://www.localhost:8080/test,再次看控制台的输出:

从这个控制台打印输出,就可以很清晰地看到有多个拦截器和过滤器存在时的整个执行顺序了。当然,对于多个拦截器它们之间的执行顺序跟在SpringMVC的配置文件中定义的先后顺序有关。

四、总结

对于上述过滤器和拦截器的测试,可以得到如下结论:

Filter需要在web.xml中配置,依赖于Servlet

Interceptor需要在SpringMVC中配置,依赖于框架

Filter的执行顺序在Interceptor之前,具体的流程见下图

两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。