在jsp+javabean+servlet里如何防止用户能过刷新重复的提交数据

lirobo 2006-08-08 11:47:32
我现在做的是一个jsp+javabean+servlet的系统啊
是用servlet来处理业务逻辑所以地址栏上URL地址上老是停在第一次调用servlet上面
所以如果用户发现这个问题的话他们就可以通过刷新重复的刷新写入数据啊
大家有没有什么好的解决方案呢
...全文
455 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenhui9876 2006-08-17
  • 打赏
  • 举报
回复
mark
feyge 2006-08-16
  • 打赏
  • 举报
回复
sign
huihui0103 2006-08-16
  • 打赏
  • 举报
回复
mark!up!!!
daxu 2006-08-16
  • 打赏
  • 举报
回复
看看
china2001ok 2006-08-16
  • 打赏
  • 举报
回复
LZ也可以通过时间判断啊一样的
dreamover 2006-08-16
  • 打赏
  • 举报
回复
这个有个问题就是这样的.
当用户第一次提交数据的时(没刷新).
这个时候代码是没问题.
数据操作完成就removeAttribute()了.
当用户刷新时,确实不会通过.不过这个时候session.getAttribute("flag")并没有flag了..
所以程序会报错.

=============================================

这儿不会报错的,因为我的session.getAttribute("flag")是在equals()方法里
xiariguji 2006-08-16
  • 打赏
  • 举报
回复

可以再改进一下,把销毁和新建一个标识放在一起进行
sessionlistener里sessioncreated方法里

session.setAttribute("flag",初始值);

生成表单页面时
<input type=hidden name="flag" value="<%=session.getAttribute("flag")%>">

表单处理时
Integer flag = new Integer(Integer.parseInt(request.getParameter("flag")));
if(flag.equals(session.getAttribute("flag")){
//更新数据
resetFlag();
}else{
//重复提交了,处理代码
}

void resetFlag(){
session.setAttribute("flag",rand.nextInt);
}




这个代码确实避免了程序的报错.
采用的原理是随即生成的随即数很大程度上是不会相同的.
不过也要避免.万一你提交后产生的随即数和开始的相同(虽然几率很小.几乎没有.)
可是程序开发,要做到能避免就避免的.
所以我觉得在void resetFlag()
{
Integer flags=new Integer(rand.nextInt());
if(flags==flag)
{
flags=new Integer(rand.nextInt());
}
else
{
session.setAttribute("flag",rand.nextInt);
}
}
楼主做人要厚道,记得结贴给分哦
xiariguji 2006-08-16
  • 打赏
  • 举报
回复
dreamover(梦醒了) ( ) 信誉:100 2006-8-8 11:58:18 得分: 0



显示表单的时候在session中生成一个随机数

<%
Integer flag=new Integer(rand.nextInt());
session.setAttribute("flag",flag);
%>
<input type=hidden name="flag" value="<%=flag%>">

在提交时验证
Integer flag = new Integer(Integer.parseInt(request.getParameter("flag")));
if(flag.equals(session.getAttribute("flag")){
//更新数据
session.removeAttribute("flag");
}else{
//重复提交了,处理代码
}



这个有个问题就是这样的.
当用户第一次提交数据的时(没刷新).
这个时候代码是没问题.
数据操作完成就removeAttribute()了.
当用户刷新时,确实不会通过.不过这个时候session.getAttribute("flag")并没有flag了..
所以程序会报错.
dreamover 2006-08-08
  • 打赏
  • 举报
回复
可以再改进一下,把销毁和新建一个标识放在一起进行
sessionlistener里sessioncreated方法里

session.setAttribute("flag",初始值);

生成表单页面时
<input type=hidden name="flag" value="<%=session.getAttribute("flag")%>">

表单处理时
Integer flag = new Integer(Integer.parseInt(request.getParameter("flag")));
if(flag.equals(session.getAttribute("flag")){
//更新数据
resetFlag();
}else{
//重复提交了,处理代码
}

void resetFlag(){
session.setAttribute("flag",rand.nextInt);
}
feigme 2006-08-08
  • 打赏
  • 举报
回复
楼上方法不错
也可以用
判断来源页面
当前页面刷新肯定是不过的
dreamover 2006-08-08
  • 打赏
  • 举报
回复
显示表单的时候在session中生成一个随机数

<%
Integer flag=new Integer(rand.nextInt());
session.setAttribute("flag",flag);
%>
<input type=hidden name="flag" value="<%=flag%>">

在提交时验证
Integer flag = new Integer(Integer.parseInt(request.getParameter("flag")));
if(flag.equals(session.getAttribute("flag")){
//更新数据
session.removeAttribute("flag");
}else{
//重复提交了,处理代码
}
  • 打赏
  • 举报
回复
struts框架有利用Token(就是楼上所说的随机数)防止重复提交的部分,楼主可以参考一下
  • 打赏
  • 举报
回复

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧