首页 > 编程知识 正文

javaweb过滤器和拦截器,springboot拦截器不生效

时间:2023-05-06 12:27:12 阅读:176429 作者:769

上一篇文章讨论了过滤器的定义,但是相对简单。 过滤器是属于servlet范畴的API,与Spring关系不大。

在Web开发中,除了使用过滤器过滤Web请求外,还可以使用Spring提供的handler解释器。

HandlerInterceptor的功能与过滤器类似,但可以在响应request之前、响应request之后、视图渲染之前和全部完成之后提供更好的控制。 虽然不能在拦截器中更改request的内容,但是可以通过抛出异常(或返回false )来暂停request的执行。

实现userroleauthorizationinter的拦截器如下。

转换器服务处理器

CORS解释器

本地更改解释器

PathExposingHandlerInterceptor

rsourceurlproviderexposinginterceptor

ThemeChangeInterceptor

uritemplatevariableshandlerinterceptor

用户自动化解释器

其中,LocaleChangeInterceptor和ThemeChangeInterceptor比较常用。

构成拦截器也很简单。 Spring为什么提供基类WebMvcConfigurerAdapter? 只需重写addInterceptors方法来添加注册拦截器即可。

实施自定义阻止程序只需要三个步骤。

1、创建自己的拦截器类,实现HandlerInterceptor界面。

2、创建Java类继承WebMvcConfigurerAdapter并重写addInterceptors方法。

2、实例化我们定制的拦截器,手动将图像添加到拦截器链(添加到addInterceptors方法)。

PS :本文重点介绍了如何在Spring-Boot中使用拦截器。 关于拦截器的原理,请参照资料。

代码示例:

MyInterceptor1.java

package org.spring boot.sample.interceptor; import javax.servlet.http.http servlet request; import javax.servlet.http.http无servlet轮询; importorg.spring framework.web.servlet.handler interceptor; importorg.spring framework.web.servlet.modelandview; /**自定义阻止程序1**@authormldxz(365384722 ) @ my blog http://blog.csdn.net/catoop/* @ create 2016年1月7日(/publicclassmyinterceptor1implementshandlerinterceptor { @ overridepublicbooleanprehandle (httpservletrequestrequest, http servlet object handler (throws exception (system.out.println ) ) myinterceptor1在请求处理之前调用(在Controller方法调用之前) 返回真; 返回true后才继续执行宕机,返回false取消当前请求} @ overridepublicvoidposthandle (httpservletrequestrequest,HttpServletResponse response ) 在object modelandview modelandview (throws exception ) system.out.println (' my interceptor1)请求处理后调用,但在渲染视图之前} @ overridepublicvoidaftercompletion (httpservletrequestrequest,HttpServletResponse response,Object handler, 在整个请求结束后调用exceptionex(throwsexception ) system.out.println (' my interceptor1),在DispatcherServlet渲染相应的视图后

yInterceptor2.java

package org.springboot.sample.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;/** * 自定义拦截器2 * * @author mldxz(365384722) * @myblog http://blog.csdn.net/catoop/ * @create 2016年1月7日 */public class MyInterceptor2 implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println(">>>MyInterceptor2>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");return true;// 只有返回true才会继续向下执行,返回false取消当前请求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println(">>>MyInterceptor2>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println(">>>MyInterceptor2>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");}}

MyWebAppConfigurer.java

package org.springboot.sample.config;import org.springboot.sample.interceptor.MyInterceptor1;import org.springboot.sample.interceptor.MyInterceptor2;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configurationpublic class MyWebAppConfigurer extends WebMvcConfigurerAdapter { // 这里注意,在spring 5.0之后 WebMvcConfigurerAdapter 过时了,可以直接实现接口 implements WebMvcConfigurer(下面实现的方法是一样的)@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 多个拦截器组成一个拦截器链// addPathPatterns 用于添加拦截规则// excludePathPatterns 用户排除拦截registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");super.addInterceptors(registry);}}

然后在浏览器输入地址: http://localhost:8080/index 后,控制台的输出为:

>>>MyInterceptor1>>>>>>>在请求处理之前进行调用(Controller方法调用之前)>>>MyInterceptor2>>>>>>>在请求处理之前进行调用(Controller方法调用之前)>>>MyInterceptor2>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)>>>MyInterceptor1>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)>>>MyInterceptor2>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)>>>MyInterceptor1>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)

根据输出可以了解拦截器链的执行顺序(具体原理介绍,大家找度娘一问便知)

最后强调一点:只有经过DispatcherServlet 的请求,才会走拦截器链,我们自定义的Servlet 请求是不会被拦截的,比如我们自定义的Servlet地址 http://localhost:8080/xs/myservlet 是不会被拦截器拦截的。并且不管是属于哪个Servlet 只要复合过滤器的过滤规则,过滤器都会拦截。

最后说明下,我们上面用到的 WebMvcConfigurerAdapter 并非只是注册添加拦截器使用,其顾名思义是做Web配置用的,它还可以有很多其他作用,通过下面截图便可以大概了解,具体每个方法都是干什么用的,留给大家自己研究(其实都大同小异也很简单)。

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