springBoot 配置拦截器
如何配置拦截器
拦截器设置容易呈现的问题
如何勾销拦挡操作
实例:登录验证
如何配置拦截器
step1: 自定义拦截器
/** * 自定义拦截器 */public class MyInterceptor implements HandlerInterceptor { private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class); /** * 在申请匹配controller之前执行,返回true才行进行下一步 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return false; } /** * 曾经执行完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 { } /** * 视图也渲染完了,此时我能够做一些清理工作了 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}
step2:配置拦截器
@Configurationpublic class MyInterceptorConfig extends WebMvcConfigurationSupport { @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 拦挡所有内容:/** 拦挡局部内容:/admin/** super.addInterceptors(registry); }}
拦截器设置容易呈现的问题
动态资源被拦挡
MyInterceptorConfig 继承 WebMvcConfigurationSupport类时,会导致resources/static下的动态资源也被拦挡,如果咱们不想动态资源被拦挡,能够尝试以下两种办法。
/*** 在MyInterceptorConfig中重写addResourceHandlers办法,从新指定动态资源* 举荐在前后端拆散时应用,后盾不须要拜访动态资源** @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**").addResourceLocations( "classpath:/static/"); super.addResourceHandlers(registry);}
/** * 将MyInterceptorConfig类由继承WebMvcConfigurationSupport改为实现WebMvcConfigurer * 举荐在非前后端拆散时应用,后盾须要拜访动态资源 * */@Configurationpublic class MyInterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 拦挡所有内容:/** 拦挡局部内容:/admin/** }}
如何勾销拦挡操作
step1:自定义注解
/** * 自定义注解用来指定某个办法不必拦挡 */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface UnInterception {}
step2:批改拦截器MyInterceptor中的preHandle办法
/** * 在申请匹配controller之前执行 * @param request * @param response * @param handler * @return * @throws Exception */@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { UnInterception unInterception = method.getAnnotation(UnInterception.class); if(null != unInterception) { logger.info("不须要拦挡,能够执行"); return true; } // 返回true才会执行办法,返回false不会执行 return false;}
step3:在不须要拦挡的controller上加上UnInterception注解
@Controller@RequestMapping("/interceptor")public class InterceptorController { @UnInterception @RequestMapping("/test") public String test() { return "hello"; }}
实例:登录验证
用拦截器实现一个登录验证性能
step1:自定义拦截器
import com.kimmel.course13.annotation.UnInterception;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.lang.reflect.Method;/** * 自定义拦截器 */public class MyInterceptor implements HandlerInterceptor { private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class); /** * 在申请匹配controller之前执行 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); String methodName = method.getName(); // 判断用户有没有登录,个别登录之后的用户都有一个对应的token UnInterception unInterception = method.getAnnotation(UnInterception.class); String token = request.getParameter("token"); if (null == token || "".equals(token)) { logger.info("用户未登录,没有权限执行{}请登录", methodName); return false; } // 返回true才会执行办法,返回false不会执行 return true; } /** * 曾经执行完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 { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); String methodName = method.getName(); logger.info("曾经执行完{}了,然而还没有进入视图渲染", methodName); } /** * 视图也渲染完了,此时我能够做一些清理工作了 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("视图也渲染完了,此时我能够做一些清理工作了"); }}
step2:配置拦截器
import com.kimmel.course13.Interceptor.MyInterceptor;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;@Configurationpublic class MyInterceptorConfig extends WebMvcConfigurationSupport { @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 拦挡所有内容:/** 拦挡局部内容:/admin/** super.addInterceptors(registry); } /** * 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相干内容会生效。 须要从新指定动态资源 * * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { 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(registry); }}
step3:自定义测试controller
@Controller@RequestMapping("/interceptor")public class InterceptorController { @RequestMapping("/test") public String test() { return "hello"; }}
step4:测试
进入浏览器,输出http://localhost:8080/interceptor/test后果:无奈进入,日志:用户未登录,没有权限执行 test 请登录进入浏览器,输出http://localhost:8080/interceptor/test?token=1后果:胜利进入hello.html