[Struts]Token 使用及原理
Struts Token 使用
1,先在一个Action中,调用saveToken(HttpServletRequest request)方法。然后转向带有表单的JSP页面。
2,在JSP页面提交表单给一个Action,再这个Action中进行是否为重复提交的判断。
// 未重复提交时,正确的时候应该做的事情
return mapping.findForward("success");
} else {
// 重复提交时,需要做的事情
saveToken(request);
return mapping.findForward("error");
}
Struts Token 机制:
1, 由第一个Action调用saveToken(HttpServletRequest request),这个方法内部实现如下:
token.saveToken(request);
}
token.saveToken(request);
这个方法的实现如下:
HttpSession session = request.getSession();
String token = generateToken(request);
if (token != null) {
session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);
}
}
这个方法调用generateToken方法实现如下:
HttpSession session = request.getSession();
String token = generateToken(request);
if (token != null) {
session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);
}
}
generateToken完毕后,将得到的唯一值setAttribute到session中。
Globals.TRANSACTION_TOKEN_KEY的值是:” org.apache.struts.action.TOKEN”
然后跳转到JSP页面。
2, JSP页面的Struts自定义标签 <html:form>的标签类:org.apache.struts.taglib.html. FormTag
这个类的doStartTag()方法会调用本类的renderToken()方法。
StringBuffer results = new StringBuffer();
HttpSession session = pageContext.getSession();
if (session != null) {
String token =
(String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);
if (token != null) {
results.append("<input type=\"hidden\" name=\"");
results.append(Constants.TOKEN_KEY);
results.append("\" value=\"");
results.append(token);
if (this.isXhtml()) {
results.append("\" />");
} else {
results.append("\">");
}
}
}
return results.toString();
}
这样子会生成类似于
value="6aa35341f25184fd996c4c918255c3ae">
的隐藏标签。
然后提交到一个Action中,在Action中用isTokenValid()方法进行比较session中” org.apache.struts.action.TOKEN”的这个key所对应的值和提交来的request中的” org.apache.struts.action.TOKEN”的这个value是否一致。
如果为true,那么证明可以提交。如果为false,证明已经重复,不允许提交。
最新文章
- js获取当前日期
- python logging模块详解[转]
- python笔记-python编程优化:常用原则和技术介绍
- 套接字Socket
- ASP.NET MVC 3 之表单和 HTML 辅助方法(摘抄)
- 数学对象Math ceil()、floor()、round()方法
- (转)使用 /proc 文件系统来访问 Linux 内核的内容
- lintcode:Binary Tree Postorder Traversal 二叉树的后序遍历
- Nuttx操作系统
- asp.net中C#对象与方法 属性详解
- poj 3279 Fliptile
- 解决libpython2.6.so.1.0: cannot open shared object file
- 微信小程序资料集合
- MySQL暴错注入方法
- 【BZOJ2733】【HNOI2012】永无乡
- go语言的开始入门(一)
- win7系统标准用户恢复administrator账号方法
- NOIP2011提高组 选择客栈
- centos7安装postgres-10
- win10环境配置react