Java TokenProcessor令牌校验工具类
简介
Java TokenProcessor令牌校验工具类是一种防止重复提交的实现方式。当用户请求一个需要重复提交的页面时,我们需要判断用户是否重复提交或者在多次刷新保存过程中多次提交。这时我们可以使用 TokenProcessor 工具类来生成 token,将其储存到会话中或者隐藏表单中以供验证用户提交数据的合法性。
使用方法
引入依赖
在项目的 pom.xml 文件中引入以下依赖:
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
编写 TokenProcessor 工具类
TokenProcessor 工具类需要实现生成 token 和验证 token 两个方法,代码如下:
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.UUID;
public class TokenProcessor {
private static final Log log = LogFactory.getLog(TokenProcessor.class);
/**
* 生成 token 并放入 session 中
* @param request HttpServletRequest 对象
* @return token 字符串
*/
public static String generateToken(HttpServletRequest request){
String token = null;
try {
HttpSession session = request.getSession(false);
if (session!=null){
token = UUID.randomUUID().toString();
session.setAttribute("token",token);
}
} catch (Exception e) {
log.error("generate token failded: ",e);
}
return token;
}
/**
* 校验 token 是否一致
* @param request HttpServletRequest 对象
* @param token token 字符串
* @return true 表示校验通过,false 表示校验不通过
*/
public static boolean isValidate(HttpServletRequest request, String token){
HttpSession session = request.getSession(false);
if (session == null){
return false;
}
String sessionToken = (String) session.getAttribute("token");
if (StringUtils.isEmpty(sessionToken)){
return false;
}
if (!sessionToken.equals(token)){
return false;
}
//验证通过后销毁token
session.removeAttribute("token");
return true;
}
}
在页面中新增 Token 标签
在表单中新增一个隐藏的 input 标签,用于保存 token 字符串,代码如下:
<form action="http://xxxxxxx" method="POST">
<input type="hidden" name="token" value="${token}">
<!--其他表单项-->
<button type="submit">提交</button>
</form>
向用户端生成 Token
在 Controller 中生成 token 字符串,并保存至会话中供后续验证,代码如下:
@Controller
@RequestMapping(value = "/xx")
public class ExampleController {
@RequestMapping(value = "/example",method = RequestMethod.GET)
public String example(HttpServletRequest request){
String token = TokenProcessor.generateToken(request);
request.setAttribute("token",token);
return "/example.jsp";
}
@RequestMapping(value = "doSomething",method = RequestMethod.POST)
public String doSomething(HttpServletRequest request,@RequestParam String token){
//校验token是否有效
boolean isValidate = TokenProcessor.isValidate(request,token);
if (isValidate){
//处理业务代码
}else {
//处理异常情况
}
return "redirect:/xx/example";
}
}
示例说明
示例一:生成 Token
String token = TokenProcessor.generateToken(request);
在用户访问“/xx/example”的请求时,调用 TokenProcessor 的 generateToken() 方法生成一个 token 字符串,并将其保存在会话中。代码执行后会返回一个 token 字符串。将其保存在 Model 中,通过 jsp 页面渲染隐藏表单项,让用户浏览器保存 token 值。
示例二:校验 Token
boolean isValidate = TokenProcessor.isValidate(request,token);
在用户提交表单时,将 token 值传入到处理方法中,在处理方法中调用 TokenProcessor 的 isValidate() 方法,传入 request 和 token 值进行校验,校验通过则进行正常的业务处理,否则需要跳转到错误页面等相关操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java TokenProcessor令牌校验工具类 - Python技术站