在处理JSP页面重复提交之前,首先要明白request和session的概念.并且很清晰的知道他们各自的工作原理.
Session,存在于服务器端的内存中,当客户端发送request到服务端,包含的session信息为sessionId. request.getSession().这个方法是经常使用的一个方法,但是它并不是表示session就存在于request中,而是request通过sessionId从服务器的内存中取得session这个对象.
还有一个方法,session.setAttribute(),这个方法,是把一个对象保存到了客户端了么?没有,这个方法只把对象保存在了服务端的内存中.
从这里就很清晰的明白了一个道理,在session中的对象不一定会在request中存在,而request中的对像也不一定会在session中存在.
接下来来说防止重复提交的原理:
说简单点,防止重复提交的原理就是在服务端和在客户端同时存在一个Token,当客户端发送一个request到服务端的时候,包含这个token的信息,当然,这个请求同样会包含当前的sessionID,
当请求到达服务端的时候,服务端用过sessionID去得到当前的session,并且在该session中查找改Token,并且与request中所包含的Token进行比较,如果相同责为有效请求,在请求有效之前从session将该Token删除,这样,如果重复提交,则为无效请求.
用一段代码来表示吧.
首先定义两个变量
public static String TOKEN_FOR_SESSION="token.for.session";
public static String TOKEN_FOR_REQUEST="token.for.request";
这两个字段不需要太多的解释.
考虑add这个方法需要防止重复提交,因此在add发出的这个request的时候,一定需要包含这个TOKEN,
因此,需要增加一个toAdd这样一个方法,在这个方法中,转向add这个页面,而toAdd这个方法中的概要代码:
String token=getToken();
request.setAttribute(TOKEN_FOR_REQUIRED,token);
session.setAttribute(TOKEN_FOR_SESSION,token);
request.getRequestDispatcher("/add.jsp").forward(request,response);
对于这段代码也不需要太多的解释
在add.jsp中包含如下信息:
<input type="hidden" value="${token.for.request}"/>
在add的action处理中:
String savedToken=request.getSession().getAttribute(TOKEN_FOR_SESSION).toString();
String requestToken=request.getParameter(TOKEN_FOR_REQUEST);
request.getSession().removeAttribute(TOKEN_FOR_SESSION);
if(savedToken.equals(requestToken))
{
//TODO:your own business logic.
}
这个就是防止重复提交的概要思想.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/seablue_xj/archive/2009/12/03/4934367.aspx
分享到:
相关推荐
这种方法可以防止跨站请求伪造(CSRF)攻击,同时也可防止重复提交。 4. **Session存储状态** 另一种方法是利用session存储用户的提交状态。当表单被提交后,将一个标识符存入session,然后在处理请求时检查这个...
本篇文章将深入探讨如何防止表单重复提交,主要关注于基于Struts2框架的解决方案。 首先,理解表单重复提交的原因。用户在点击提交按钮后,如果网络延迟或用户误操作导致页面刷新或再次点击提交,就可能发生重复...
### JSP重复提交问题及其解决方法 #### 一、引言 在Web应用程序开发中,尤其是在使用Java Server Pages (JSP)技术时,一个常见...在实际应用中,结合多种方法可以更有效地防止重复提交,提高系统的健壮性和用户体验。
本文将深入探讨自定义标签在防止重复提交中的实现原理和应用。 首先,我们要理解什么是自定义标签(Custom Tags)。在JavaServer Pages(JSP)中,自定义标签是扩展JSP功能的一种方式,它可以封装复杂的业务逻辑...
// 提交后移除token,防止重复提交 } else { // 重复提交,显示错误信息... } %> ``` 以上就是关于防止JSP表单重复提交的相关知识,包括客户端和服务器端的策略,以及如何在实际项目中运用这些策略。通过这些...
在Web开发中,防止表单重复提交是一个常见的需求,尤其是在处理敏感数据或者执行不可逆操作时。Struts2为解决这个问题引入了Token机制,确保每个表单提交只被处理一次,避免了由于用户意外刷新页面导致的重复请求。 ...
拦截器防止重复提交的设置步骤 在 Struts2 框架中,防止重复提交是一个非常重要的安全性问题。重复提交可能会导致数据的不一致和系统的不稳定。为了解决这个问题,Struts2 提供了拦截器机制来防止重复提交。在本文...
本文将探讨三种防止JSP表单重复提交的方法。 首先,我们可以使用JavaScript来阻止表单的多次提交。这种方法通过设置一个全局变量`checkSubmitFlg`来跟踪表单是否已经提交过。当用户尝试提交表单时,`checkSubmit()`...
浅谈利用Session防止表单重复提交 Session是Web应用程序中的一种机制,用于存储用户的会话信息。在Web应用程序中,表单重复提交是一个常见的问题,可能会导致数据库中产生冗余数据,浪费数据库资源。利用Session...
通过这样的设置,当用户在登录成功后刷新页面时,浏览器将会跳转到指定的页面,而不会导致重复提交表单的问题。 综上所述,Struts2框架提供了token机制以及灵活的跳转方式配置来解决表单重复提交的问题。开发者在...
在Struts的配置文件(例如`struts.xml`)中,为需要防止重复提交的Action添加一个拦截器栈,包括`token`和`tokenSession`拦截器。 ```xml <!-- 配置错误结果页面 --> <param name="includeParams">none ...
服务器验证Token的有效性,如果已经使用过或者不存在,就拒绝处理请求,从而防止重复提交。 三、Struts中实现Token机制的步骤 1. **配置Action** 在Struts配置文件中,为需要防止重复提交的Action添加一个拦截器...
在Java服务器页面(JSP)中,防止重复提交是一个重要的考虑因素,因为它可能导致数据不一致性和其他业务逻辑问题。重复提交通常发生在用户由于网络延迟或误操作而多次点击提交按钮时。以下是一些关于如何在JSP中实现...
服务器端检查这个令牌,如果已经存在,就拒绝处理请求,从而防止重复提交。 - **Session属性**:在Action中设置一个session属性,表示表单已提交。当检测到该属性已存在时,忽略后续的提交请求。 - **客户端验证**...
在这个SSH笔记中,我们将深入探讨四个核心主题:数据验证、文件上传下载、防止表单重复提交以及自定义拦截器。 首先,我们来谈谈数据验证。在Web应用中,数据验证是必不可少的一环,它确保用户输入的数据符合业务...
JSP中一种常用的方法是利用Session来防止表单的重复提交。Session在服务器端为每个用户创建一个独立的数据存储空间,可以在其中保存用户的特定信息。以下是这种方法的具体步骤: 1. **设置Session属性**:在用户...
当用户提交表单时,服务器会检查这个令牌,如果令牌有效且未被使用过,那么就允许表单处理,否则会拒绝请求,防止重复提交。 二、如何使用`s:token`标签 在Struts2中,要在表单中添加`s:token`标签,只需要在相应的...
Struts2框架提供了内置的支持来防止这种重复提交的现象。 #### 表单重复提交的原因与危害 1. **原因**:表单重复提交主要由以下几种情况导致: - 用户重复点击提交按钮。 - 浏览器的后退功能或刷新功能重新发送...