#思考
首先我们的token是在登录后才生成的用于交换信息的凭证,在一个应用中也并不是所有的地方都需要进行token验证,比如:首页,登录页等,而一般用到token验证的都是属于后台管理部分(只是举个大概),那么这就产生了一个问题,我们需要在验证token的时候再验证,不需要的时候就不管。
##解决方案一 :拦截器(不推荐)
下面是springmvc的拦截器代码,我采用的是直接实现的handlerInterceptor接口的形式
public class TokenInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//此处实现拦截逻辑
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
可以想象直接在拦截器实现的话,代码量是很大的,而且耦合程度过高,一般情况下是利用request获取请求uri,然后判断该uri是否需要进行Token验证,要的话进行token验证,根据结果判断是否放行,否则直接放行。 当然我们也可以实现多个拦截器,起一个链式调用的作用,不过我这儿就不在赘述了,因为我们有更好的方案。
##解决方案二:Aop(推荐)
关于Aop,我这儿有一个例子:我们可以想象一个食品工厂对不同的食品进行包装,包装上都会打印生产日期,保质期等,尽管是不同的食品,不同的包装,但是它都会打印这些数据,而我们的Aop也类似这样,不同的代码,我们需要统一处理他们执行前或者执行后的一些逻辑代码,而这些逻辑代码都是一样的,我们就把他们封装起来,利用Aop来减少重复的代码。
回归正题,我们这儿利用Spring本身的aop特性来实现Token验证,采用注解的方式实现。
###定义@Token注解
该注解用于标注需要进行Token验证的方法
/*
*Target指定注解的目标为方法级
*Retention指定注解可以在运行时被获取(利用反射)
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {
}
###实现TokenAspect
实现spring的aop,统一处理token验证
@Aspect
public class TokenAspect{
//pjp参数由spring注入
public Object execute(ProceedingJoinPoint pjp) throws Throwable{
MethodSignature ms = (MethodSignature) pjp.getSignature();
//获取当前正在执行的方法
Method method = ms.getMethod();
//判断该方法是否被注解@Token标记
if(method.isAnnotationPresent(Token.class)){
//执行token验证
}
//继续执行方法
return pjp.proceed();
}
}
###配置spring配置文件
此处配置的时候,如果是使用了spring+springMVC的模式下,需要注意spring和springMVC父子容器的问题,如果我们的@Token是标注于Controller(被@Controller或者@RestController注解标记)层的话,由于controller层是由springMVC容器来管理的,若此时我们的TokenAspect是由Spring来管理的话,由于在方法调用的时候,spring无法获取子容器的管理对象,aop就不起作用,自然@Token注解也就失效了。 所以这儿我们的aop也需要配置再springMVC的配置文件中,由SpringMVC来管理。
####springMVC.xml的Aop配置
##结语 上面我只是列出了个大概,具体的业务代码并没有写出来,关于spring的aop可以百度或者google可以了解其更多的作用,当然平常我们也利用其来实现日志的记录。