@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;
}