springBoot配置拦截器拦截器设置容易问题如何取消拦截器操作示例:登录验证如何配置拦截器step1:自定义拦截器/***自定义拦截器*/publicclassMyInterceptorimplementsHandlerInterceptor{privatestatic最终记录器记录器=LoggerFactory.getLogger(MyInterceptor.class);/***在request匹配controller前执行,返回true继续下一步*@paramrequest*@paramresponse*@paramhandler*@return*@throwsException*/@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponse响应,对象处理程序)抛出异常{returnfalse;}/***controller已经执行,但是还没有进入视图渲染*@paramrequest*@paramresponse*@paramhandler*@parammodelAndView*@throwsException*/@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{}/***视图也被渲染了,此时我可以做一些清理*@paramrequest*@paramresponse*@paramhandler*@paramex*@throwsException*/@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{}}step2:配置拦截器@ConfigurationSextvConfigpublicclassMIntergfMyInterceptor@OverrideprotectedvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newMyInterceptor()).addPathPatterns("/**");//拦截所有内容:/**拦截部分内容:/admin/**super.addInterceptors(registry);}}拦截器设置很可能会导致静态资源被拦截。MyInterceptorConfig继承WebMvcConfigurationSupport类,会导致resources/static下的静态资源被拦截。如果我们不希望静态资源被拦截,可以尝试以下两种方法/***重写MyInterceptorConfig中的addResourceHandlers方法,重新指定静态资源*建议在前后端分离,后台不需要访问静态资源时使用**@paramregistry*/@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");super.addResourceHandlers(registry);}/***将MyInterceptorConfig类从继承WebMvcConfigurationSupport改为实现WebMvcConfigurer*推荐前后端不分离时使用,后台需要访问静态资源**/@Configurationpublic类MyInterceptorConfig实现WebMvcConfigurer{@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newMyInterceptor()).addPathPatterns("/**");//拦截全部内容:/**拦截部分内容:/admin/**}}如何取消拦截操作step1:自定义注解/***自定义注解用于指定不拦截的方法*/@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceUnInterception{}step2:修改拦截器MyInterceptor中的preHandle方法/***在request匹配controller前执行*@paramrequest*@paramresponse*@paramhandler*@return*@throwsException*/@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{UnInterceptionunInterception=method.getAnnotation(UnInterception.class);}if(nullInterpce!info("不需要拦截,可以执行");returntrue;}//返回true执行方法,returnfalse不会执行returnfalse;}step3:添加UnInterception注解@Controller@给不需要拦截的控制器RequestMapping("/interceptor")publicclassInterceptorController{@UnInterception@RequestMapping("/test")publicStringtest(){return"hello";}}例子:登录验证拦截器实现了一个登录验证功能step1:自定义拦截器servlet.HandlerInterceptor;导入org.springframework.web.servlet.ModelAndView;导入rtjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.lang.reflect.Method;/***自定义拦截器*/publicclassMyInterceptorimplementsHandlerInterceptor{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(MyInterceptor.class);/***在请求匹配控制器之前执行*@paramrequest*@paramresponse*@paramhandler*@return*@throwsException*/@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{HandlerMethodhandlerMethod=(HandlerMethod)处理程序;方法method=handlerMethod.getMethod();StringmethodName=method.getName();//判断用户是否登录,登录后一般有对应的用户tokenUnInterceptionunInterception=method.getAnnotation(UnInterception.class);Stringtoken=request.getParameter("token");if(null==token||"".equals(token)){logger.info("用户未登录,无权限执行{},请登录",methodName);返回假;}//该方法只在返回true时执行,返回false则不执行returntrue;}/***执行已经完成controllerup了,但是还没有进入视图渲染*@paramrequest*@paramresponse*@paramhandler*@parammodelAndView*@throwsException*/@OverridepublicvoidpostHandle(HttpServletRequest请求,HttpServletResponse响应,对象处理程序,ModelAndViewmodelAndView)throwsException{HandlerMethodhandlerMethod=(HandlerMethod)handler;方法method=handlerMethod.getMethod();StringmethodName=method.getName();logger.info("{}已经执行,但是还没有进入视图渲染",methodName);}/***视图也被渲染了,此时我可以做一些清理工作*@paramrequest*@paramresponse*@paramhandler*@paramex*@throwsException*/@OverridepublicvoidafterCompletion(HttpServletRequest请求,HttpServletResponse响应,Objecthandler,Exceptionex)throwsException{logger.info("视图渲染完成,现在我可以做一些清理工作了");}}step2:配置拦截器....addPathPatterns("/**");//拦截所有内容:/拦截部分内容:/admin/**super.addInterceptors(registry);}/***发现如果继承WebMvcConfigurationSupport,yml中配置的相关内容会失效需要重新指定静态资源**@paramregistry*/@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");super.addResourceHandlers(注册表);}}step3:自定义测试控制器@Controller@RequestMapping("/interceptor")publicclassInterceptorController{@RequestMapping("/test")publicStringtest(){return"hello";}}step4:测试进入浏览器,输入http://localhost:8080/interceptor/test结果:无法进入,日志:用户未登录,无权限执行测试请登录进入浏览器,输入http://localhost:8080/interceptor/test?token=1结果:成功进入hello.html
