删除、转载:屏蔽SpringBoot的3种http请求方式Filter、interceptor和aop
如何阻止SpringBoot的三个http请求:过滤器、解释器和aop。
这三种监听方式的监听顺序为: filter-interceptor-controller advice@ aspect-- controller;
这三种方式的区别:
1 .过滤器过滤器可以获取原始HTTP请求和响应的信息,但不能获取实际处理请求方法的信息,即方法信息。
2 .拦截器Interceptor可以获得原始HTTP请求和响应的信息,也可以获得实际处理请求的方式的信息,但无法获得传递给参数的值。
3 .切片辅助。 因为spring支持的AOP越多,所以既可以获得原始HTTP请求和响应的信息,也可以获得真正处理请求的方式的信息,还可以获得参数的相应值。
第一种方法:过滤器
实现过滤器接口
/* * header过滤器token * *过滤器Filter可以获得关于自定义过滤器*请求的原始HTTP请求和响应的信息。 *但是,您无法获得实际处理请求方法的信息,即方法的信息。 * * @Component注释会让拦截器注入Bean。 由此,启用拦截器* @WebFilter部署拦截规则* *拦截顺序: filter-interceptor---controller advice-- @ aspect-- @ slf4j @ component filtername=' tokenauthorfilter ' ) publicclasstokenfilterimplementsfilter { @ overridepublicvoidinit () ) filterconfigfilterconit } @ overridepublicvoiddofilter (servletrequestrequest,ServletResponse response,filter chain ) throws IOException,servet chain.dofilter(request,response ); //到下一个链} @Override public void destroy () log.info ) (Tokenfilterdestroy ); }第二种方式:拦截器拦截器
实现HandlerInterceptor接口并将其部署到Spring。
/** *定制拦截器*定制拦截器后,必须将其放入Spring * *拦截器拦截器中。 可以获得原始HTTP请求和响应的信息。 *您还可以获得实际处理请求方法的信息,但无法获得传递给参数的值。 *监听顺序: filter-interceptor---- controller advice---aspect---controller */@ slf4j @ componentpublicclasstoker @paramhandler*@returnfalse表示不执行postHandle方法,true表示postHandle方法* @ throws exception */@ overridepublicboleane object handler (throws exception (log.info ) ) Tokeninterceptorprehandle,' '表示要运行HttpServletResponse response string token=request.get header (' token ); log.info (Tokeninterceptorprehandletoken : )、token ); log.in
fo("Token Interceptor preHandle uri {}",request.getRequestURL().toString()); //spring boot 2.0对静态资源也进行了拦截,当拦截器拦截到请求之后, // 但controller里并没有对应的请求时,该请求会被当成是对静态资源的请求。 // 此时的handler就是 ResourceHttpRequestHandler,就会抛出上述错误。 if (handler instanceof HandlerMethod){ HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); log.info("Token Interceptor preHandle getMethod {}",method.getName()); }else if(handler instanceof ResourceHttpRequestHandler){//静态资源 ResourceHttpRequestHandler resourceHttpRequestHandler = (ResourceHttpRequestHandler) handler; log.info("Token Interceptor preHandle getMethod {}",resourceHttpRequestHandler.getMediaTypes()); } //false则表示不执行postHandle方法,不执行下一步chain链,直接返回response return true; } /** * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) * preHandle方法处理之后这个方法会被调用,如果控制器Controller出现了异常,则不会执行此方法 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("Token Interceptor postHandle"); } /** * 不管有没有异常,这个afterCompletion都会被调用 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("Token Interceptor afterCompletion"); }}配置进spring
/** * TokenInterceptor 自定义拦截器后,需要配置进Spring * 也可以mapping,跨域设置 */@Slf4j@Configurationpublic class TokenConfig implements WebMvcConfigurer { @Autowired TokenInterceptor tokenInterceptor; /** * 添加拦截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { log.info("TokenConfig addInterceptors tokenInterceptor"); registry.addInterceptor(tokenInterceptor) .addPathPatterns("/**")//指定该类拦截的url .excludePathPatterns( "/static/**");//过滤静态资源 } /** * 如果实现了Filter跨域拦截,这个跨域无效 * 拦截器实现 跨域支持 * @param registry */ @Override public void addCorsMappings(CorsRegistry registry) { log.info("TokenConfig addInterceptors addCorsMappings"); registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "DELETE", "PUT","OPTIONS","HEAD") .allowedHeaders("*") .maxAge(3600); } }第三种方式 : aop拦截
pom.xml 添加Aop支持