自定义注解标注受保护的资源访问,当要访问的url被标注了@LoginRequied的时候就变成了一个受保护的资源,须要用户登陆或者更进一步须要用户拥有某个权限才能操做。本项目使用的springboot2.0
话很少说直接上代码。spring
注解类:LoginRequiredspringboot
//省略import /** * 拦截声明 */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface LoginRequired { boolean value() default true; }
如今有了咱们想要使用的注解 下一步就是怎么去实现它,由于要对http请求进行拦截因此咱们在这能够直接设置一个拦截器拦截全部的请求,当看到被拦截的请求有@LoginRequired注解的时候,咱们再去判断是否符合条件。
下面咱们来实现这个拦截器。ide
//省略import /** * 自定义的一个登陆拦截器 */ public class LoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { LoginRequired loginRequired = findAnnotation((HandlerMethod) handler, LoginRequired.class); //没有声明须要权限,或者声明不验证权限 if (loginRequired == null) { return true; } else { String token = request.getHeader(“token”);//获得token if (StringUtils.isEmpty(token)) { token = request.getParameter(“token”); } //在这里实现本身的权限验证逻辑 if (!StringUtils.isEmpty(token)) {//若是验证成功返回true(这里直接写false来模拟验证失败的处理) return true; } else {//若是验证失败 response.getWriter().write(new Result(HttpStatusConstant.REQUIRED_LOGIN).toJSONString()); return false; } } } else { return true; } } private T findAnnotation(HandlerMethod handler, Class annotationType) { T annotation = handler.getBeanType().getAnnotation(annotationType); if (annotation != null) return annotation; return handler.getMethodAnnotation(annotationType); } }
preHandle函数表示在以前处理,用到这里就是在访问发生以前触发,咱们利用反射找到LoginRequired 而后进行处理。这样全部准备工做就作完了。可是咱们想要在spring中使用它还须要告诉spring我写了一个拦截器。函数
因此咱们再新建一个InterceptorConfig类:ui
//ignore import @Configuration public class InterceptorConfig extends WebMvcConfigurerAdapter { @Bean public LoginInterceptor loginInterceptor(){ return new LoginInterceptor(); } /** * 注册当前的interceptor * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor()); } }
大功告成。剩下的就是在你Controller中须要登陆验证的请求的方法上面添加@LoginRequired注解了。url