目的是防止数据重复提交到库表
struts2本身有<s:token/>拦截器来做到这点的,但项目里面别的问题,在提交表单时只能去掉这个拦截器。
所以想在action中提交表单的方法里面利用session来判断是否是重复提交
在调用后台service执行操作时,先判断session中是否有你放进去的那个值,没有才执行后台操作
成功执行操作,往session里put一个值
但是这样session里的值会一直在,再一次填写并提交表单时会因为session没有清空而无法再保存数据不知道session里什么时候放值,什么时候把值清掉呢?
我试了好多次都不成

解决方案 »

  1.   

    问题得到解答的机会是越来越小了
    再也不是以前朋友所鼓吹的"在CSDN提问,就能解决问题"
      

  2.   

    那就自己模仿一下<s:token>拦截器的实现原理啊,每次提及表单时在session中存放一个随机的字符串,下次提交时对比一下如果两次的字符串一样的便是重复提交了啊,session中如果key值一样的话,多次存入的value值会覆盖的
      

  3.   

    怎么对比?我只在action里面操作,页面不做什么,页面不想写<% %>这样的串
    还有,每次往session中放值,虽然key值是一样的,但value貌似并没覆盖,而是并行存在
      

  4.   

    防止重复提交不是用的这个session吧,
    你在你的action里面写个saveToken(request);就可以了啊
      

  5.   

    这里是struts2
    请把代码写全些
    你这种写法我不知所以然
    请恕我功力尚浅 O(∩_∩)O~
      

  6.   

    这个问题每个人用的方法不一样。这又篇文章你看看
    http://peixun.96963.com/resourse/tutorial-43.html
      

  7.   

    采用JS控制不可靠
    别的方法在struts2里不行
    如果struts2还采用struts1的token令牌,就没有任何意义了。整的那么繁琐。那是技术的倒退
      

  8.   

    struts2的令牌很简单 页面加个标签  配置一个拦截器 就ok了
      

  9.   

    我知道,你说的是<s:token/>啦
    题目说明了我这里不能用它自身的token拦截器
    使用它影响页面显示从action返回的错误消息,也就是this.addFieldError("err","......");return INPUT;
    返回到input页面时field error显示不出来
    请大家看清楚题意。。
      

  10.   

    访问页面的时候往session中放入一个值,对应的在表单中加入一个hidden(与session的值一致),
    提交到action中,如果session中对应的key有值并与提交的数据一致的话执行操作,
    执行完成后清除session中的值。否则提示重复提交
      

  11.   


    你好!按照你的指教我调了好久终于成功了。谢谢你!
    但是,在填写表单页面使用
    <s:hidden name="sub" value="session_value"/> 
    <s:hidden name="sub" value="#session.session_value"/>
    <s:hidden name="sub" value="%{session_value}"/>
    都得不到在action里面放到session里的值而只能用<input type="hidden" name="sub" value="${session_value}"/>
    这种EL表达式才取得到值
    那么,JSP页面采用struts2的标签取session中的值,怎么做呢?
      

  12.   

    试一下 <s:hidden name="sub" value="%{#session.session_value}"></s:hidden> 吧,应该能满足你的要求
      

  13.   

    <s:hidden name="sub" value="${#session.session_value}"/>
    这样应该可以的
      

  14.   

    struts2标签里面不能用$符号吧,会报标签错误
      

  15.   

    struts2标签中用$符号报错
    <s:hidden name="sub" value="${#session.session_value}"/>
    这样写报错:
    org.apache.jasper.JasperException: /assets/businessChange/chBusinessView.jsp(340,8) According to TLD or attribute directive in tag file, attribute value does not accept any expressions
      

  16.   

    今天是要做url提交防止重复提交的问题,这里没有form,不能使用s:token,而下面所带参数只能使用s:param
    试了半天发现原来用#session.xxx能正确取到action里面put到session中的值
    原来解决这个本帖中的问题时,值也是取到了,只是我从地址栏看那个参数带的值是0,以为没取到,其实是没显示完全而已(可能地址栏显示长度有限制)
    因我在action里面往session放值是session.put("cabValue", Math.random() + ""),是一个0到1之间的伪随机double值,地址栏所以只看见了0
    <s:url id="cabApply" action="userAffirm" namespace="/assets/businessChange">
    <s:param name="cabinetId" value="%{cbCabinetsExeBO.id}"/>
    <s:param name="formId" value="%{changeApplyFormBO.id}" />
    <s:param name="subApplyExeType" value="%{'CABI'}" />
    <s:param name="cabAffirmSession" value="#session.cabValue"/>
    </s:url>
    <s:a href="%{cabApply}" cssClass="buttonBlue"> 用户确认 </s:a>
      

  17.   

    正确,因为struts2 的session 是map类型的而map允许存放多组键和值都同名的的对象
    但有一个问题:
    public String  login(){//登陆
      //用户名密码比正确后
      session.put("user",this.user);//将登陆成功的用户存入session
    }
    public String logout(){//注销
      session.remove("user");
    }
    假如有10为用户登陆后,其中一人调用logout()方法注销时,会将所有用户从session中注销掉,因为session.put()方法的key是固定的