修改同事的代码,需要增加传值,可action传值给页面EL表达式${}接收总为空,找了半天没找到为什么,突然发现url地址栏里的路径不是.do,应该同事做了 redirect或url重写;然后找到struts配置文件,发现果真 redirect,下边粘了redirect的注解
redirect="true"时,会调用sendRedirect进行定向,而sendRedirect定向采用的时"再浏 览器发生页面改变
redirect="false"时采用的是server-side forward端的定向;
如果redirect="false" 那在action里处理完操作跳到合适的视图页时候
URL不会改变 而是.do ;
如果在这时候刷新页面 就会再次进入action里,
如何防止刷新页面导致的重复提交
为什么在redirect="false" 时候 在action里
给request.setAttribute();时候 跳转到的那个页面能request.getAttribute()!=null
但是redirect="true"时候 跳转的页面request.getAttribute()就永远==null;
redirect=TRUE好还是FALSE好;
防止刷新进行的二次表单提交====>struts 的 token
使用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);,如下所示: |