`
junier
  • 浏览: 76341 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

用struts的令牌机制解决用户重复提交的问题

    博客分类:
  • J2EE
阅读更多
在某些情况下,如果用户对一个HTML表单重复提交,Web应用应该必须能够判断用户的重复提交行为,以做相应的处理。

Struts给出了一个参考实现。org.apache.struts.action.Action类中提供了一系列和Token有关的方法:

1.protected boolean isTokenVali(javax.servlet.http.HttpServletRequest request)
判断存储在当前用户会话中的令牌值和请求参数中的令牌值是否匹配,如果匹配就返回true,否则返回false.

2.protected void resetToken(javax.servlet.http.HttpServletRequest request)
从当前session中删除令牌值。

3. protected void saveToken(javax.servlet.http.HttpServletRequest request)
创建一个新令牌,并把他保存在session范围内。

提示:具体的Token处理逻辑是org.apache.struts.util.TokenProcesor类完成的,大家可以反编译看看这个类的处理逻辑。它的generateToken(request)方法根据用户会话ID和当前的系统时间来生成一个唯一的令牌值。

流程:
比如一个注册流程,在用户请求注册页面之前,是由一个Action转发给到这个注册页面,在这个Action中加入saveToken(request)方法,创建一个Token,并把它保存在session中。然后转发给注册页面。在注册页面的<html:form>标签的处理类会判断session中是否存在Token,如果存在就在表单中生成一个隐藏域,隐藏域的值就是利用Struts的Token机制算出来的那个值。当用户接收到注册页面后就会发现在FORM表单中存在的Token的隐藏域。在用户提交了注册信息到另一个Action中时,在这个Action中用isTokenValid(request)来判断是否是重复提交,如果用户是第一次提交表单返回true,如果用户通过浏览器返回按扭,返回该页再次提交则返回false;进行错误处理。

例子:Action1:


public class RegAction extends Action 
{      
         public ActionForward execute(
              ActionMapping mapping,   
              ActionForm form,   
              HttpServletRequest request,   
              HttpServletResponse response) 
        {   
                  //调用方法生成Token   
                 saveToken(request);    
                  // TODO Auto-generated method stub   
                  return mapping.findForward("register");   
         }   
}  
public class RegAction extends Action
{
        public ActionForward execute(
                    ActionMapping mapping,
                    ActionForm form,
                    HttpServletRequest request,
                    HttpServletResponse response)
        {
                //调用方法生成Token
                saveToken(request);
                // TODO Auto-generated method stub
                return mapping.findForward("register");
        }
}


Action1转发给JSP页面:

<html:form action="/tokenAction.do" method="poset">   
<html:submit>Submit</html:submit>   
</html:form>  
<html:form action="/tokenAction.do" method="poset">
<html:submit>Submit</html:submit>
</html:form>


在这里会自动生成Token的隐藏域:

<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="164fcc77cafd18db1011da3d8ab868e5">  
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="164fcc77cafd18db1011da3d8ab868e5">

Action2: jsp页面提交给过来请求



if(!isTokenValid(request))   
{   
           System.out.println("重复提交TokenAction");   
           saveToken(request);   
           return (new ActionForward(mapping.getInput()));   
}   
else  
{   
           resetToken(request);   
           System.out.println("重新设置Token!   TokenAction");   
}  
if(!isTokenValid(request))
{
    System.out.println("重复提交TokenAction");
    saveToken(request);
    return (new ActionForward(mapping.getInput()));
}
else
{
    resetToken(request);
    System.out.println("重新设置Token!   TokenAction");
}

判断是否是重复提交,如果重复提交就转发到默认在struts-config.xml中为Action2配置的错误页面中,并重新建立一个Token。如果不是重复提交就就从当前session中删除Token.
OK,就是这些了,如果你的应用中可以返回一个错误页面,那么你也可以在filter中应用Token这些方法,只不过需要对struts的jar包进行反编译,拿到自己的类中来用。
分享到:
评论

相关推荐

    struts2令牌解决页面重复提交问题

    下面将详细讲解Struts2令牌解决重复提交问题的过程: 1. **生成令牌**:在Action中,使用`TokenAwareActionSupport`作为基类,这个类实现了`TokenSessionStore`接口,可以方便地获取和验证令牌。在表单展示之前,...

    struts的令牌机制,防止重复提交

    #### 一、Struts令牌机制简介 Struts框架通过生成一个唯一的令牌(Token),并在每次用户提交表单时验证该令牌的有效性,以此来防止重复提交。这种机制可以确保即使用户多次点击提交按钮或者浏览器回退后重新提交...

    struts token机制解决表单重复提交

    总的来说,Struts Token机制通过维护一个临时的、一次性使用的Token,有效地解决了Web应用中的表单重复提交问题,提高了系统的稳定性和安全性。在实际开发中,应根据项目需求灵活运用并优化此机制。

    struts1的令牌解决页面重复提交问题

    通过以上步骤,Struts1的令牌机制可以有效地防止页面的重复提交,保护业务数据的完整性。然而,随着技术的发展,现代框架如Spring MVC、Struts2等提供了更完善的解决方案,例如利用HTTP的幂等性或一次性令牌(如CSRF...

    struts+token机制解决表单重复提交

    在提供的压缩包文件"struts+token机制解决表单重复提交"中,可能包含了具体的Struts配置文件、Action类、Interceptor实现以及示例代码,可以帮助读者更深入地理解并实践这个机制。通过对这些代码的学习和研究,...

    struts 令牌机制(Token)

    在Struts框架中,令牌机制(Token)是一种防止重复提交的有效方法,它主要用于处理表单数据的并发控制,防止用户意外或者恶意地多次提交表单,从而确保数据的一致性和安全性。 在Web应用中,用户可能会因为网络延迟...

    Struts2防止重复提交解决方案

    Struts2 是一款流行的Java Web MVC框架,用于构建企业级应用程序。在Struts2中,防止重复提交是一个重要的问题,...在实际开发中,还需要考虑其他因素,如异常处理、用户体验优化等,以提供更完善的防重复提交机制。

    使用struts的同步令牌避免form的重复提交

    ### 使用Struts的同步令牌避免表单重复提交 ...通过上述步骤,我们可以有效地利用Struts框架内置的同步令牌机制来避免表单重复提交的问题。这种方法不仅提高了应用程序的安全性,还简化了开发过程中的相关处理逻辑。

    struts2的令牌机制

    Struts2的令牌机制是其防止重复提交和CSRF(跨站请求...总的来说,Struts2的令牌机制是Web应用程序安全策略的重要组成部分,通过合理的配置和使用,可以有效地防止重复提交和CSRF攻击,确保用户交互的完整性和安全性。

    Struts解决重复提交步骤

    通过以上步骤,我们可以有效地利用Struts框架内置的令牌机制来解决表单重复提交的问题。这种方法简单易行,同时也能提高应用的安全性和用户体验。在实际项目中,可以根据具体需求灵活调整令牌的有效期、验证逻辑等,...

    用STRUTS的TOKEN机制解决表单重复提交,转载自:百度文库

    Struts的Token机制是Web应用中防止表单重复提交的一种常用方法。在处理表单提交时,如果用户意外地多次...在阅读《用Struts的Token机制解决表单重复提交.doc》文档时,可以更深入地学习如何在实际项目中应用这一机制。

    解决Struts重复提交

    防止Struts中的重复提交是Web应用开发中的重要环节,通过合理运用Token机制、OWSM或者自定义控制器验证,可以有效地避免此类问题。在实际开发中,我们需要结合项目的具体需求,选择合适的防重复提交策略,以确保系统...

    Servlet、Struts、SpringMVC对于表单重复提交的解决方案

    总结来说,Servlet、Struts和SpringMVC都提供了各自的解决方案来防止表单重复提交,主要方法包括使用Session、令牌机制、重定向和拦截器等。开发者可以根据项目需求选择合适的方式来实现,确保应用的稳定性和数据...

    Struts表单重复提交问题

    Struts框架是一个经典的Java Web开发框架,用于构建MVC(模型-视图-控制器...在实际开发中,除了Struts的令牌机制,还可以结合前端的解决方案,如禁用提交按钮、使用AJAX异步提交等,来进一步增强防止重复提交的效果。

    Struts之Token解决表单那重复提交

    综上所述,Struts框架通过Token机制有效地解决了表单重复提交的问题,提供了更健壮的Web应用安全性。正确理解和应用这一机制对于Java Web开发者来说至关重要。在实际项目中,结合其他防御策略,如CSRF防护,可以...

    struts令牌token实例

    通过以上步骤,你可以实现一个基本的Struts2令牌机制,有效地防止重复提交问题。记住,令牌机制虽然能提供一定的防护,但并不是万能的,还需要结合其他安全措施,如CSRF防护,以确保应用的安全性。 在你提供的...

    struts1.2之token解决重复提交

    Token机制是一种防止重复提交的方法,它通过在客户端(通常是浏览器)和服务器之间交换一个唯一的、一次性使用的令牌来确保请求的独特性。当用户提交表单时,服务器会生成一个随机的Token并将其存储到会话(Session...

    通过xml配置搞定Struts重复提交问题

    在本文中,我们将深入探讨如何通过XML配置来解决Struts中的重复提交问题。 首先,理解重复提交的原因。在Web应用中,用户点击提交按钮后,如果网络延迟或刷新页面,同一个请求可能被发送多次。Struts框架默认情况下...

Global site tag (gtag.js) - Google Analytics