控制层 返回页面的时候生成唯一的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;
}