精华内容
下载资源
问答
  • 用第一个浏览器访问项目,得到一个sessionId 再用第二个浏览器访问项目,得到第二个SessionId 分别刷新这两个页面,发现这两个SessionId在同一个会话中出现
  • 我想问一下,如果是同一个浏览器,一开始是a用户登陆,这时服务器会创建一个sessionid(这里 会把sessionid存储到cookie中)。此时a用户退出,cookie中还是保留之前的sessionid。 那么如果用户b登录,那么按道理会从...
  • 在昨天我在写代码的过程中出现一个BUG,是以为上下的SessionID不一致,导致我不能精准地获取到我上面存在Session。 这个BUG我找了好久都没找出来,后来在老师的帮助下解决了这个问题。 原因: 上面的的...

        在昨天我在写代码的过程中出现了一个BUG,是以为上下的SessionID不一致,导致我不能精准地获取到我上面存在Session。

    这个BUG我找了好久都没找出来,后来在老师的帮助下解决了这个问题。

    原因:

     

    上面的的SessionID和下面获取的那个SessionID不一致导致的。

    我是调用一个方法生成一个4位数的字符串,然后把生成的字符串存在一个Session["validCode"]里。

    然后在下面我要把Session["validCode"]里面的数据获取出来,但是我发现获取不了Session["validCode"]session里面的数据, 而是获取了一个新的session给我,但这个session里面没有我要获取的数据,所有sessionValiCode里面的值一直为空。

     

    解决方法:特别简单,就在到浏览器把浏览器的设置重置一下就可以了。

        所有有时候你发现你代码没有问题,但它就是实现不了那个效果这就有可能是浏览器的问题的。

        例子:你把CSS插件或JS插件改了,但是他还是停留在没改之前的那个效果或样式。

    这就是一个浏览器的缓存问题。解决方法就是去把浏览器的缓存给清除掉。

     

    这是我的一些经验,有什么错的请指出。

    展开全文
  • 查看dev tools—>network时发现,有两个sessionid一个是spring session中指定的customSessionId,一个是tomcat默认的jsessionid, <!--spring-applicationcontext.xml中指定的customSessionI

    背景

    项目使用了spring session,并用redis存储,以实现分布式环境下session同步;查看dev tools—>network时发现,有两个sessionid,一个是spring session中指定的customSessionId,一个是tomcat默认的jsessionid,
    这里写图片描述

    <!--spring-applicationcontext.xml中指定的customSessionId-->
    <bean id="defaultCookieSerializer"
              class="org.springframework.session.web.http.DefaultCookieSerializer">
            <property name="cookieName" value="customSessionId" />
            <property name="cookiePath" value="/" />
    </bean>

    这里我就产生了疑问?明明指定了sessionId为什么还会有默认的jsessionid?既然spring统一管理了session就不会再有新session了呀?!并且在check network中请求后,却发现没有任何请求产生jsessionid,但是application中的的确确产生了jsessionid!

    问题

    截止到现在产生了两个问题,

    • http请求中没有set-cookie,却产生了jsessionid
    • tomcat产生两个sessionid,一个是自定义的sessionid(customSessionId),一个是默认的jsessionid;

    探索

    意想不到的source map

    为了查清楚第一个问题,使用了排除大法,使用折半删除,最终定位到jquery-migrate-1.1.1.min.js这个文件,如果不引用此文件则没有jsessionid,为了排除js创建jsessionid的可能,搜索文件内容并未发现jsessionid或cookie的代码,这时想到chrome的请求与fiddler的请求不一样让fiddler抓包也许能看到不一样的东西,
    这里写图片描述
    果然不一样,凭空多了jquery-migrate.min.map请求且产生了jsessionid,几经搜索,得知这是source map,相当于min.js文件对应的源代码,chrome dev tools默认会下载此文件,至此我们明白了,因为是chrome浏览器本身发送的,所以在network中看不见而fiddler却能抓出来。
    当然,我们可以关闭下载source map,

    dev tools---->settings--->sources--->enable javascript source maps 去掉勾选

    jsp中的session

    我们注意到min.map请求响应代码是404,并且产生了jsessionid,没有办法只能跟踪java源代码,追踪到StandardHostValve,执行完invoke方法后,就会产生setCookie,可以排除filter产生jsessionId的可能,再看404.jsp,发现没有指定session=”false”,所以会创建session,在invoke方法这一步等于执行了request.getSession(),因为这时的request已经是原始的request,未经spring包装的request肯定会产生原始的jsessionid,所以有两个sessionid,通过在404.jsp中指定session=”false”就不会再从产生jsessionid;
    这里写图片描述

    原理

    再回过头来说一下这个事情的原理,
    spring session的原理是通过filter,暂且就叫它SpringSessionFilter吧,document要求它必须放在最前边,这样就能保证它会比其他filter先执行,它将tomcat的request、reponse,封装为spring的request、response,从而后边的filter/controller…获取到的request、response都是spring的request、response,这样在controller中request.getSession()肯定是spring制定的springSessionId。

    public void doFilter(ServletRequest request, ServletResponse response,
                             FilterChain chain)
                throws IOException, ServletException;

    但是StandardHostValve在springsessionfilter的前边执行(看上图的线程栈),所以它获取到的request、response仍然是原始的,所以此时request.getSession()获取到的就是原始的jsessionid。

    引出来的段子

    由于无法debug tomcat源码,所以standardhostvalve具体功能无从推断,这个还引出tomcat打源代码包的段子

    后记

    通过这个问题,在跟踪源码阶段,基本了解了spring session原理以及shiro的session原理,filter、filter chain、proxiedfilterchain,跟源码受益无穷呀。

    参考

    JavaScript Source Map 详解
    集成Shiro后当遇到404错误时会丢失session

    展开全文
  • 如何根据sessionID获取session解决方案

    万次阅读 多人点赞 2018-07-18 15:17:40
    最近在做一个项目的时候,本来是想通过session来存一些数据的,但是,发现当次访问的方法不同时,后台的session是不一样的,也就是说sessionId,不一致,所以导致的问题就是:当我需要从session取值的时候,总是...

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾讯等大厂offer。
    另外,原创文章首发在我的个人博客:blog.ouyangsihai.cn,欢迎访问。

    一、写在前面

    最近在做一个项目的时候,本来是想通过session来存一些数据的,但是,发现当两次访问的方法不同时,后台的session是不一样的,也就是说sessionId,不一致,所以导致的问题就是:当我需要从session取值的时候,总是出现取不到值的情况,后面也想过用redis,但是也被坑了。

    后来,想到就是通过和前端沟通,通过sessionId和前端进行交互,来保证每一次的session是一致的,所以就想到了下面的方法。

    二、以前解决方法

    根据sessionID有一个比较简单的方法,使用session上下文即可

    HttpSession sess = session.getSessionContext().getSession(sid)  
    

    不过很可惜,java之后处于安全性考虑,不建议使用这个方法,虽然我不知道为什么对安全性会有影响,但是既然java不建议用了。下面来分享一个方法,使用session监听器配合一个静态的hashmap即可实现。

    三、新的解决方法

    首先,创建自己的sessionContext

     public class MySessionContext {  
            private static MySessionContext instance;  
            private HashMap<String,HttpSession> sessionMap;  
          
            private MySessionContext() {  
                sessionMap = new HashMap<String,HttpSession>();  
            }  
          
            public static MySessionContext getInstance() {  
                if (instance == null) {  
                    instance = new MySessionContext();  
                }  
                return instance;  
            }  
          
            public synchronized void addSession(HttpSession session) {  
                if (session != null) {  
                    sessionMap.put(session.getId(), session);  
                }  
            }  
          
            public synchronized void delSession(HttpSession session) {  
                if (session != null) {  
                    sessionMap.remove(session.getId());  
                }  
            }  
          
            public synchronized HttpSession getSession(String sessionID) {  
                if (sessionID == null) {  
                    return null;  
                }  
                return sessionMap.get(sessionID);  
            }  
          
        }  
    

    然后建立session监听,要实现HttpSessionListener接口

      public class SessionListener implements HttpSessionListener {  
              
            private MySessionContext myc = MySessionContext.getInstance();  
              
            public void sessionCreated(HttpSessionEvent httpSessionEvent) {  
                HttpSession session = httpSessionEvent.getSession();  
                myc.addSession(session);  
            }  
          
            public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {  
                HttpSession session = httpSessionEvent.getSession();  
                myc.delSession(session);  
            }  
          
        }  
    

    接着,在web.xml中配置session监听器

       <listener>  
            <listener-class>com.chinapost.manager.utils.SessionListener</listener-class>  
        </listener>  
    

    注意:这个SessionListener是监听器的路径

    完事,大功告成,之后在代码中直接获取就OK了

        MySessionContext myc= MySessionContext.getInstance();  
        HttpSession sess = myc.getSession(sessionId);  
    

    好了,这样就完美的解决了问题了

    最后,再分享我历时三个月总结的 Java 面试 + Java 后端技术学习指南,这是本人这几年及春招的总结,已经拿到了大厂offer,整理成了一本电子书,拿去不谢,目录如下:

    现在免费分享大家,在下面我的公众号 程序员的技术圈子 回复 面试 即可获取。

    有收获?希望老铁们来个三连击,给更多的人看到这篇文章

    1、老铁们,关注我的原创微信公众号「程序员的技术圈子」,专注于Java、数据结构和算法、微服务、中间件等技术分享,保证你看完有所收获。

    2、给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我继续写作,嘻嘻。

    3、另外,原创文章首发在我的个人博客:blog.ouyangsihai.cn,欢迎访问。

    点赞是对我最大的鼓励
    ↓↓↓↓↓↓

    展开全文
  • sessionid一直变化,1跨域 2session冲突

    1.  第一种出现是在一个项目里面这里叫A项目,需要嵌入另外一个项目这里叫B项目,通过iframe (IE会出现)

         通过iframe引入   B项目  因为B项目里面有登录拦截,所以在A项目里面会请求登录一下,可是只要一请求B项目,就一直停留在请登录

         调试后发现每次请求都会产生一个全新的sessionid,所以才会一直出现请重新登录的界面。问题是找到了(ps:只要可以登录,到时候通过iframe就可以引入自己需要的B项目页面了)要怎么解决呢?

        百度了以后发现,IE会丢失iframe中的cookie,而session其实就是基于cookie的,客户端在第一次与服务器进行会话时,会分配给客户端sessionid保存在cookie中,然后在后面的请求中,会带上cookie, 现在IE会丢失iframe中的cookie,所以服务器会重新分配给客户端sessionid ,所以会提示一直需要登录

       所以只要设置一下p3p就可以了。

       P3P(Platform for Privacy Preferences)正是一种可以提供这种个人隐私保护策略,一般浏览器都支持P3P协议。P3P header允许跨域访问隐私数据,从而可以跨域set-cookie成功

     我是在B项目的拦截器里面加了一个p3p协议设定的代码

      HttpServletResponse res = (HttpServletResponse) ServletActionContext.getResponse();

      res.setHeader("P3P","CP=CAO PSA OUR");

      

    2.第二种是出现在外网访问的地方,第二种出现的情况是基于第一种,就是我们的A项目和B项目本来是在内网部署的,然后需要给领导看,叫网管把我们这两个项目的地址给映射到外网了。登录A项目的时候,一直提示,请重新登录

       一调试,还是一样的问题,sessionid一直在变化,那这个是什么原因呢?

       后面百度得知:因为我们的A项目和B项目映射到外网以后是ip一致,然后端口不同而已,这样子会造成session冲突

        IP相同认为是 同一个域,接收了B的set-cookie指令,把对应的cookie内容覆盖了,其中包括sessionid,造成A的session丢失。 如果 IP不同,则不会发生这个问题。IP相同的两个session对应的cookie是一样的,而不幸的是sessionID就保存在cookie中,这样先访问A,再访问B的时候,B的sessionid会覆盖A的sessionid。这个事情没办法解决,所以不能弄两个端口,要弄两个外网ip。都是cookie出现的问题,它不会区分端口,造成这多个站点不断的覆盖前面的,从而造成session的丢失


    所以在此做了一个总结


        



    展开全文
  • Chrome 51 开始,浏览器的 Cookie 新增加了一个SameSite属性,用来防止 CSRF 攻击和用户追踪。 Chrome升级到80版本后,默认限制了cross-site携带cookie,导致cookie失效 所以要嚒获取的sessionId不一样 要嚒不是...
  • 最近做的项目集成,一个项目访问另一个项目的action传用户id参数,拦截器判断该 id是否登录,未登录执行登录动作,设置进session中,实现一个假的单点登录!访问成功后,回访原项目其他的页面则该session丢失或者说...
  • sessionId的作用

    千次阅读 2018-01-15 10:57:16
    sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。tomcat生成的sessionid叫做jsessionid。session在访问tomcat服务器HttpServletRequest的getSession(true)...
  • postman中添加sessionID

    千次阅读 2019-09-03 17:07:31
    在使用postman进行接口测试时遇到一个问题,当前的操作需要有用户登录,于是在postman请求中需要sessionID 解决步骤有步:找到sessionID、将sessionID添加到请求中。 1、找到sessionID 火狐浏览器中登录系统,按...
  • 怎么实现在一个Tomcat下部署多个应用,使多个应用的sessionID(jsessionID)相同。 就是访问多个应用使他们产生的jsessionId是相同的。求大神帮忙,谢谢了!
  • 可以直接修改 header.cookie = ‘SESSION=’ + sessionId cookie里面的数据时可以考虑在后端校验成功后将当次的sessionid返回到页面,页面再修改cookie进行下次请求,如果过期了,再调用后台登录方法...
  • 可以通过SessionID和用户名来保证同一个用户不能同时登录的问题,下面程序模仿了QQ的登录,当登录后判断当前帐号是否已经登录,如果登录。则踢掉以前登录的用户。 重置sessionID private void createNewSession...
  • sessionid不一致问题

    千次阅读 2018-02-11 10:39:25
    问题是这样的,调用后端的登录接口,而且是跨域访问,在添加购物车的时候登录接口的sessionid与之前在登录页面调用接口的sessionid不一样,所以总是提示没有登录,后来在网上找了很多资料都没有解决这问题。...
  • sessionID一直变化。

    万次阅读 2017-10-16 15:41:53
    sessionID一直变化。
  • 网上能找到很多帖子说怎么实现redis来共享session,照着做完,发现两个独立应用配置到同一个redis后,获取的session id不一样。 怎么回事,他们写的不是很简单,怎么我这每次都不一样呢。 找了半天,原来spring...
  • 一个浏览器使用多个Session

    千次阅读 2016-02-24 17:25:35
    cookies session浏览器多用户
  • session和sessionID以及cookie的关系

    千次阅读 2019-04-16 12:32:10
    session的建立 session存在于服务器中,需要有httpservletrequest的request对象调用getsession方法来创建...为true时表示可以创建一个session。eg: HttpSession session = request.getSession(); tomcat服务器...
  • 为什么我登录的时候输入验证码和产生的验证码不匹配,打印了一下session发现生成验证码的session和登录时获取的session不是一个一个用户不是应该只有一个session吗,求解 # 产生验证码的session // 将图像输出...
  • 最近在做一个项目的时候,本来是想通过session来存一些数据的,但是,发现当次访问的方法不同时,后台的session是不一样的,也就是说sessionId,不一致,所以导致的问题就是:当我需要从session取值的时候,总是...
  • 如果多个应用系统,访问使用同一个域名或IP,不同端口时,在同一个浏览器登陆这些系统系统,它们之间会出现用户会话会出现覆盖问题,即登录到其中一个应用系统,其他应用系统出现重新登陆现象; 具体操作 经过分析...
  • session登录控制 后一个踢掉前一个

    千次阅读 2018-01-23 19:56:20
    最近实现项目中的用户重复登录控制,即新用户登录使前一个登录的用户强制下线 ,思路是这样的,在前台主页面写一个...1. 定义两个全局MAP 来存放用户的登录帐号(userId),session和sessionId //userid,session publ
  • 保存session id的几种方式

    千次阅读 2017-05-07 20:13:42
    保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这标识发送给服务器。 Servlet 容器将 Session ID 作为 Cookie 保存在客户的浏览器中。每次客户发出 HTTP 请求时,Servlet 容器...
  • 今天项目有个需求就是,需要在两个应用模块,假如是home和admin两个模块,要求同一个账户,帐号密码保存在session中,如果没有登陆过home,只登陆过admin,那么在跳转home应用下的控制器应该跳转到登陆界面。...
  • package test.session; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServle
  • WEB项目SESSIONID固定漏洞

    千次阅读 2017-02-15 09:46:21
    访问一个WEB页面,会看到有一个JSESSIONID,这是由服务器端在会话开始是通过set-cookie来设置的匿名SessionId 在登录进入后,再次查看SESSIONID,会发现此值未发生改变,这样,就产生了SESSIONID固定漏洞 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 385,928
精华内容 154,371
关键字:

一个网站出现两个sessionid