spring过滤器、拦截器


在这里插入图片描述
在这里插入图片描述

一、二者对比

  1. 实现原理不同:过滤器是基于函数回调;拦截器是基于java的反射机制的。

  2. 使用范围不同:过滤器依赖与servlet容器,拦截器不依赖与servlet容器(拦截器是Spring容器内的,是Spring框架支持的)。

    因为Filter是Servlet规范中规定的,所有只能用于WEB中;而拦截器既可以用于WEB,也可以用于Application、Swing中。

  3. 触发时机不同:过滤器是在请求进入tomcat容器后,但请求进入servlet之前进行预处理的;请求结束返回也是,是在servlet处理完后,返回给前端之前。

    拦截器可以深入到方法的前后、异常抛出前后等更深层次的程度作处理(这里也在一定程度上论证了拦截器是利用java的反射机制实现的),所以在Spring框架中,优先使用拦截器。

  4. 拦截的请求范围不同:过滤器则可以对几乎所有的请求起作用;拦截器只能对action请求起作用。

  5. 注入Bean情况不同:拦截器先于ApplicationContext加载,所以拦截器无法注入Spring容器管理的bean。

    解决办法:拦截器不使用@Component加载,改为使用@Configuration+@Bean加载。

  6. 控制执行顺序不同:过滤器用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小级别越高越先执行;拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。

    注意:拦截器有前置处理和后置处理,前置处理越线,后置处理就越后。

二、过滤器

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。

其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可以进行逻辑判断,如用户是否已经登录、有没有权限访问该页面等等工作,它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关的请求,只有当你的web应用停止或重新部署的时候才能销毁。

Spring的web包中中提供有很多过滤器,这些过滤器位于org.springframework.web.filter。

过滤器放在web资源之前,可以在请求抵达它所应用的web资源(可以是一个Servlet、一个Jsp页面,甚至是一个HTML页面)之前截获进入的请求,并且在它返回到客户之前截获输出请求。

  • 过滤器:用来拦截请求,处于客户端与被请求资源之间,目的是重用代码。
  • 过滤链:在web.xml中哪个过滤器先配置,哪个就先调用。在filter中也可以配置一些初始化参数。

Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。

过滤器的分类

  • 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。

  • 日志Filter:详细记录某些特殊的用户请求。

  • 负责解码的Filter:包括对非标准编码的请求解码。

  • 能改变XML 内容的XSLTFilter等。

过滤器的作用

  • 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。

  • 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。

过滤器的实现方式

  1. 直接实现Filter,这一类过滤器只有CompositeFilter;

  2. 继承抽象类GenericFilterBean,该类实现了javax.servlet.Filter,这一类的过滤器只有一个,即DelegatingFilterProxy;

  3. 继承抽象类OncePerRequestFilter,该类为GenericFilterBean的直接子类,这一类过滤器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;

  4. 继承抽象类AbstractRequestLoggingFilter,该类为OncePerRequestFilter的直接子类,这一类过滤器包括CommonsRequestLoggingFilter、Log4jNestedDiagnosticContextFilter和ServletContextRequestLoggingFilter。

三、拦截器

SpringMVC 中的Interceptor 拦截器的主要作用就是拦截用户的 url 请求,并在执行 handler 方法的前中后加入某些特殊请求,比如通过它来进行权限验证,或者是来判断用户是否登陆。

拦截器的实现方式

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式:

  1. 定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter

  2. 实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。

四、二者总结

过滤器:用于属性甄别,对象收集(不可改变过滤对象的属性和行为)

拦截器:用于对象拦截,行为干预(可以改变拦截对象的属性和行为)

  • 18
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值