其实这篇文章算不上是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 (); } } }弹簧引导设置过滤器,监听器及拦截器的方法