Struts Token 使用

1,先在一个Action中,调用saveToken(HttpServletRequest request)方法。然后转向带有表单的JSP页面。

2,在JSP页面提交表单给一个Action,再这个Action中进行是否为重复提交的判断。

              if (isTokenValid(request, true)) {

// 未重复提交时,正确的时候应该做的事情

return mapping.findForward("success");

} else {

// 重复提交时,需要做的事情

saveToken(request);

return mapping.findForward("error");

}

Struts Token 机制:

1,  由第一个Action调用saveToken(HttpServletRequest request),这个方法内部实现如下:

    protected void saveToken(HttpServletRequest request) {

token.saveToken(request);

}

token.saveToken(request);

这个方法的实现如下:

    public synchronized void saveToken(HttpServletRequest request) {

HttpSession session = request.getSession();

String token = generateToken(request);

if (token != null) {

session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);

}

}

这个方法调用generateToken方法实现如下:

    public synchronized void saveToken(HttpServletRequest request) {

HttpSession session = request.getSession();

String token = generateToken(request);

if (token != null) {

session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);

}

}

generateToken完毕后,将得到的唯一值setAttribute到session中。

            session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);

Globals.TRANSACTION_TOKEN_KEY的值是:” org.apache.struts.action.TOKEN”

然后跳转到JSP页面。

2,  JSP页面的Struts自定义标签 <html:form>的标签类:org.apache.struts.taglib.html. FormTag

这个类的doStartTag()方法会调用本类的renderToken()方法。

    protected String 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();

}

这样子会生成类似于

 

<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" 
         value="6aa35341f25184fd996c4c918255c3ae">

的隐藏标签。

然后提交到一个Action中,在Action中用isTokenValid()方法进行比较session中” org.apache.struts.action.TOKEN”的这个key所对应的值和提交来的request中的” org.apache.struts.action.TOKEN”的这个value是否一致。

如果为true,那么证明可以提交。如果为false,证明已经重复,不允许提交。

最新文章

  1. js获取当前日期
  2. python logging模块详解[转]
  3. python笔记-python编程优化:常用原则和技术介绍
  4. 套接字Socket
  5. ASP.NET MVC 3 之表单和 HTML 辅助方法(摘抄)
  6. 数学对象Math ceil()、floor()、round()方法
  7. (转)使用 /proc 文件系统来访问 Linux 内核的内容
  8. lintcode:Binary Tree Postorder Traversal 二叉树的后序遍历
  9. Nuttx操作系统
  10. asp.net中C#对象与方法 属性详解
  11. poj 3279 Fliptile
  12. 解决libpython2.6.so.1.0: cannot open shared object file
  13. 微信小程序资料集合
  14. MySQL暴错注入方法
  15. 【BZOJ2733】【HNOI2012】永无乡
  16. go语言的开始入门(一)
  17. win7系统标准用户恢复administrator账号方法
  18. NOIP2011提高组 选择客栈
  19. centos7安装postgres-10
  20. win10环境配置react

热门文章

  1. pdf.js的使用(2)新的需求已经出现,怎么能够停止不前(迪迦奥特曼主题曲)哈哈哈。^_^
  2. 吴裕雄 python 神经网络——TensorFlow 花瓣分类与迁移学习(3)
  3. ASA密码恢复流程
  4. Pandas——数据处理对象
  5. leetcode 0215
  6. Redis数据存储结构之String
  7. ES建立索引步骤, 1,index 2.mapping 3,别名
  8. python列表操作方法详解
  9. 搭建DHCP服务
  10. Maven项目-jar包冲突:MyServlet is not a Servlet解决方法