首页 > 编程知识 正文

spring拦截器过滤器,servlet拦截器的实例

时间:2023-05-06 08:05:11 阅读:173512 作者:4890

删除、转载:屏蔽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支持

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>/** * pom.xml 添加Aop支持 * <dependency> * <groupId>org.springframework.boot</groupId> * <artifactId>spring-boot-starter-aop</artifactId> * </dependency> * * 切片Aspect,既然Spring那么支持AOP,可以拿到原始的HTTP请求和响应的信息, * 也可以拿到你真正处理请求方法的信息,也可以传进参数的那个值。 * * 拦截顺序:filter—>Interceptor-->ControllerAdvice-->@Aspect -->Controller */@Slf4j@Component //表示它是一个Spring的组件@Aspect //表示它是一个切面public class HttpAspect { /** * 通过ProceedingJoinPoint对象的getArgs()我们可以得到传进来的参数。 * 通过ProceedingJoinPoint对象的proceed()我们可以得到拿到切面方法返回值的对象。 * @param pjp * @return * 环绕通知 首先是:包名 然后是: 类名 然后是方法名:方法名 括号内是:参数 */ @Around("execution(* com.learn.jwttoken.controller.*.*(..))") public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable { log.info("HttpAspect handleControllerMethod filter start"); //原始的HTTP请求和响应的信息 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); HttpServletResponse response = attributes.getResponse(); Signature signature = pjp.getSignature(); MethodSignature methodSignature = (MethodSignature)signature; //获取当前执行的方法 Method targetMethod = methodSignature.getMethod(); log.info("当前执行的方法:{}",targetMethod.getName()); //获取参数 Object[] objs = pjp.getArgs(); for (Object obj:objs){ log.info("参数:"+obj); } //获取返回对象 Object object = pjp.proceed(); log.info("获得返回对象 :{}",object); log.info("HttpAspect handleControllerMethod filter end"); return pjp.proceed();//代理方法的返回值 }}

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