免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3828 | 回复: 7
打印 上一主题 下一主题

Struts1.x 防止重复提交 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-19 11:46 |只看该作者 |倒序浏览
Struts的Token机制能够很好的解决表单重复提交的问题,基本原理是:

服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。

在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,
也会将用户会话中保存的旧的令牌进行替换。

这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,
从而有效地防止了重复提交的发生。

这时其实也就是两点,

第一:你需要在请求中有这个令牌值,请求中的令牌值如何保存,其实就和我们平时在页面中保存一些信息是一样的,
通过隐藏字段来保存.
保存的形式如:
〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN"value="6aa35341f25184fd996c4c918255c3ae"〉,
这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。

第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,
所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。

view plain
1.在用户通过Action到达表单提交页面的时候,首先在这个action中调用一下 this.saveToken(request);  
  
2.在用户提交表单时候传入一个隐藏域 ,跟随表单一起提交  
  
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"   
value='<%=session.getAttribute("org.apache.struts.action.TOKEN")%>' />  
  
3.在处理用户提交请求的action 中  
  
HttpSession session = req.getSession();  
String token = req.getParameter("org.apache.struts.taglib.html.TOKEN");  
String token2 = (String) session.getAttribute(org.apache.struts.Globals.TRANSACTION_TOKEN_KEY);  
  
System.out.println("token:"+token);  
System.out.println("token2:"+token2);  
  
session.removeAttribute(Globals.TRANSACTION_TOKEN_KEY);  
  
if (StringUtils.isNotBlank(token) && token.equals(token2))  
  
{  
req.setAttribute("message", "成功提交!");  
return mapping.findForward("success");  
}  
  
req.setAttribute("message", "重复提交!");  
return mapping.findForward("error");

论坛徽章:
0
2 [报告]
发表于 2011-11-19 11:47 |只看该作者
怎么查看端口占用情况?
       开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选"查看"-"选择列"

        经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,如何知道谁占有了我们需要的端口,很多人都比较头疼,下面就介绍一种非常简单的方法,希望对大家有用

假如我们需要确定谁占用了我们的9050端口

1、Windows平台
在windows命令行窗口下执行:

C:\>netstat -aon|findstr "9050"

TCP   127.0.0.1:9050    0.0.0.0:0    LISTENING    2016



看到了吗,端口被进程号为2016的进程占用,继续执行下面命令:
C:\>tasklist|findstr "2016"

tor.exe       2016 Console       0       16,064 K



很清楚吧,tor占用了你的端口。

论坛徽章:
0
3 [报告]
发表于 2011-11-19 11:48 |只看该作者
/**该分页效率最高**/
select top 10 * from Books
where (Id<(select min(Id) from (select top 10 Id from Books order by Id desc) as T))
order by Id desc
--注意as T不能少

/**该分页效率一般**/
select top 10 * from Books where Id not in(select top 20 Id from Books order by Id desc) order by Id desc

论坛徽章:
0
4 [报告]
发表于 2011-11-19 11:49 |只看该作者
public static String getValue(String key) {
  Properties props = new Properties();
  String value = null;

  try {
   props.load(new FileInputStream(new File(
     "D:/workspace/tet/src/com/firsttech/config.properties")));
   value = props.getProperty(key);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return value;
}

论坛徽章:
0
5 [报告]
发表于 2011-11-30 12:41 |只看该作者
var c="[{\"name\":\"b\",\"age\":\"2\"},{\"name\":\"a\",\"age\":\"1\"}]"
var obj = jQuery.parseJSON(c);
alert(obj[1].name);

论坛徽章:
0
6 [报告]
发表于 2011-11-30 12:42 |只看该作者
saveToken(request);
        <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="<%=session.getAttribute("org.apache.struts.action.TOKEN")%>" />

if (!isTokenValid(request, true)) {非重复的执行方法}

论坛徽章:
0
7 [报告]
发表于 2011-11-30 12:43 |只看该作者
encodeURI()

论坛徽章:
0
8 [报告]
发表于 2012-06-20 17:31 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP