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 记

posted @ 2018-11-22 18:37  田野里的放牛娃  阅读(1168)  评论(0编辑  收藏  举报