SpringBoot中如何优雅的使用拦截器
- 当前痛点
private static final String[] LOGIN_EXCLUED_LOCATIONS = { "classpath:/static/", "/forgot_password", "/change_password", "/sign_up", "/tool/*", "/register", "/login", "/logout", "/404", "/403", "/500" }; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new UserLoginInterceptor()).addPathPatterns("/**").excludePathPatterns(LOGIN_EXCLUED_LOCATIONS); }
如上所示:痛点有二:1、对于开发测试来说,非常不友好。2、相对于SpringBoot来说,这种直接将配置写在代码中的也是不提倡的
SO,解决方案:
利用自定义注解,灵活的控制接口的权限。
直接上代码:
controller:
@RestController public class TestController { @IPass @RequestMapping("/add") public String add(){ return "add success"; } @RequestMapping("/delete") public String delete(){ return "delete success"; } @RequestMapping("/query") public String query(){ return "query"; } }
注解:
@Retention(RetentionPolicy.RUNTIME) public @interface IPass { Auth value() default Auth.PASS; enum Auth{ PASS, FILTER } }
SpingBoot拦截器配置
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/**"); } }
拦截器:
public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod handlerMethod = (HandlerMethod) handler; IPass methodAnnotation = handlerMethod.getMethodAnnotation(IPass.class); return methodAnnotation != null && methodAnnotation.value().equals(IPass.Auth.PASS); } }
上述代码通过注解IPass来指明当前被标注接口是否被拦截;
2018-11-21 记