- 浏览: 405516 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
u011073441:
如何才能知道,我的安卓设备连接的是什么接口?android 设 ...
Android串口操作,简化android-serialport-api的demo -
sinat_31332985:
大神请问一下,在真机测试中,我没有串口设备,然后我设置dev/ ...
Android串口操作,简化android-serialport-api的demo -
骑着蜗牛狂奔:
在调用close的时候,出现了这个JNI WARNING: J ...
Android串口操作,简化android-serialport-api的demo -
l475334176:
怎么对多个串口进行监听额? 就是同时接受或者发送数据给多个串 ...
Android串口操作,简化android-serialport-api的demo -
冰雨的日子:
你好,我执行su.getOutputStream().writ ...
Android串口操作,简化android-serialport-api的demo
2010-03-05 20:55
Struts的Token(令牌)机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当 前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会 话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交 的发生。
这时其实也就是两点,第一:你需要在请求中有这个令牌值,请求中的令牌值如何保存,其实就和我们平时在页面中保存一些信息是一样 的,通过隐藏字段来保存,保存的形式如: 〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,这个value是TokenProcessor类中的 generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的 Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交。 在Action中的add方法中,我们需要将Token值明确的要求保存在页面中,只需增加一条语句:saveToken(request);,如下所示: public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) //前面的处理省略 saveToken(request); return mapping.findForward("add"); }在Action的insert方法中,我们根据表单中的Token值与服务器端的Token值比较,如下所示: public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) if (isTokenValid(request, true)) { // 表单不是重复提交 //这里是保存数据的代码 } else { //表单重复提交 saveToken(request); //其它的处理代码 } } 其实使用起来很简单,举个最简单、最需要使用这个的例子: 一 般控制重复提交主要是用在对数据库操作的控制上,比如插入、更新、删除等,由于更新、删除一般都是通过id来操作(例如:updateXXXById, removeXXXById),所以这类操作控制的意义不是很大(不排除个别现象),重复提交的控制也就主要是在插入时的控制了。 先说一下,我们目前所做项目的情况: 目 前的项目是用Struts+Spring+Ibatis,页面用jstl,Struts复杂View层,Spring在Service层提供事务控 制,Ibatis是用来代替JDBC,所有页面的访问都不是直接访问jsp,而是访问Structs的Action,再由Action来Forward到 一个Jsp,所有针对数据库的操作,比如取数据或修改数据,都是在Action里面完成,所有的Action一般都继承 BaseDispatchAction,这个是自己建立的类,目的是为所有的Action做一些统一的控制,在Struts层,对于一个功能,我们一般分 为两个Action,一个Action里的功能是不需要调用Struts的验证功能的(常见的方法名称有 add,edit,remove,view,list),另一个是需要调用Struts的验证功能的(常见的方法名称有insert,update)。 就拿论坛发贴来说吧,论坛发贴首先需要跳转到一个页面,你可以填写帖子的主题和内容,填写完后,单击“提交”,贴子就发表了,所以这里经过两个步骤: 1、转到一个新增的页面,在Action里我们一般称为add,例如: public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //这一句是输出调试信息,表示代码执行到这一段了 log.debug(":: action - subject add"); //your code here //这里保存Token值 saveToken(request); //跳转到add页面,在Structs-config.xml里面定义,例如,跳转到subjectAdd.jsp return mapping.findForward("add"); } 2、在填写标题和内容后,选择 提交 ,会提交到insert方法,在insert方法里判断,是否重复提交了。 public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){ if (isTokenValid(request, true)) { // 表单不是重复提交 //这里是保存数据的代码 } else { //表单重复提交 saveToken(request); //其它的处理代码 } } 下面更详细一点(注意,下面所有的代码使用全角括号): 1、你想发贴时,点击“我要发贴”链接的代码可以里这样的: 〈html:link action="subject.do?method=add"〉我要发贴〈/html:link〉 subject.do 和 method 这些在struct-config.xml如何定义我就不说了,点击链接后,会执行subject.do的add方法,代码如上面说的,跳转到subjectAdd.jsp页面。页面的代码大概如下: 〈html:form action="subjectForm.do?method=insert"〉 〈html:text property="title" /〉 〈html:textarea property="content" /〉 〈html:submit property="发表" /〉 〈html:reset property="重填" /〉 〈html:form〉 如 果你在add方法里加了“saveToken(request);”这一句,那在subjectAdd.jsp生成的页面上,会多一个隐藏字段,类似于这 样〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉, 2、点击发表后,表单提交到 subjectForm.do里的insert方法后,你在insert方法里要将表单的数据插入到数据库中,如果没有进行重复提交的控制,那么每点击一 次浏览器的刷新按钮,都会在数据库中插入一条相同的记录,增加下面的代码,你就可以控制用户的重复提交了。 if (isTokenValid(request, true)) { // 表单不是重复提交 //这里是保存数据的代码 } else { //表单重复提交 saveToken(request); //其它的处理代码 } 注意,你必须在add方法里使用了saveToken(request),你才能在insert里判断,否则,你每次保存操作都是重复提交。 记 住一点,Struts在你每次访问Action的时候,都会产生一个令牌,保存在你的Session里面,如果你在Action里的函数里面,使用了 saveToken(request);,那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。 如果你在你Action的方法里使用了isTokenValid,那么Struts会将你从你的request里面去获取这个令牌值,然后和Session里的令牌值做比较,如果两者相等,就不是重复提交,如果不相等,就是重复提交了。 由 于我们项目的所有Action都是继承自BaseDispatchAction这个类,所以我们基本上都是在这个类里面做了表单重复提交的控制,默认是控 制add方法和insert方法,如果需要控制其它的方法,就自己手动写上面这些代码,否则是不需要手写的,控制的代码如下: public abstract class BaseDispatchAction extends BaseAction { protected ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String parameter = mapping.getParameter(); String name = request.getParameter(parameter); if (null == name) { //如果没有指定 method ,则默认为 list name = "list"; } if ("add".equals(name)) { if ("add".equals(name)) { saveToken(request); } } else if ("insert".equals(name)) { if (!isTokenValid(request, true)) { resetToken(request); saveError(request, new ActionMessage("error.repeatSubmit")); log.error("重复提交!"); return mapping.findForward("error"); } } return dispatchMethod2(mapping, form, request, response, name); } } struts token一般需要进行2个action才能做到防止刷新. 做了几次.觉得很麻烦.我的项目里不想用struts.只是想把struts token用在非struts项目里. 通过研究.找到一个新的方法.可以应用到所有的项目中. 首先struts token原理是: 1.生成令牌 2.在表单隐含框里显示令牌值 3.提交表单,对隐含框令牌值与系统存的令牌值进行比较.如果正确说明没重复提交.错误说明有重复提交 4.清除令牌值 上面是原理.令牌值是以session值保存.所以只需要做2件事就可以实现struts token功能 建2个页面。1个页面test1.jsp(用于提交表单用),另一个页面test2.jsp(接收表单值) 1.test1.jsp如下 <% org.apache.struts.util.TokenProcessor.getInstance().saveToken(request); %> <form action="test2.jsp" method="post"> <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="<%=session.getAttribute("org.apache.struts.action.TOKEN")%>" /> <label>username <input type="text" name="username" /> </label> <p> <label>password <input type="text" name="password" /> </label> </p> <p> <label> <input type="submit" name="Submit" value="Submit" /> </label> </p> </form> 2.test2.jsp如下 <% Thread.sleep(3000); String username=""; String password=""; if(org.apache.struts.util.TokenProcessor.getInstance().isTokenValid(request,true)) { username=request.getParameter("username"); password=request.getParameter("password"); int val=com.test.test.getVal(); System.out.println(val+"*********username:"+username); System.out.println(val+"*********password:"+password); org.apache.struts.util.TokenProcessor.getInstance().resetToken(request); } else { org.apache.struts.util.TokenProcessor.getInstance().saveToken(request); System.out.println("error"); } %> username:<%=username%> <br/> password:<%=password%> <br/> 说明: saveToken方法就是生成一个令牌值,放在session里.session名为:org.apache.struts.action.TOKEN isTokenValid(request,true):判断提交令牌值是否和session值一样.true表示调用该方法后重新生成一个令牌值,保证只接受一次提交 |
发表评论
-
Android串口操作,简化android-serialport-api的demo
2014-07-28 14:29 74981最近在做android串口的开发,找到一个开源的串口类a ... -
myeclipse 模板注释
2013-07-03 22:33 1027当然!在一个项目的完整的生命周期中,其维护费用,往往是其开发 ... -
WebLogic 应用访问
2013-03-21 09:01 1124今天试了一下,在WebLogic上部署好一个应用 ... -
使用POI读取excel文件内容
2013-03-11 09:58 10941.前言 项目中要求读 ... -
CSS兼容性技巧整理从IE6-IE9 火狐谷歌浏览器兼容
2012-10-23 13:40 1005CSS样式表对浏览器的兼容性问题有时让人很头疼,不过当我们了解 ... -
关于IE和火狐浏览器样式不兼容的一些总结
2012-10-23 12:30 1374什么是浏览器兼容:当我们使用不同的浏览器(Firefox ... -
C3po连接池
2012-06-27 15:23 15604driverClass=com.mysql.jdbc.Driv ... -
使用Struts的Token机制解决表单的重复提交
2012-06-27 10:33 1122Struts的Token(令牌)机制能够很好的解决表 ... -
JAVA 7种方法获取Properties的值
2012-06-25 15:11 2621package com.lpc.util; import ... -
Java中getResourceAsStream的用法
2012-06-25 14:55 904首先,Java中的getResourceAsStream有以下 ... -
连接池参数测试结果分析
2012-06-25 11:28 1848连接池属性测试 1.initial ... -
DBCP连接池配置参数说明及优化
2012-06-21 10:14 18214在配置DBCP连接池时,主 ... -
JAVA泛型实体集合转xml .
2012-06-19 11:32 3350public static String beanListTo ... -
Java常用工具类,拼接XML格式的字符串
2012-06-18 14:33 2175import java.util.ArrayList; im ... -
Java 常用的工具接口包括文件压缩,解压缩,IP转换,文件删除(解决中文问题) .
2012-06-18 14:32 1098import java.io.BufferedInputStr ... -
Java读取Properties文件的六种方法
2012-06-08 16:04 5811。使用java.util.Properties类的load( ... -
java dbcp 配置
2012-03-30 13:32 1721package com.mengya.ConnUtil; ... -
对BigDecimal常用方法的归类
2012-02-26 16:02 920package com.org.assistant.util; ... -
关于HTML中的滚动条/去掉滚动条
2012-02-08 14:29 15881.xhtml下滚动条的颜 ... -
java堆栈 (转)
2011-12-07 21:38 955Java栈与堆 ----对这 ...
相关推荐
在Struts框架中,令牌机制(Token)是一种防止重复提交的有效方法,它主要用于处理表单数据的并发控制,防止用户意外或者恶意地多次提交表单,从而确保数据的一致性和安全性。 在Web应用中,用户可能会因为网络延迟...
Struts2的令牌机制是其防止重复提交和CSRF(跨站请求伪造)攻击的一种重要安全策略。在Web开发中,尤其是使用MVC框架如Struts2时,确保用户请求的唯一性和安全性至关重要。令牌机制就是这样的一个工具,它通过在表单...
在你提供的压缩包文件"token"中,可能包含了一个简单的Struts2令牌实例,你可以通过查看源代码学习如何在实际项目中集成和使用令牌机制。学习和理解这个实例,将有助于你更好地理解和应用Struts2的令牌功能。
### Struts的令牌机制:防止重复提交 在Web应用程序开发中,特别是在基于MVC(Model-View-Controller)架构的应用程序如Struts框架中,防止重复提交是一个非常重要的功能。Struts框架内置了一种名为“令牌机制”的...
Struts Token机制的核心思想是在客户端(浏览器)和服务器端(应用服务器)之间维持一个唯一的令牌(Token)。当用户首次提交表单时,服务器会生成一个随机的、唯一标识的Token,并将其存储到用户的会话(Session)...
### Struts2令牌机制详解 #### 一、Struts2令牌机制概述 在Web应用程序开发过程中,为了防止重复提交表单或CSRF(跨站请求伪造)等安全问题,Struts2框架提供了一种名为“令牌”的机制。该机制通过在用户会话中...
在处理表单提交时,为了防止重复提交或者跨站请求伪造(CSRF)攻击,Struts2引入了令牌机制。这个"struts2 令牌使用例子"是一个很好的实践教程,帮助开发者理解如何在实际应用中实施这一安全策略。 首先,我们需要...
在提供的压缩包文件"struts+token机制解决表单重复提交"中,可能包含了具体的Struts配置文件、Action类、Interceptor实现以及示例代码,可以帮助读者更深入地理解并实践这个机制。通过对这些代码的学习和研究,...
而Struts1.x的令牌机制(Token)则是防止重复提交、跨页请求攻击的重要手段。在此,我们将深入探讨Struts1.x令牌的使用方法及其背后的原理。 首先,理解为何需要令牌。在Web应用中,用户可能会意外或恶意地多次点击...
此外,为了防止跨站请求伪造(CSRF)攻击,Struts2的令牌机制还可以配合`filterDispatcher`配置实现。通过设置`struts.action.excludePattern`,可以排除某些不需令牌保护的URL。 总的来说,Struts2的令牌机制是...
Struts的Token机制是Web应用中防止表单重复提交的一种常用方法。在处理表单提交时,如果用户意外地多次点击了提交按钮,可能会导致数据的重复录入,从而引起不必要的问题,例如订单重复、数据库数据异常等。为了解决...
在Struts2中,令牌机制是用于防止重复提交(Duplicate Form Submission)和跨站请求伪造(Cross-Site Request Forgery, CSRF)的安全措施。下面我们将深入探讨这一机制。 首先,我们需要理解什么是重复提交。当用户...
在Struts框架中,令牌机制(Token)是一种重要的防止重复提交的安全策略。本讲将深入探讨Struts中的令牌使用及其原理。 首先,理解为什么需要令牌机制。在Web应用中,用户可能会意外或恶意地多次点击提交按钮,导致...
如果没有令牌机制,这些重复提交可能会导致数据库中出现重复数据,对系统造成影响。 **三、防止CSRF攻击** CSRF攻击是恶意用户通过构造一个伪造的表单,诱导用户在不知情的情况下提交数据。由于这个伪造的表单包含...
Struts2提供了一种名为“token”的机制来解决这个问题。 **什么是Token机制?** Token机制是一种防止重复提交的方法,它通过在客户端(通常是浏览器的session或者cookie)和服务器端存储一个唯一的令牌,确保每个...
通过以上步骤,Struts1的令牌机制可以有效地防止页面的重复提交,保护业务数据的完整性。然而,随着技术的发展,现代框架如Spring MVC、Struts2等提供了更完善的解决方案,例如利用HTTP的幂等性或一次性令牌(如CSRF...
令牌机制主要是通过在客户端(通常是Web浏览器)和服务器之间传递一个唯一的标识符,确保每个请求的唯一性和合法性。当用户提交表单时,服务器会生成一个令牌并将其存储在服务器端,同时将该令牌发送给客户端。...
本文将深入探讨如何在Struts框架中利用Token机制来解决这个问题。 一、表单重复提交问题 表单重复提交可能发生在用户点击提交按钮后,由于网络延迟或刷新页面等原因,导致请求被多次发送到服务器。如果不加以控制,...