@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {
/** 是否要将TOKEN值保存在session中 */
boolean save() default false;
/** 是否删除session中保存的TOKEN值 */
boolean remove() default false;
}
方法上加上注解
@Token(save=true)
public void methoda(){
...
}
@Token(remove=true)
public void methodb(){
...
}
// 取得方法的TOKEN注解
Token annotation = method.getAnnotation(Token.class);
if (annotation != null) {
// 先验证,再保存(为了在同一个方法中进行保存/验证操作)
if (annotation.remove()) {
if (isRepeatSubmit(request)) {
throw new SysException("TOKEN验证失败,请保存后,再进行TOKEN的验证。");
}
request.getSession(false).removeAttribute(TOKEN_KEY_NAME);
}
// TOKEN的保存
if (annotation.save()) {
request.getSession(false).setAttribute(TOKEN_KEY_NAME, UUID.randomUUID().toString());
}
}
/**
* 验证是否为重复提交内容。
*
* @param request Request对象
* @return true:重复提交; flase:不是重复提交
* @exception Exception 异常
*/
private boolean isRepeatSubmit(HttpServletRequest request) {
String serverToken = (String) request.getSession(false).getAttribute(TOKEN_KEY_NAME);
if (serverToken == null) {
return true;
}
String clinetToken = request.getParameter(TOKEN_KEY_NAME);
if (clinetToken == null) {
return true;
}
if (!serverToken.equals(clinetToken)) {
return true;
}
return false;
}