前言:
最近在给训练营团队整合springboot框架的时候,突发奇想,幻想着让自己的功能尽量用最少的代码实现更多功能。
在规划登录拦截器的模块时,想起了用注解可以实现少写代码,并且让开发变得更方便,更简洁;加下来就阐述一下我的程序流程图:
登录拦截器实现HandlerInterceptorAdapter接口,并且重写preHandle方法,在里面编写拦截器,代码如下:
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String ticket= request.getSession().getAttribute("userTicket")==null?null: request.getSession().getAttribute("userTicket").toString();
if(!StringUtils.isEmpty(ticket)){
return true;
}
if(!handler.getClass().isAssignableFrom(HandlerMethod.class)){
return true;
}
HandlerMethod handlerMethod = (HandlerMethod) handler;
final Method method = handlerMethod.getMethod();
final Class<?> clazz = method.getDeclaringClass();
if(clazz.isAnnotationPresent(ToAuth.class) || method.isAnnotationPresent(ToAuth.class)){
if(StringUtils.isEmpty(request.getAttribute(Constants.USER_SESSION_KEY))){
logger.info("用户尚未登录,即将跳转到登录页面");
response.sendRedirect(request.getContextPath() + "/login");
return false;
}else{
return true;
}
}else{
logger.info(request.getRequestURI()+"接口免登录");
}
return true;
}
以上的代码就实现了对接口的拦截,接下来展示一下ToAuth注解的代码:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface ToAuth {
}
以上的代码就定义了一个名称为ToAuth的注解,该注解可以用在类和方法下,如果用在类,那就说明该类下的所有方法都需要登录才能调用,如果用在方法,说明该方法需要登录才能调用。
接下来需要写一个MVC的配置java类,把拦截器加载进去,一下是配置文件加载拦截器的代码
...
@Autowired
LoginOperInterceptor loginOperInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginOperInterceptor).addPathPatterns("/**");
}
...
最后,自定义注解的调用方式吧
演示:
以下是不声明@ToAuth的效果
以下是声明@ToAuth的效果