现在有个工程Demo,里面有个action为DemoAction
代码如下 public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
cn.suiyang.common.DataBaseAccess dba = new DataBaseAccess();
dba.doUpdate("insert into demo values('aa');", new String[] {});
return mapping.findForward("dd");
}
应为是做测试 所以ActionForward的名字是随便取的--dd 请原谅我编程的不严谨作风吧 :)这是我struts-config.xml文件下面的相关的信息<action path="/demo" type="cn.suiyang.struts.action.DemoAction" >
   <forward name="dd" path="/2.jsp" ></forward>
</action>
然后我进入我的actionforward里面
http://127.0.0.1/Demo/demo.do进行一次数据插入 检查数据插入成功
但这个时候 我的浏览器的URL仍然为 http://127.0.0.1/Demo/demo.do
我F5 刷新后 发现又插入一条数据
结论:
这样是肯定不行的 这样的话很容易影响到数据里面的数据 解决方案
在刚才的struts-config.xml文件下面加上
redirect="true"<action path="/demo" type="cn.suiyang.struts.action.DemoAction" >
   <forward name="dd" path="/2.jsp" redirect="true" ></forward>
</action>
然后进行测试 输入http://127.0.0.1/Demo/demo.do
进行一条语句插入 插入成功
然后action重定向到我的2.jsp页面上面

这个时候 我的浏览器的URL为 http://127.0.0.1/Demo/2.jsp
我F5 刷新后 没有插入数据(这不是废话么...)
最后的结论:
这个解决方案解决了使用转发然后刷新重复进行数据库操作
但是自己想了想 这样做有个问题
既然是重定向 那么request里面的attribute就会没用 也就是说 会被完全清空
只能使用session以上的spoce来进行数据的传递工作
这样对效率是不是大大降低了? 
我所知道的一个原则就是 能用request就不用session 能用session就不使用appliction (appliction我认为是用的很少的)所以在这个问题是 我有些犹豫 
在这里请教各位有项目经验和高手们 在开发的时候 这个问题是如何解决的?
能不能既能解决了使用转发然后刷新重复进行数据库操作,然后我又可以使用request来进行数据传递工作呢? 
我真喜欢鱼和熊掌能兼得也 :)
代码没有什么复杂的地方 显的比较罗嗦 勿怪 勿怪.

解决方案 »

  1.   

    http://www.google.cn/search?aq=f&complete=1&hl=zh-CN&newwindow=1&rlz=1B3GGGL_zh-CNCN281CN281&q=struts+token&btnG=Google+%E6%90%9C%E7%B4%A2&meta=
    看看struts的token机制
      

  2.   

    2L的意思是让我使用token来解决重复提交么?
      

  3.   

    说错了 是3L的朋友但是有个问题
    现在我使用token来防止重复提交
    但是既然是转发 那么我上一次的一写参数都会显示在url里面 (用DispacthAction的时候,还有一些需要URL重写参数)
    这个时候 我希望有个保密措施(虽然我知道 这依然不能"很"保密)那又怎么办呢?
      

  4.   

    这是一个大的bug,就算是直接用jsp写的页面,不用框架,也同样有这样的问题,
    用jsp做一个插入数据库的操作,成功后再刷新,同样还会再插入一次,
    好的方案是插入操作完后转到显示页面,这样也可以查看入库是否成功!而不是强到到一个其它的页面,
      

  5.   

    6L的建议 我也有想过
    就是用action的时候插入完以后 跳到另外一个ACTION(用来显示)里面在返回的到界面
    但是我觉得这样跳2次 反而更加麻烦
      

  6.   

    这是一个大的bug,就算是直接用jsp写的页面,不用框架,也同样有这样的问题, 
    用jsp做一个插入数据库的操作,成功后再刷新,同样还会再插入一次, 
    好的方案是插入操作完后转到显示页面,这样也可以查看入库是否成功!而不是强到到一个其它的页面,
      

  7.   

    自己顶一下另外 6L的朋友 token使用好像必须和ActionForm一起使用吧
    假设我这个不是插入呢?
      

  8.   

    这个的确是一个很普片的问题,直接用JavaBean是不是更好呢?
    比如论坛回复,肯定直接跳回改页面,如果用JavaBean,你重定向到该页面不会与request有关。有时候action如果滥用反而不好,就好像很多主页是index.jsp而不是由index.do跳过去的
      

  9.   

    这个的确是一个很普片的问题,直接用JavaBean是不是更好呢?
    比如论坛回复,肯定直接跳回改页面,如果用JavaBean,你重定向到该页面不会与request有关。有时候action如果滥用反而不好,就好像很多主页是index.jsp而不是由index.do跳过去的
      

  10.   

    12L 的朋友转发的时候URL不会变化 我的帖子意思就是这样
    13L 你的办法我会去尝试 谢谢
    15L 你好像没有看明天我的帖子 是我写的不够详细么?
      

  11.   

    可以使用重定向,然后拿 Cookie 在 Action 和 JSP 视图间传值。
      

  12.   

    使用token防止重复提交,跳转的时候可以使用des加密传递参数,然后解密获得自己的参数,这样就可以了。
    参数加密成一个key,比如a.jsp?key=ADIUAWIJAOUFAWKEJWOIJOSAFHAOSIDHFOASIDF
      

  13.   

    如果你只是单独的防止数据被重新更新,那解决办法还是很多的,不止java,其他网页语言asp,php什么的都是一样的,因为http是无状态的,所以每次浏览器都认为是一个新请求。解决办法比如structs的token,或者直接用session设置状态,或者按钮变灰。但是如果是要求不同页面保持参数,相对就比较麻烦。我基本很少用session来传递参数,所以后来图省事做了一个转向页面,每个处理之后都跳到这个转向页面,然后这个页面接受所有的传递参数,再重定向回去。这个方法实际和楼上各位的差不多了,只不过我接受参数的是一个tag,所以基本没什么代码量。但是对于参数非常多的情况,也可以考虑用session。一般10个以内我觉得request是可以接受的,无论你是get还是post
      

  14.   

     TOKEN 机制  
    struts自带的有解决方案
      

  15.   

    Stuts2的token机制,我认为值得一试,我赞同20楼意见