弹簧引导设置过滤器,监听器及拦截器的方法

  

  

其实这篇文章算不上是springboot的东西,我们在春天普通项目中也是可以直接使用的

  

<强>设置过滤器:

  

以前在普通项目中我们要在网络上。xml中进行过滤的配置,但是只从servlet 3.0后,我们就可以在直接在项目中进行滤波器的设置,因为她提供了一个注解@WebFilter(在javax.servlet.annotation包下),使用这个注解我们就可以进行滤波器的设置了,同时也解决了我们使用springboot项目没有web . xml的尴尬,使用方法如下所示

        @WebFilter (urlpattern="/* ", filterName=癱orsFilter asyncSupported=true)   公共类CorsFilter实现滤波器{      @Override   FilterConfig FilterConfig公共空init()抛出ServletException {      }      @Override   公共空间的doFilter (ServletRequest ServletRequest, ServletResponse ServletResponse,   FilterChain链)抛出IOException ServletException {   HttpServletResponse响应=(HttpServletResponse) servletResponse;   HttpServletRequest请求=(HttpServletRequest) servletRequest;   链。doFilter (servletRequest servletResponse);   }      @Override   公共空间摧毁(){      }      }      

其实在WebFilter注解中有一些属性我们需要进行设置,比如价值,urlpattern,这两个属性其实都是一样的作用,都是为了设置拦截路径,asyncSupported这个属性是设置配置的过滤器是否支持异步响应,默认是不支持的,如果我们的项目需要进行请求的异步响应,请求经过了过滤器,那么这个过滤器的asyncSupported属性必须设置为真实不然请求的时候会报异常。

  

设置拦截器:

  

编写一个配置类,继承org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter或者org.springframework.web.servlet.config.annotation。WebMvcConfigurationSupport并重写addInterceptors (InterceptorRegistry注册表)方法,其实父类的addInterceptors (InterceptorRegistry注册表)方法就是个空方法。使用方法如下:

        @ configuration   公开课MvcConfig延伸WebMvcConfigurationSupport {      @Override   公共空间addInterceptors (InterceptorRegistry注册表){   InterceptorRegistration=注册中心注册。addInterceptor(新HandlerInterceptor () {   @Override   公共布尔preHandle (HttpServletRequest请求,HttpServletResponse响应对象处理程序){抛出异常   返回true;   }      @Override   公共空白postHandle (HttpServletRequest请求,HttpServletResponse响应对象处理程序,ModelAndView ModelAndView){抛出异常      }      @Override   公共空间afterCompletion (HttpServletRequest请求,HttpServletResponse响应、对象处理程序异常交货){抛出异常      }   });//配置拦截路径   registration.addPathPatterns (“/* *”);//配置不进行拦截的路径   registration.excludePathPatterns(“/静态/* *”);   }   }      

配置监听器:

  

一般我们常用的就是请求级别的javax.servlet.ServletRequestListener和会话级别的javax.servlet.http。HttpSessionListener、下面以ServletRequestListener为例,编写一个类实现ServletRequestListener接口并实现requestInitialized (ServletRequestEvent事件)方法和requestDestroyed (ServletRequestEvent事件)方法,在实现类上加上@WebListener (javax.servlet.annotation包下),如下所示

        @WebListener   公共类RequestListener实现ServletRequestListener {      @Override   公共空间requestDestroyed (ServletRequestEvent行为){   System.out.println(“请求结束”);   }      @Override   公共空间requestInitialized (ServletRequestEvent行为){   System.out.println(“请求开始”);   }   }      

这样每一个请求都会被监听的到,在请求处理前equestInitialized (ServletRequestEvent事件)方法,在请求结束后调用requestDestroyed (ServletRequestEvent事件)方法,其实在春天中有一个非常好的例子,就是org.springframework.web.context.request.RequestContextListener类

        公共类RequestContextListener实现ServletRequestListener {      私有静态最终字符串REQUEST_ATTRIBUTES_ATTRIBUTE=RequestContextListener.class.getName () +“.REQUEST_ATTRIBUTES”;         @Override   公共空间requestInitialized (requestEvent ServletRequestEvent) {   如果(! (requestEvent.getServletRequest () instanceof HttpServletRequest)) {   把新的IllegalArgumentException (   “请求不是一个HttpServletRequest:”+ requestEvent.getServletRequest ());   }   HttpServletRequest请求=(HttpServletRequest) requestEvent.getServletRequest ();   ServletRequestAttributes属性=new ServletRequestAttributes(请求);   请求。setAttribute (REQUEST_ATTRIBUTES_ATTRIBUTE、属性);   LocaleContextHolder.setLocale (request.getLocale ());   RequestContextHolder.setRequestAttributes(属性);   }      @Override   公共空间requestDestroyed (requestEvent ServletRequestEvent) {   ServletRequestAttributes属性=零;   对象reqAttr=requestEvent.getServletRequest () .getAttribute (REQUEST_ATTRIBUTES_ATTRIBUTE);   如果(reqAttr instanceof ServletRequestAttributes) {   属性=(ServletRequestAttributes) reqAttr;   }   RequestAttributes threadAttributes=RequestContextHolder.getRequestAttributes ();   如果(threadAttributes !=null) {//我们多半在原始请求线程…   LocaleContextHolder.resetLocaleContext ();   RequestContextHolder.resetRequestAttributes ();   如果属性==零,,threadAttributes instanceof ServletRequestAttributes) {   属性=(ServletRequestAttributes) threadAttributes;   }   }   如果(属性!=null) {   attributes.requestCompleted ();   }   }      }

弹簧引导设置过滤器,监听器及拦截器的方法