-
2020-06-03 00:07:48
现在的大多浏览器都是共享sessionid的,因此,在使用一个tomcat并且在一个浏览器下打开多个session的时候,新的内容会把原来的同key内容覆盖。
解决方法:
1.使用多个tomcat/多个浏览器。
2.修改conf文件,制造出localhost1、locaohost2等。
3.在前端的httpsession中以用户id(唯一的)为键进行存储用户信息,使得每次都不会覆盖上一次的内容。用户id可以通过url传参在前端进行传输。
4.在前端的js文件中定义全局变量得到userid值,但是刷新后可能再次运行新的式子被覆盖。
后来发现实现这个效果收益并不大,而且只是做上课的作业,就没深入研究了。
更多相关内容 -
同浏览器不同窗口不同用户Session问题
2018-04-10 12:57:59正对java Web项目,同浏览器同时打开两个登录窗口(不同Tag),用不同用户登录,为避免使用同一个Session,需要使用这段代码。否则先登录的用户的Session会变成后登录用户的Session.相关系统使用权限也会变。 -
同一个会话中会出现为什么出现两个不同的sessionId
2015-04-16 11:46:36用第一个浏览器访问项目,得到一个sessionId 再用第二个浏览器访问项目,得到第二个SessionId 分别刷新这两个页面,发现这两个SessionId在同一个会话中出现 -
Chrome浏览器同一窗口每次请求sessionId不同问题的一种解决办法分享
2020-08-25 13:22:33最近在调试一些浏览器请求...问题原因,由于谷歌浏览器的SameSite安全机制的问题,浏览器在跨域的时候不允许request请求携带cookie,导致每次sessionId都是新的,这里有个出问题前提:跨域,刚好和调试时的环境情...最近在调试一些浏览器请求页面的时候,在其他浏览器都正常,唯独只有谷歌chrome浏览器不行,问题的最直接现象就是每次请求在后台过滤器里通过request.getSession().getId(),拿到的id都是不同的,导致后面出现一些不正常的结果。
最后在查阅一翻资料和请教大佬们后,找到了解决办法。问题原因,由于谷歌浏览器的SameSite安全机制的问题,浏览器在跨域的时候不允许request请求携带cookie,导致每次sessionId都是新的,这里有个出问题前提:跨域,刚好和调试时的环境情况一致。浏览器版本chrome84.0.4147.135,直接在地址栏里输入chrome://flags/,然后在搜索框里搜索关键字SameSite,找到与之匹配的项SameSite by default cookies,将其设置为Disabled,然后关闭浏览器再打开,请求。如此,同窗口session没超时的情况下,每次请求就不会出现后台sessionId不同的情况。
设置截图:
-
两个用户登录,session id问题
2017-05-20 04:14:53那么如果用户b登录,那么按道理会从cookie中取出之前的那个sessionid,然后传给服务器,然后服务器端会识别这个sessionid,取出对应session的信息,那这样岂不是会造成:a用户存储在session中的信息,会被b用户看到... -
同一浏览器下sessionid互相覆盖的问题
2019-08-19 11:44:03问题描述: 在一台机器上安装多个Tomcat,端口不一样...启动两个Tomcat后,使用同一个浏览器分别访问不同的Tomcat,出现sessionid互相覆盖的情况。例如,访问tomcat1时获取的sessionid是123456,此时再去访问tomcat...问题描述:
在一台机器上安装多个Tomcat,端口不一样,这里姑且分别称为tomcat1 和 tomcat2,在两个不同的Tomcat上部署了A和B两个项目,两个项目的代码都是一样的,只有项目名称不同。启动两个Tomcat后,使用同一个浏览器分别访问不同的Tomcat,出现sessionid互相覆盖的情况。例如,访问tomcat1时获取的sessionid是123456,此时再去访问tomcat2时会发现sessionid也是123456,但是tomcat2上并没有这个sessionid,结果又返回一个新的sessionid回来,又进行了一个覆盖,如此循环。
解决方案:
-
方法一: tomcat6以上, 直接改下conf文件下的context.xml的 context标签, 给每个tomcat的
SessionCookieName=”JSESSIONID_1”设置一个名字(默认是JSESSIONID)<Context docBase="D:\Develop\Tomcat\apache-tomcat-7.0.40\wtpwebapps\poi" path="/poi" sessionCookiePath="/poi" sessionCookieDomain="*.baikeyang.com" sessionCookieName="POI_SESSIONID" reloadable="false" caseSensitive="false" crossContext="true" source="org.eclipse.jst.jee.server:poi"/>
- sessionCookieName:用于为此上下文创建的所有会话Cookie的名称。 如果设置,则会覆盖Web应用程序设置的任何名称。 如果未设置,则使用Web应用程序指定的值(如果有),如果Web应用程序未明确设置,则使用名称JSESSIONID。
-
方法二:在tomcat的conf目录下,修改catalina.properties配置。在catalina.properties加上一句 ,这样sessionid的名称就是MYSESSIONID了:
org.apache.catalina.SESSION_COOKIE_NAME=MYSESSIONID
- 方法三:自己手动编写代码去生成sessionid,不去使用Tomcat生成的,但是这个生成的sessionid必须是唯一的,最简单的方式就是使用uuid之类的。
- 方法四:使用cookie的方式来保存sessionid,然后使用redis之类的存储session数据,之后就根据cookie里存的sessionid去读取数据即可,这也是分布式集群环境下,实现单点登录、保持sessionid一致的一种方法
-
-
一个浏览器使用多个Session
2016-02-24 17:25:35cookies session 每个浏览器多个用户网上资料:
Spring Session认为第一个问题,也就是在高可用可扩展的集群中存储数据已经通过各种数据存储方案得到了解决,如Redis、GemFire以及Apache Geode等。
自己解决办法:
SessionManager.java
import java.io.IOException; import org.apache.log4j.Logger; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SessionManager implements Filter{ private static final Logger log=Logger.getLogger(SessionManager.class); private static final String SMCS_LOG="SUIHUASMCSLOG"; @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //cookies Cookie[] cookies = request.getCookies(); Cookie ACookie = null; boolean HaveSmcsSession=false;//不包含 String uuid=java.util.UUID.randomUUID().toString(); String sessionID=uuid.replaceAll("-", ""); System.err.println("添加smcs_sessionID==="+sessionID); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { ACookie = cookies[i]; String cookiename = ACookie.getName(); String cookiealue = ACookie.getValue(); if(cookiename.equals(SessionManager.SMCS_LOG)){ sessionID=cookiealue; HaveSmcsSession=true; break; } } //不包含 if(!HaveSmcsSession){ Cookie cookie_smcs = new Cookie(SessionManager.SMCS_LOG,sessionID); cookie_smcs.setPath("/");// 这个要设置 //cookie_smcs.setDomain(".aotori.com"); //cookie_smcs.setMaxAge(365 * 24 * 60 * 60); // 不设置的话,则cookies不写入硬盘,而是写在内存,只在当前页面有用,以秒为单位 response.addCookie(cookie_smcs); } }else if(cookies==null){ Cookie cookie_smcs = new Cookie(SessionManager.SMCS_LOG,sessionID); cookie_smcs.setPath("/");// 这个要设置 //cookie_smcs.setDomain(".aotori.com"); //cookie_smcs.setMaxAge(365 * 24 * 60 * 60); // 不设置的话,则cookies不写入硬盘,而是写在内存,只在当前页面有用,以秒为单位 response.addCookie(cookie_smcs); } ServletContext ctx = request.getSession().getServletContext(); SmcsSession session = new SmcsSession(); if(ctx.getAttribute(sessionID)==null){ ctx.setAttribute(sessionID, session); } log.info("my session manager...."); filterChain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } public static SmcsSession getSession(HttpServletRequest request){ ServletContext ctx = request.getSession().getServletContext(); Cookie[] cookies = request.getCookies(); SmcsSession session = new SmcsSession(); String sessionID = null; if(cookies!=null){ for (int i = 0; i < cookies.length; i++) { Cookie ACookie = cookies[i]; String cookiename = ACookie.getName(); String cookiealue = ACookie.getValue(); if(cookiename.equals(SessionManager.SMCS_LOG)){ sessionID = cookiealue; break; } } } if(sessionID==null) return session; return (SmcsSession)ctx.getAttribute(sessionID); } }
SmcsSession.java
import java.util.Enumeration; import java.util.HashMap; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionContext; public class SmcsSession implements HttpSession { private HashMap<String,Object> map=new HashMap<String,Object>(); @Override public Object getAttribute(String keyname) { if(map!=null){ return map.get(keyname); } return null; } @Override public void setAttribute(String keyname, Object obj) { map.put(keyname, obj); } @Override public Enumeration<String> getAttributeNames() { // TODO Auto-generated method stub return null; } @Override public long getCreationTime() { // TODO Auto-generated method stub return 0; } @Override public String getId() { // TODO Auto-generated method stub return null; } @Override public long getLastAccessedTime() { // TODO Auto-generated method stub return 0; } @Override public int getMaxInactiveInterval() { // TODO Auto-generated method stub return 0; } @Override public ServletContext getServletContext() { return null; } @Override public HttpSessionContext getSessionContext() { // TODO Auto-generated method stub return null; } @Override public Object getValue(String arg0) { // TODO Auto-generated method stub return null; } @Override public String[] getValueNames() { // TODO Auto-generated method stub return null; } @Override public void invalidate() { // TODO Auto-generated method stub } @Override public boolean isNew() { // TODO Auto-generated method stub return false; } @Override public void putValue(String arg0, Object arg1) { // TODO Auto-generated method stub } @Override public void removeAttribute(String arg0) { // TODO Auto-generated method stub } @Override public void removeValue(String arg0) { // TODO Auto-generated method stub } @Override public void setMaxInactiveInterval(int arg0) { // TODO Auto-generated method stub } }
SessionManager.java配置为过滤器,当出现登陆index.html页面时,请求验证码时,进入过滤器方法<filter> <filter-name>sessionManager</filter-name> <filter-class>com.common.web.controller.SessionManager</filter-class> </filter> <filter-mapping> <filter-name>sessionManager</filter-name> <url-pattern>/login/code.html</url-pattern> </filter-mapping>
效果:
也可以把Session放使用缓存服务器。
-
Spring session 浏览器sessionId与服务器不一致解决方案
2019-05-06 16:45:06请求项目接口后浏览器保存的sessionId与服务器不一致,拿Postman测试如下图,网上找了很久都没发现有人发过这个问题,只能自己去找了spring session的深入分析一系列文章以及阅读源码,最后结合到今天找到的一个... -
一文详解Cookie,Session以及浏览器与Cookie,Session的底层联系
2022-04-03 18:38:37客户端有了Cookie之后,每次请求都会发送给服务器 每个Cookie的大小不能超过4KB 创建Cookie Cookie cookie = new Cookie (“key”,“Value”); resp.addCookie(Cookie); 服务器获取Cookie req.getCookies(); //... -
浏览器关闭后,Session就销毁了吗?
2022-01-06 14:14:24存在于浏览器上的唯一标识符JSESSIONID(sessionid)消失了,但是服务器中存放的sessionid并没有立马销毁。 分析: 我们知道Session是JSP的九大内置对象(也叫隐含对象)中的一个,它的作用是可以保存当前用户的... -
解决同一浏览器登录多个账户session共享问题
2017-10-11 17:53:06首先session是同一PC同一浏览器共享的.比如如下代码:public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { HttpSession hs = request.... -
上下两个Session的SessionID 不一样怎么办
2019-05-17 15:23:50在昨天我在写代码的过程中出现了一个BUG,是以为上下的SessionID不一致,导致我不能精准地获取到我上面存在Session。...我是调用一个方法生成一个4位数的字符串,然后把生成的字符串存在一个Session["vali... -
sessionid如何产生?由谁产生?保存在哪里?
2021-01-11 10:40:40面试问道这个我居然不知道怎么回答,当然也是因为我确实...sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。tomcat生成的sessionid叫做jsessionid。 session -
微信内嵌浏览器sessionid丢失问题
2016-07-20 10:44:44近期有部分用户是在微信中访问的,才出现的这个问题。抓包由于只有在手机微信中出现这种情况,并且手机连的无线与pc不在一个局域网中,所以,只能在pc上用360wifi创建热点(无线),然后手机连接热点,再用wireshark抓... -
本地项目登录时一直提示验证码错误 / 参数为空(即浏览器存不上sessionid)问题
2020-08-29 15:40:37场景:早上上班起本地之后,登录时一直提示...经查询后,发现是Chrome浏览器cookie中无sessionid(没存上)。 解决办法: 谷歌浏览器地址栏输入:chrome://flags/,将 SameSite by default cookies、Cookies witho -
两个Spring Boot项目在同一个服务器上如何解决Session共用问题
2019-11-20 11:44:23两个Spring Boot项目在同一个服务器上如何解决Session共用问题情况一:两个项目只需要SessionID,内容都通过SessionID保存在Redis中问题产生背景如果在header中没有SessionID问题解决办法情况二:两个项目需要共用... -
浏览器关闭后,Session和cookie?
2019-01-19 17:22:19存当前用户的状态信息,初学它的时候,认为Session的生命周期是从打开一个浏览器窗 口发送请求到关闭浏览器窗口,但其实这种说法是不正确的!下面就具体的去解释: 当用户第一次访问Web应用中支持Session的某个... -
PHP中出现两个cookie或者session_id的深入解析及解决方案
2019-06-10 11:42:50最近写PHP框架的时候遇到一个问题,就是用session保存数据的时候,经常遇到同时出现两个session_id,导致登录前和登录后两个文件session保存的数据不同。 网上找遍了技术文档,也看到有人遇到过类似的问题,但是没有... -
前端浏览器之Cookie,Session,LocalStorage,SessionStorage,JWT
2022-02-08 14:03:08文章目录CookieLocalStorageSessionStorageCookie、LocalStorage、SessionStorage区别SessionSession 的缺点JWT Cookie Cookie是一种存储机制, 当我们第一次请求网页内容的时候是没有任何cookie的,服务器在收到... -
为什么两个浏览器会session重复
2010-10-02 15:40:00我用两个用户登陆系统,各使用IE8浏览器,当第二个用户登陆后,我刷新第一个用户的测试页面,结果获得的是第二个用户的值, 为什么两个浏览器会session重复,然后我用腾讯TT和IE8各使用一个用户测试,... -
tomcat产生两个sessionid,一个是自定义的sessionid(customSessionId),一个是默认的jsess
2017-12-19 20:01:16查看dev tools—>network时发现,有两个sessionid,一个是spring session中指定的customSessionId,一个是tomcat默认的jsessionid, <!--spring-applicationcontext.xml中指定的customSessionI -
为什么服务器能够为不同的浏览器用户提供不同session
2018-11-18 17:21:32Session的实现原理 用现象说明问题,我在ServletSessonTest01中的代码设置了Session的属性 1public class ServletSessonTest01 extends HttpServlet { 2 @Override 3 protected void doGet... -
Chrome浏览器获取httpServletRequest每次请求sessionId不同问题的一种解决办法分享
2020-09-30 15:15:07request.getSession()和request.getSession(true)意思相同:获取session,如果session不存在,就新建一个 reqeust.getSession(false)获取session,如果session不存在,则返回null 如果 项目中无法确定回话一定存在,... -
springsession使用redis共享session时,sessionid不一致的问题
2019-03-07 19:35:56网上能找到很多帖子说怎么实现redis来共享session,照着做完,发现两个独立应用配置到同一个redis后,获取的session id不一样。 怎么回事,他们写的不是很简单,怎么我这每次都不一样呢。 找了半天,原来spring... -
关于Session的使用以及Session与浏览器交互的原理通通在这了
2020-01-06 19:41:21因为在使用Cookie有一个非常大的局限,就是如果Cookie很多,则无形的增加了客户端与服务端的数据传输量。而且由于浏览器对Cookie数量的限制,注定我们不能再Cookie中保存过多的信息,于是Session出现。 -
浏览器和服务器之间Cookie,Session,Token,负载均衡详解
2022-04-12 18:38:53Session 服务器方案 开辟临时会话,建立用户和服务器之间交互的空间,sessionId来标记不同的会话框 2、缺点:对于服务端来说压力大,根据用户不断开辟新的空间 3Token 令牌方案 作用:Token服务器给客户端传输token...