精华内容
下载资源
问答
  • 防止重复提交 之 更强大的tokenSession拦截器
  • 表单提交tokenSession

    千次阅读 2018-05-06 10:50:38
    <result>/jsp/admin/adminmanage.jsp <result name="createAdminError">/jsp/admin/createadmin.jsp <!--由于默认的拦截器栈中没有令牌的... <interceptor-ref name="tokenSession" />  </action>
    <action name="createadmin" class="createadmin">
    
    <result>/jsp/admin/adminmanage.jsp</result>
    <result name="createAdminError">/jsp/admin/createadmin.jsp</result>

    <!--由于默认的拦截器栈中没有令牌的拦截器,所以要先配上默认的拦截器栈-->

                            <interceptor-ref name="defaultStack" />  

     <!-- 重复提交的表单就也会导向正常页面,但后台只处理了一次。 -->

                            <interceptor-ref name="tokenSession" /> 

    <interceptor-ref name="SessionInterceptor" />
    </action>
    展开全文
  • JavaEE Struts2利用tokenSession防止重复提交
  • HiMagpie 管家,维护并验证 TokenSession和接受推送消息和分发
  • 简书的文章 ...     Token机制 ...在这样的流程下,我们需要考虑下面几个问题: ...服务端如何根据token获取用户的信息?... 非法客户端拦截了合法客户端的token,然后使用这个token向服务端发送请求...

    简书的文章

    https://www.jianshu.com/p/e0ac7c3067eb

     

     

    Token机制

    在这样的流程下,我们需要考虑下面几个问题:

    1. 服务端如何根据token获取用户的信息?
    2. 如何确保识别伪造的token?
      这里是指token不是经过服务端来生成的。
    3. 如何应付冒充的情况?
      非法客户端拦截了合法客户端的token,然后使用这个token向服务端发送请求,冒充合法客户端。

    防伪造

    一般情况下,建议放入token的数据是不敏感的数据,这样只要服务端使用私钥对数据生成签名,然后和数据拼接起来,作为token的一部分即可。比如JWT,参考JSON Web Token - 在Web应用间安全地传递信息

    在我知道JWT之前,我先了解的是另一种模式。基于加密的算法,对数据进行加密,把加密的结果作为token。

    本文主要讨论后一种模式。

    防冒充

    加干扰码

    服务端在生成token时,使用了客户端的UA作为干扰码对数据加密,客户端进行请求时,会同时传入token、UA,服务端使用UA对token解密,从而验证用户的身份。

    如果只是把token拷贝到另一个客户端使用,不同的UA会导致在服务端解析token失败,从而实现了一定程度的防冒充。但是攻击者如果猜到服务端使用UA作为加密钥,他可以修改自己的UA。

    有效期

    给token加上有效期,即使被冒充也只是在一定的时间段内有效。这不是完美的防御措施,只是尽量减少损失。

    服务端在生成token时,加入有效期。每次服务端接收到请求,解析token之后,判断是否已过期,如果过期就拒绝服务。

    token刷新

    如果token过期了,客户端应该对token续期或者重新生成token。这取决于token的过期机制。

    1. 服务器缓存token及对应的过期时间
      这个时候就可以采用续期的方式,服务器更新过期时间,token再次有效。
    2. token中含有过期时间
      这个时候需要重新生成token。

    在token续期或者重新生成token的时候,需要额外加入数据来验证身份。因为token已经过期了,即token已经不能用来验证用户的身份了。这个时候可以请求用户重新输入账号和密码,但是用户体验稍差。

    另一种方式是使用摘要。服务端生成token,同时生成token的摘要,然后一起返回给客户端。客户端保存摘要,一般请求只需要用到token,在刷新token时,才需要用到摘要。服务端验证摘要,来验证用户的身份。因为摘要不会频繁的在客户端和服务端之间传输,所以被截取的概率较小。



    作者:heyikan
    链接:https://www.jianshu.com/p/e0ac7c3067eb
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



    作者:heyikan
    链接:https://www.jianshu.com/p/e0ac7c3067eb
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

     

     

    外国人的博文(关于 Token,你应该知道的十件事

    https://auth0.com/blog/ten-things-you-should-know-about-tokens-and-cookies/

    翻译成中文

    http://ju.outofmemory.cn/entry/134189

    网友的讨论

     

    更多的详见: 
    http://www.slideshare.net/derekperkins/authentication-cookies-vs-jwts-and-why-youre-doing-it-wrong

     

     

     

     

     

     

     

     

    展开全文
  • 方法一:token ... 使用struts中的OGNL表达式,...并在表单第一次提交成功后删掉该token,当重复提交表单时,将tokensession中的token值比较,若相同,则提交通过,若不成功,则不通过; struts.xml: 需要在actio

    方法一:token

    html:
    使用struts中的OGNL表达式<s:token/>,该表达式会在表单隐藏域中增加两个新的表单:
    同时在session中创建一个唯一的token,和隐藏表单元素token一致;并在表单第一次提交成功后删掉该token,当重复提交表单时,将token和session中的token值比较,若相同,则提交通过,若不成功,则不通过;

    struts.xml:
    需要在action类中配置token拦截器,token拦截器不在defaultStack中,所以需要先引用defaultStack,再配置token;
    <action name="token" class="com.bcu.action.Test1Action">
     <interceptor-ref name="defaultStack"></interceptor-ref>
     <interceptor-ref name="token"></interceptor-ref>
     <result type="redirect" name="success">/success.jsp</result>
     <result name="invalid.token">/fail.jsp</result>
    </action>
    注意:name为success的结果视图 必须是重定向 ,否则没有效果;

         方法二:tokenSession
    html:
    使用struts中的OGNL表达式<s:token/>,该表达式会在表单隐藏域中增加两个新的表单:
    同时在session中创建一个唯一的token,和隐藏表单元素token一致;并在表单第一次提交成功后删掉该token,当重复提交表单时,将token和session中的token值比较,若相同,则提交通过,若不成功,则不通过;

    struts.xml:
    需要在action类中配置token拦截器,tokenSession拦截器不在defaultStack中,所以需要先引用defaultStack,再配置tokenSession;tokenSession拦截器只会处理第一次提交的数据,当重复提交时,则不处理;
    <action name="token" class="com.bcu.action.Test1Action">
     <interceptor-ref name="defaultStack"></interceptor-ref>
     <interceptor-ref name="token"></interceptor-ref>
     <result type="redirect" name="success">/success.jsp</result>
    </action>

    token和tokenSession比较:
    1.token可以在用户重复提交后,提示用户。重定向到反馈结果页;
    2.使用token拦截器,如果发生重复提交时,页面会自动跳转到invalid.token的这个result页面;使用tokenSession拦截器时,依然会响应目标页面,但不会执行tokenSession之后的拦截器,就像什么都没有发生一样。













    展开全文
  • 因为struts2阻塞tokenSession的id值相同的访问,最初的访问结束后直接返回到正常处理代码,后面的访问略过,即只处理第一次访问。 按理说使用tokenSession可以不配置invalid.token的result,但是偶尔有种情况会提示...

    因为struts2阻塞tokenSession的id值相同的访问,最初的访问结束后直接返回到正常处理代码,后面的访问略过,即只处理第一次访问。

    按理说使用tokenSession可以不配置invalid.token的result,但是偶尔有种情况会提示“No result defined for action com.syq2cy.test.LoginAction and result invalid.token”,就是如下情况:

    在<s:token/>的页面点击提交时,form提交前做了一次ajax访问,在这次ajax访问中会做tokenSession的id判断,但ajax访问未将tokenSession作为参数提交到后台,就会返回invalid.token。代码:

        @Override

        protected String handleToken(ActionInvocation invocation) throws Exception {

            //see WW-2902: we need to use the real HttpSession here, as opposed to the map

            //that wraps the session, because a new wrap is created on every request

            HttpSession session = ServletActionContext.getRequest().getSession(true);

            synchronized (session) {

                if (!TokenHelper.validToken()) {   //判断参数中是否有tokenSession ajax返回false

                    return handleInvalidToken(invocation);   // 走这

                }

                return handleValidToken(invocation);

            }

     

        }

     

     

      protected String handleInvalidToken(ActionInvocation invocation) throws Exception {

            ActionContext ac = invocation.getInvocationContext();

     

            HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);

            HttpServletResponse response = (HttpServletResponse)             ac.get(ServletActionContext.HTTP_RESPONSE);

            String tokenName = TokenHelper.getTokenName();

            String token = TokenHelper.getToken(tokenName);

     

            if ((tokenName != null) && (token != null)) {   // 都是null

               ......

            }

            return INVALID_TOKEN_CODE;   // 即invalid.token

    }

     

     

    解决办法:

    <interceptor-ref name="token">

       <param name="includeMethods">login</param> // 加上这个就ok了

    </interceptor-ref>

     

    另:1、Unexpected Exception caught setting 'token' on...这个东西不必在意,是params的问题。

           2、很多博客上都说第一次访问tokenSession比对成功后,session重新弄个数,这是不对的,应该是从session中清空这次的tokenSession,所以第二次访问的时候session中的tokenSession已经是null了,代码:public class TokenHelper{

               public static boolean validToken(){

                   ...

                   session.remove(tokenSessionName);

               }

           }

    作者:sunyq

    展开全文
  • 测试的过程中,经常会有这样的疑惑,什么是Cookie,什么是Session什么是Token,三者的区别又是什么,又是怎么使用的呢,这个文档跟大家详细介绍下三者的区别与使用
  • Struts2 tokenSession

    千次阅读 2013-08-09 11:23:47
    标签和token拦截器连用,解决了重复提交问题,用法极其简单:Action引用token拦截器,标签内加一个标签,两句话就足以概括,一分钟就足以做完。 但是结果稍稍有点遗憾:对于一次正常提交和一次重复提交,使用token...
  • # 获取sessionid def get_sessionid(self): # 是要从localStorage中获取还是要从sessionStorage中获取,具体看目标系统存到哪个中 # window.sessionStorage和直接写sessionStorage是等效的 # 一定要使用return,不然...
  • SessionToKen的区别

    2020-10-21 09:34:28
    session也是一个域对象之一,它的范围是在一个会话范围之类有效,session既然是域对象,那么当然就要有getAttribute()和setAttribute()系列的方法了 Token概述 1、Token的引入:Token是在客户端频繁向服务端请求数据...
  • token cookie session的区别 大家好,我是酷酷的韩~ 一.Cookie简介 cookie是一个非常具体的东西,指的是浏览器里能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。cokkie由服务器生成,发送给浏览器,...
  • 1.session session不是在浏览器第一次请求时创建,而是在第一次使用时创建(request.getSession())。 最终创建逻辑在org.apache.catalina.connector.Request的doGetSession()方法中,如下代码可以看到,这里会让...
  • 会话机制(Session)是用于识别用户身份的方法之一,但是由于需要服务器保存所有人的session id,如果访问服务器多了,就得有成千上万或者几十万个。这对服务器是一个巨大的开销,严重的限制了服务器的拓展能力。因此...
  • 为什么使用tokensessiontoken的区别

    万次阅读 多人点赞 2019-03-22 14:49:18
    二、token认证机制 一、session的状态保持及弊端 当用户第一次通过浏览器使用用户名和密码访问服务器时,服务器会验证用户数据,验证成功后在服务器端写入session数据,向客户端浏览器返回sessionid,浏览器将...
  • SessionToken 的区别

    万次阅读 多人点赞 2018-06-19 20:47:23
    1. 为什么要有session的出现?答:是由于网络中http协议造成的,因为http本身是无状态协议,这样,无法确定你的本次请求和上次请求是不是你发送的。如果要进行类似论坛登陆相关的操作,就实现不了了。2. session生成...
  • 为什么要有session的出现? 答:是由于网络中http协议造成的,因为http本身是无状态协议,这样,无法确定你的本次请求和上次请求是不是你发送的。如果要进行类似论坛登陆相关的操作,就实现不了了。 session生成...
  • token (需要django的rest_framework.authtoken模块) 客户端通过post请求发送username和password到服务器端,服务器端验证用户名和密码正确后返回一个token 客户端接受返回的token并保存 客户端发起请求时需要在请求...
  • Token Session是将要验证的信息存储在服务端,并以SessionId和数据进行对应,SessionId由客户端存储,在请求时将SessionId也带过去,因此实现了状态的对应。而Token是在服务端将用户信息经过Base64Url编码过后传给...
  • OAuth Token基于spring session实现单点登录
  • TokensessionID

    千次阅读 2017-06-01 17:28:32
    一、我们先解释一下他的含义: 1、Token的引入:Token是在...2、Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客
  • 关于tokensessionid的一些说法

    千次阅读 2018-02-23 10:17:02
    摘自: bbs 作者:chendejia2012其实token就相当于sessionId,为什么app喜欢用token,而不用sessionId呢?app说他们保管cookie不方便,不好维护cookie,因为cookie是浏览器的东西,app天生不支持cookie。我觉得很奇怪...
  • Sessionid和Token的区别

    万次阅读 2018-07-24 22:45:59
    SessionToken的区别 在理解Session和Cookies的区别后:传送门 1、session出现的原因 因为http协议本身是无状态的,这样你本次请求和上次请求无法判断是不是同一个人操作的。 2、session的生成方式 浏览器在...
  • Token&Session简介

    2020-07-17 16:51:39
    Session 一、我们先解释一下他的含义: Token 的引入:Token 是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,...
  • cookie、sessiontoken的真正区别

    万次阅读 多人点赞 2019-05-09 11:21:24
    这样一来, 我就不保存session id 了, 我只是生成token , 然后验证token , 我用我的CPU计算时间获取了我的session 存储空间 ! 解除了session id这个负担, 可以说是无事一身轻, 我的机器集群现在可以轻松地做...
  • Cookie在计算机中是个存储在浏览器目录中的文本文件,当浏览器运行时,存储在RAM中发挥作用(此种 Cookies 称作 Session Cookies),一旦用户从该网站或服务器退出,Cookie可存储在用户本地的硬盘上(此种Cookies...
  • 一篇文章弄懂cookie、sessiontoken

    千次阅读 2018-11-05 19:33:13
    概念 cookie ...sessiontoken算是一类的,他们是两种不同的服务器的验证方式。 通俗来说,cookie会存一个value在客户端本地,然后将value附到HTTP上发给服务器,那么服务器是怎么通过这个value...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 109,540
精华内容 43,816
关键字:

tokensession