springmvc下的Token设计

1.第一次开发前后端分离项目,后台使用java SpringMvc,因为前端使用ajax,存在跨域问题,所以后台使用token的方式设计接口安全,直接上想法和代码。采用自定义的注解进行Token认证。直接上代码。

 创建自定义注解 UserAccess,

代码:
 /**
  *  自定义注解  验证Token
  * @author Administrator
  *
  */
@Target({ElementType.METHOD,ElementType.TYPE})  //目标是方法
@Retention(RetentionPolicy.RUNTIME)  //注解会在class中存在,运行时可通过反射获取
@Inherited
@Documented //文档生成时,该注解将被包含在javadoc中,可去掉


public @interface UserAccess {
String desc() default "身份和安全验证开始...";
}

2.使用spring的Aop编程

在spring.xml上开启    

   <!-- 开启Aop注解  -->
    <aop:aspectj-autoproxy/>

   @Pointcut("@annotation(xxxxx.xxxxx.UserAccess)")
   public  void TokenAuthbefor(){

   } 

           @Around("TokenAuthbefor()")
public @ResponseBody
Object beforeAdevice(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("before");
// 获取拦截的请求参数
Object[] args = joinPoint.getArgs();
 
HttpServletRequest request=(HttpServletRequest)args[0];
 
String token=request.getParameter("token");
System.out.println("前置通知  token:"+token);
// 对token做认证   可以考虑使用Redis 做为缓存
String a =  redisTemplate.opsForValue().get(token);
System.out.println("a="+a);
String msg = "";
if(token!= null){
if(null == redisTemplate.opsForValue().get(token)){
msg ="1" ;
throw new  AcessTokenException("110");
}else{
joinPoint.proceed();
msg = "2";
String username = redisTemplate.GET(token);
redisTemplate.opsForValue().set(token, username, 1, TimeUnit.MINUTES);
}  
}else{
  msg ="1" ;
  throw  new AcessTokenException("110");
}
return msg;
}

    这里使用了自定义异常AcessTokenException自己设置code,其中redis存放token:username,缓存可以自己选择。

3.自定义异常

public class AccessTokenExceptionride implements  HandlerExceptionResolver  {


/**
* @param ex  accesstoken系统抛出的异常
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
//handler就是处理器适配器要执行Handler对象(只有method)
ModelAndView mv = new ModelAndView();
if(ex  instanceof AcessTokenException) {
    FastJsonJsonView view = new FastJsonJsonView();  
            Map<String, Object> attributes = new HashMap<String, Object>();
            attributes.put("code", ex.getMessage());  
            // 110 表示token不存在或者失效
            view.setAttributesMap(attributes);  
            mv.setView(view);   
}
return mv;
}
}

继承
HandlerExceptionResolver,定义全局异常解析器AccessTokenExceptionride,至于为什么可以自己去搜一下其他的博客.

4.测试,添加自定义接口

@UserAccess
@RequestMapping("/newtest")
public void  newtest(HttpServletRequest request){
String a= request.getParameter("username");
String b = request.getParameter("password");
String c=  request.getParameter("jac");
System.out.println(c);
System.out.println(b);
System.out.println(a);
}

在1分钟后,token失效,访问这个接口,返回自定义异常的code.


 5.至于token是生成,网上一大堆,不把该代码贴出来,在登录成功后给客户端一个token,然后将token放在url或者headershan,其中一些借鉴他人的实现想法


猜你喜欢

转载自blog.csdn.net/koyi0000/article/details/78712326