Token的实现

控制层 返回页面的时候生成唯一的ID并保存到session中(分布式用springsession)
页面提交的时候控制层获取这个ID 查询存在session 就继续运行,并删除,保持只执行一次,不存在就不运行

由于我使用的是 注解+AOP+SpringSession+md5生成token
1注解类

/**
 * Token
 */
//用在方法上
@Target({ElementType.METHOD})  
//被JVN保留
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface ToKen {
    /** 保存 **/  
    public boolean save() default false;  
    /** 刪除 **/  
    public boolean remove() default false; 
}
2 AOP核心代码 后续函数
   boolean save = false;
        for (Method method : methods) {  
            if (method.getName().equals(methodName)) {  
                Class[] clazzs = method.getParameterTypes();  
                if (clazzs!=null&&clazzs.length == arguments.length&&method.getAnnotation(ToKen.class)!=null) {  
                    save = method.getAnnotation(ToKen.class).save();
                    remove = method.getAnnotation(ToKen.class).remove();
                    break;  
                }  
            }  
        }
        
        if (save) {
        	//为每一个控制层配置一个
        	String makeToken = TokenProccessor.makeToken();
        	ModelAndView modelAndView = new ModelAndView();
        	modelAndView.addObject("token",makeToken);
        	request.getSession().setAttribute("token", makeToken);
		}

3生成token函数

 import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

import sun.misc.BASE64Encoder;

public class TokenProccessor {

    /*
      * 
     *1、把类的构造函数私有
     *2、自己创建一个类的对象
     *3、对外提供一个公共的方法,返回类的对象
     */
    private TokenProccessor(){}
    
     private static final TokenProccessor instance = new TokenProccessor();
     
    /**
      * 返回类的对象
      * @return
      */
     public static TokenProccessor getInstance(){
         return instance;
     }

生成Token


     
    /**
     * 生成Token
      * Token:Nv6RRuGEVvmGjB+jimI/gw==
     * @return
      */
     public static String makeToken(){  //checkException
         //  7346734837483  834u938493493849384  43434384
         String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + "";
         
         //数据指纹   128位长   16个字节  md5
         try {
             MessageDigest md = MessageDigest.getInstance("md5");
             byte md5[] =  md.digest(token.getBytes());
            //base64编码--任意二进制编码明文字符   adfsdfsdfsf
            BASE64Encoder encoder = new BASE64Encoder();
            System.out.println(encoder.encode(md5));
             return encoder.encode(md5);
         } catch (NoSuchAlgorithmException e) {
             throw new RuntimeException(e);
         }
     }
 }

4被请求的控制层

String sessiontoken = null;
		try {
			sessiontoken = (String)request.getSession().getAttribute("token");
		} catch (Exception e) {
			// TODO: handle exception
		}
		if(sessiontoken==null) {
			return mv;
		}
		if(!token.equals(sessiontoken)) {
			return mv;
		}
		request.getSession().invalidate();

5跳转控制层

  /**
	 * 註冊
	 * @param request
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "reg")
	@ToKen(save = true)//需要为改请求添加一个唯一的token
	@ArchivesLog(operationType = "請求", operationName = "註冊頁面")
	public ModelAndView reg(HttpServletRequest request)throws Exception {
		ModelAndView modelAndView = new ModelAndView("/views/user/androidregisteredsl.jsp");
		return modelAndView;
	}
	



在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值