`

struts中的令牌 token

 
阅读更多

Token 令牌
    org.apache.struts.util.TokenProcessor 令牌处理器
    在 action 中使用令牌环
    为了避免用户通过浏览器的后退功能.出现重复提交的可能.struts可以用token来解决重复提交的问题

令牌处理:
    当点击 submit 提交表单时,给 request 生成一个令牌(由框架生成或自己写),到 action 调用 saveToken
    给 session 生成一个令牌。由于是同一时间生成的,所以两个 令牌 是相同的。
   
    当 刷新/回退/直接访问action 这样的方式访问action,并没有走submit,
    request 没有记录时间,或者时间是 旧的,这个令牌 没有 或者 是旧的。
    当到action中时, 使用 saveToken 给 session 生成一个令牌。
   
    这时 比较两个令牌是不同的。也就是  request 和 session 中记录的时间是不同的。
   
    每次 submit 提交时 ,客户端 和 服务器端 的 token 是新的,一致的。
    当 刷新 页面是, 只有 服务器端的 token 是新的,所以两者不一致。
     
    如果你在 action 中方法里加了“saveToken(request);”这一句,那在 action 对应的页面上,
    会多一个隐藏字段,类似于这样
    〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉
    当然这个值是动态生成的,每次submit  request 和 session 的 token 是一致的。
     

action 配置:
    <action name="personForm" type="com.action.addPersonAction" validate="false" 
    input="/person/addPerson.jsp" scope="request" path="/addPerson" />

action 的 execute 方法要这样写:    
    ActionForward forward = mapping.getInputForward();
    
    saveToken(request); // 加上这句,跳转到 inputForward 页面时就会生成 request 令牌 的 隐藏参数
    if (request.getParameter("flag_todo") == "add")
    {
        if(isTokenValid(request, true))
        {
            // ...
            service.savePerson();
        }
        else
        {
            // 重复访问 action 
        }
        return mapping.findForward("anotherAction");
    }
    
    return forward;

 
       
org.apache.struts.action.Action 中关于令牌的方法
    saveToken(request)              生成令牌并保存到 session 作用域中
    generateToken(request)          生成令牌
    isTokenValid(request, reset);  
        取出 session 中的令牌 与 request 当中的令牌 比较,如果相同则说明在同一session中第二次访问action。
    isTokenValid(request);          调用 token.isTokenValid(request, false);
    resetToken(request)
   
生成令牌:
    session的标识符+当前时间戳  生成的 md5 码 的 十六进制 字符串
    调用action的 saveToken
   
   

public synchronized String generateToken(HttpServletRequest request)
    {
        HttpSession session = request.getSession();    
        try {
            byte[] id = session.getId().getBytes();    // session 的标识符字符串
            long current = System.currentTimeMillis();
            if (current == this.previous) {
            current += 1L;
            }
            this.previous = current;
            byte[] now = new Long(current).toString().getBytes();     // 当前时间戳 字符串
            MessageDigest md = MessageDigest.getInstance("MD5");      // md5 算法
            md.update(id);
            md.update(now);
            return toHex(md.digest());
        }
        catch (NoSuchAlgorithmException e)
        {
        }
        return null;
    }

 
   

分享到:
评论

相关推荐

    struts令牌token实例

    在你提供的压缩包文件"token"中,可能包含了一个简单的Struts2令牌实例,你可以通过查看源代码学习如何在实际项目中集成和使用令牌机制。学习和理解这个实例,将有助于你更好地理解和应用Struts2的令牌功能。

    struts 令牌机制(Token)

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

    struts2令牌

    当用户提交表单时,Struts2会检查表单中包含的令牌值是否与`session`中存储的令牌值相匹配。如果不匹配,则认为此次提交无效,可以通过配置拦截器来进行处理。例如,在`struts-default.xml`文件中定义了一个默认的...

    Struts1.x令牌(Token)的使用.rar

    2. 实现TokenAware接口:为了让ActionForm能够访问session中的令牌,需要让ActionForm实现`org.apache.struts.action.TokenAware`接口,并实现`setToken(String token)`方法。 3. 生成令牌:在Action中,如`execute...

    struts2_token控制刷新重复提交

    3. **验证Token:** 在处理表单提交的Action方法中,Struts2的Token拦截器会自动进行Token验证。如果验证失败(比如因为用户刷新页面),拦截器会抛出一个`TokenException`,你可以捕获这个异常并处理。 ```java ...

    struts2 令牌使用例子

    1. **配置Struts2拦截器**:在struts.xml配置文件中,需要添加`token`和`tokenSession`拦截器到默认栈或自定义的拦截器栈中。`token`拦截器负责在表单中插入令牌,而`tokenSession`拦截器则负责验证令牌。 ```xml ...

    struts2的令牌机制

    令牌(Token)是一个唯一的、随机生成的字符串,它被附加到表单中,并在服务器端进行验证。当用户提交表单时,服务器会检查这个令牌是否有效,如果有效则处理请求,无效则拒绝。这防止了恶意用户通过复制粘贴或重复...

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

    Struts2提供了一种称为“令牌”或“Token Session”的机制来解决这个问题。 令牌机制的工作原理是,在用户提交表单前,服务器会生成一个唯一的令牌,并将其添加到表单中隐藏字段或者放入session。当用户提交表单时...

    struts2token回退刷新

    1. **令牌生成**:当用户访问一个需要防护的表单页面时,Struts2框架会在服务器端生成一个唯一的令牌,并将其存储在服务器的会话(Session)中。同时,这个令牌会被添加到HTML表单中,通常作为隐藏字段的形式传递给...

    struts1.2之token解决重复提交

    在Struts1.2中,Token机制是通过`org.apache.struts.action.TokenAction`类实现的。这个类提供了一个`execute()`方法,该方法会检查Token并处理请求。为了使用Token机制,你需要在Action配置文件中添加相应的配置,...

    [浪曦原创]Struts系列 第9讲 Struts的令牌使用(zk001)

    在Struts框架中,令牌机制(Token)是一种重要的防止重复提交的安全策略。本讲将深入探讨Struts中的令牌使用及其原理。 首先,理解为什么需要令牌机制。在Web应用中,用户可能会意外或恶意地多次点击提交按钮,导致...

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

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

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

    在Struts的配置文件中定义一个Token拦截器,拦截所有需要防止重复提交的Action,然后在拦截器中实现Token的验证逻辑。 通过这种方式,Struts+Token机制可以有效地防止由于用户误操作或者网络延迟造成的表单重复提交...

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

    为了解决这个问题,Struts1引入了“令牌”机制,也称为Token Session或Token Interceptor。下面我们将详细探讨如何使用Struts1的令牌来防止页面重复提交。 ### 1. 令牌机制概述 令牌机制的基本思路是在用户提交...

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

    本文将深入探讨如何在Struts框架中利用Token机制来解决这个问题。 一、表单重复提交问题 表单重复提交可能发生在用户点击提交按钮后,由于网络延迟或刷新页面等原因,导致请求被多次发送到服务器。如果不加以控制,...

    struts标准库实现令牌

    二、Struts令牌的实现步骤 1. 添加Struts令牌拦截器 在Struts的配置文件(通常为struts.xml)中,需要添加`token`和`tokenSession`拦截器到默认的拦截器栈。`token`拦截器负责在表单请求时生成和验证令牌,`token...

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

    Token(令牌)是一种临时的、唯一的标识符,它通常在服务器端生成,并在客户端的一次性操作中使用。在表单提交过程中,服务器会将Token附加到表单中,当客户端提交表单时,服务器会验证这个Token是否有效且未被使用...

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

    Struts Token机制的核心思想是在客户端(浏览器)和服务器端(应用服务器)之间维持一个唯一的令牌(Token)。当用户首次提交表单时,服务器会生成一个随机的、唯一标识的Token,并将其存储到用户的会话(Session)...

    Struts1.x实现防止提交的Token使用示例

    Token机制是一种有效的防护手段,它通过在表单中添加一个唯一的、随机的令牌值,并在服务器端验证这个令牌来确保请求的合法性。以下是对Struts1.x中使用Token防止提交的详细说明: 1. **理解Token机制**: Token...

    利用Struts2的令牌机制。

    在Struts2中,令牌机制是用于防止重复提交(Duplicate Form Submission)和跨站请求伪造(Cross-Site Request Forgery, CSRF)的安全措施。下面我们将深入探讨这一机制。 首先,我们需要理解什么是重复提交。当用户...

Global site tag (gtag.js) - Google Analytics