- 浏览: 457874 次
- 性别:
- 来自: 潘多拉
文章分类
最新评论
-
lijunwyf:
代码好像不完整,后端没串起来的感觉
Json-RPC for java首次尝试 -
jerry.chen:
我用这种方式去,貌似没啥效果,楼主!
Xfire开发的webservice客户端超时问题解决 -
漫步邃思:
这个问题常遇到,老是想不起来解决方法,记住了
resin3.1.0无法解析EL表达式问题解决 -
dampce032:
在不删掉integratedSecurity=true;的情况 ...
JDBC 连接SQLServer数据库(Failed to load the sqljdbc_auth.dll) -
kill_e680:
取CPU号和取硬盘号,在linux下可以用吗?
sigar使用:在web中应用sigar取得系统信息
每次填写完表单后单击提交后,struts中action执行相关业务逻辑,通过forward对象转到某个页面。这时若刷新页面后,会再执行同样的逻辑。比如录数据到数据库,按照上面的情况,数据库中会有两条同样的数据。为了避免这种情况,有几种解决办法:
1 :在执行业务逻辑后,返回一个Forward对象,这个forward对象的path属性应该配置一个幂等的XXX.do操作,这样可以解决,但是有可能不符合用户的要求,所以还有其他方法。
2:重定向,在配置文件里配置redirect属性<forward redirect="true" path="/xxx/xxx.jsp">,重定向到xxx.jsp。这种情况下会丢失request范围内的参数,若xxx.jsp不要求这些参数就可以,如操作的数据保存在session范围内,就不会影响整体效果。但还是有弊端。
3:利用struts1.x令牌能很好解决这类问题。
必要条件:在表单内,必须使用struts的库标签如:<html:form>。
如下例子:
LoginAction:
struts-config.xml:
index.jsp:
login.jsp:
当你运行第一次的时候,会提示你"成功".
这时我们退到login.jsp查看一下源代码:
对比一下我们写的login.jsp多了一个隐藏域:
<div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div>
此时生成了一个32位的唯一的JsessionID做为值.
与LoginAction中的get方法的saveToken(request)是一样的.
此句的作用就是把一个jsessionid保存到request范围里.
在我们后退重新调用:
if(this.isTokenValid(request,true))
{
System.out.println("valid");
return mapping.findForward("ok");
}
时,就会拿login.jsp里传过来的jsessionid和request的
进行比较,如果一样,说明不合法.因为我们的操作都是在一个请求会话里
操作的.说明你在重复提交.
如果不一样,说明重新生成了一个唯一的jsessionid(新开一个浏览器),
开启了一个新会话,重新提交,这是合法的.
这样就防止了表单重复提交问题.
为了防止表单重复提交,一般在设计action方法时:如录入数据,设计成两个方法,add()和insert(),在add方法中保存令牌并转到页面,在页面提交到insert方法中,判断令牌。
1 :在执行业务逻辑后,返回一个Forward对象,这个forward对象的path属性应该配置一个幂等的XXX.do操作,这样可以解决,但是有可能不符合用户的要求,所以还有其他方法。
2:重定向,在配置文件里配置redirect属性<forward redirect="true" path="/xxx/xxx.jsp">,重定向到xxx.jsp。这种情况下会丢失request范围内的参数,若xxx.jsp不要求这些参数就可以,如操作的数据保存在session范围内,就不会影响整体效果。但还是有弊端。
3:利用struts1.x令牌能很好解决这类问题。
必要条件:在表单内,必须使用struts的库标签如:<html:form>。
如下例子:
LoginAction:
package com.web.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction; public class LoginAction extends DispatchAction { public ActionForward get(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //保存令牌(保存在jsp动态生成的32位jsessionid)\ this.saveToken(request); System.out.println("begin save"); return mapping.findForward("login"); } public ActionForward login(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { /**//*if(this.isTokenValid(request)) { System.out.println("valid"); this.resetToken(request); return mapping.findForward("ok"); }*/ //这个写法和上面注释部分一样效果 if(this.isTokenValid(request,true)) { System.out.println("valid"); return mapping.findForward("ok"); } else { System.out.println("invalid"); return mapping.findForward("error"); } } }
struts-config.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <data-sources /> <form-beans> <form-bean name="loginForm" type="com.web.form.LoginForm"></form-bean> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings> <action path="/login" parameter="method" name="loginForm" type="com.web.action.LoginAction"> <forward name="login" path="/login.jsp" /> <forward name="ok" path="/ok.jsp" /> <forward name="error" path="/error.jsp" /> </action> </action-mappings> <message-resources parameter="" /> </struts-config>
index.jsp:
<% @page contentType="text/html; charset=GBK"%> <% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:set var="ctx" value="${pageContext.request.contextPath}" /> <html> <head> <title>My Jsp</title> </head> <body> <a href="${ctx}/login.do?method=get">发言</a> </body> </html>
login.jsp:
<% @page contentType="text/html; charset=GBK"%> <% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <% @taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %> <html> <head> <title>My Jsp</title> </head> <body> <c:set var="ctx" value="${pageContext.request.contextPath}"/> <!-- 此处必须使用html标签,否则token不能用 --> <html:form action="login.do?method=login" method="post"> <html:submit value="提交"></html:submit> </html:form> </body> </html>
当你运行第一次的时候,会提示你"成功".
这时我们退到login.jsp查看一下源代码:
<html> <head> <title>My Jsp</title> </head> <body> <form name="loginForm" method="post" action="/strutsToken/login.do?method=login"> <div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div> <input type="submit" value="提交"> </form> </body> </html>
对比一下我们写的login.jsp多了一个隐藏域:
<div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div>
此时生成了一个32位的唯一的JsessionID做为值.
与LoginAction中的get方法的saveToken(request)是一样的.
此句的作用就是把一个jsessionid保存到request范围里.
在我们后退重新调用:
if(this.isTokenValid(request,true))
{
System.out.println("valid");
return mapping.findForward("ok");
}
时,就会拿login.jsp里传过来的jsessionid和request的
进行比较,如果一样,说明不合法.因为我们的操作都是在一个请求会话里
操作的.说明你在重复提交.
如果不一样,说明重新生成了一个唯一的jsessionid(新开一个浏览器),
开启了一个新会话,重新提交,这是合法的.
这样就防止了表单重复提交问题.
为了防止表单重复提交,一般在设计action方法时:如录入数据,设计成两个方法,add()和insert(),在add方法中保存令牌并转到页面,在页面提交到insert方法中,判断令牌。
发表评论
-
eclipse
2012-01-19 10:19 942eclipse操作常识:eclipse进行项目开发时往往会遇 ... -
sigar使用:在web中应用sigar取得系统信息
2012-01-18 14:19 3256[转] import java.io.IOExce ... -
在树初始化时,加一个load图片
2012-01-16 09:45 1823做个浮动图层放在 zTree 上面, 然后利用 asnycS ... -
利用JS做到隐藏div和显示div
2012-01-16 09:05 108724div的visibility可以控制div的显示和隐藏,但是隐 ... -
虚拟机使用NAT不能上网
2012-01-05 08:41 2980虚拟机上网问题 许多虚拟机的初学者,都会询问这样一个问题:在 ... -
[转]用eclipse pdt 配置php开发,调试环境
2011-12-30 16:15 1478本文档是windows操作系统下php开发环境的配置。 1 ... -
RESIN 连接池数据库密码加密方法
2011-12-28 15:34 1599[转] Resin 连接池写在resin.conf里 ... -
好的技术博客
2011-12-28 15:18 849http://www.findjar.com/index.x ... -
利用jawin完成调用window中dll的调用
2011-12-28 15:14 2084[转] Java/Win32互动项目( Jawin)是 ... -
WebService的测试
2011-12-20 09:26 1453在浏览器中输入地址:http://localhost ... -
我的SQLSERVER 分页存储过程
2011-12-13 08:54 3163/** * procedure name : kk_f ... -
Myeclipse中将Web项目发布时重命名
2011-12-12 09:58 1137选中项目->反键->Properties ... -
Sql xtype 类型
2011-11-30 09:39 1221sysobjects 表 在数据库内创建的每个对象(约束、默认 ... -
使用SQL语句清空数据库所有表的数据[转]
2011-11-30 09:14 772近来发现数据库过大,空间不足,因此打算将数据库的数据进行全面的 ... -
js实现焦点进入文本框内关闭输入法
2011-11-30 08:56 3540要用到的东西: imeMode:xxx 有四个参数 act ... -
数据库设计三大范式应用实例剖析[转]
2011-11-29 17:25 770数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数 ... -
Ajax.Request方法
2011-11-29 13:47 1253Prototype 的 Ajax.Request 对象绑定了浏 ... -
临时表(Template Table)[转]
2011-11-25 17:41 15651、MS SQLSERVER SQL ... -
测试sql语句性能
2011-11-25 17:22 1016[size=medium]有时候我们经常为我们的sql语句执行 ... -
quartz cronExpression配置说明
2011-11-18 15:26 1278字段 允许值 ...
相关推荐
Struts1.x常用的开发包,需要学习struts1.x朋友可以下载
struts1.x和struts2.x区别
freemarker与struts 1.x 结合,生成html 在http://blog.csdn.net/chen1255 的web中有详细描述关于freemarker与struts1.x的结合
Struts 2.x权威指南(第3版)
在这里,通过一个小例子稍微总结了下struts1和struts2的区别,希望这个能帮助到初学struts的朋友
java Struts 1.x 框架 Web 开发 java Struts 1.x 框架 Web 开发
Struts1.x的登录示例,Struts1.x相关详细教程参考我的Blog:http://blog.csdn.net/boyazuo
struts1.x入门教程
struts1.x apps 所有最新的Struts1.x项目应用 struts1.x apps 所有最新的Struts1.x项目应用 欢迎大家下载。。。
struts1.x多文件上传, 感觉不错.
Struts1.x实现防止提交的Token使用示例。工程环境:MyEclipse
struts1 国际化 源代码 struts1 国际化 工程
适用于Struts1.x初学者(网摘共25节)
这是struts1.x标签! struts1.x是历经考验的成熟的框架! 此标签可以帮助你更好的学习struts1.x的标签!
Struts1.x-Jdbc,学习Struts1.的曾删改查
struts2中对表单重复提交的处理方法;包括处理两种典型的表单重复提交的思路和方法
struts1.x和mysql整合的登陆例子,包括用户的增删改查,涉及到LookupDispatchAction,的多个submit提交,静态验证,和读取数据库properties文件
基于Struts1.x的简单电子商务系统,hiberntae实现数据的持久化,数据库是Mysql
struts1.x 学习总结 struts1.x 学习总结 struts1.x 学习总结 struts1.x 学习总结