素材巴巴 > 程序开发 >

java session取不到_web后台获取不到session中的值(loading sessions from persistent storage),后改用JS传值...

程序开发 2023-09-08 07:34:46

线上的程序似乎从session中取不到domain数据,重启了一下tomcat查看log日志发现,居然有报错。错误信息如下

22-Sep-2016 00:52:16.562 SEVERE [localhost-startStop-1] org.apache.catalina.session.StandardManager.startInternal Exception loading sessions from persistent storage

java.io.StreamCorruptedException: invalid type code:00at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1381)

at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)

at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:503)

at java.lang.Throwable.readObject(Throwable.java:914)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)

at org.apache.catalina.session.StandardSession.doReadObject(StandardSession.java:1602)

at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1090)

at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:218)

at org.apache.catalina.session.StandardManager.load(StandardManager.java:162)

at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:356)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5320)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)

at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940)

at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)

at java.util.concurrent.FutureTask.run(FutureTask.java:266)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:745)

下面从网上找到的资料:

Tomcat/work/Catalina/localhost/工程名/SESSIONS.ser session未超时的情况下服务器关闭大的时候被序列化为工程名/SESSIONS.ser 启动的时候再加载进来,加载的时候报错了,把该文件删除,重新启动。

通过该问题,知道了requet.getSession()获取的是StandardSession对象,StandardManager管理Session集合时,在Servlet容器关闭的时候,StandardManager会调用unload方法把Session集中的StandardSession对象写到"SESSIONS.ser"文件中,因为直接kill掉了Servlet容器进程,没有unload持久化,所以在恢复Session的时候报错。所以以后要注意调用Servlet容器的start和stop命令。

71ab2b73e445754b1c18bf52ae4227fa.png

虽然我这样做了,重启tomcat没有报错,但是我的session中仍然获取不到值。

于是修改程序,我在服务器后台打印出session的ID发现页面每次下拉请求到的session的ID都不一样(但是在本地测试时session ID 是一样的,我使用的是$.get(url)的形式访问的服务器,这个每次访问会产生新的session吗?暂时没有测试)。

由于项目需要尽快上线,在前台JS写了一个方法用户获取到地址栏中的参数,方法如下

url: http://www.baidu.com/domain/?domain=taobao.com

functionGetQueryString(name){var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");var r = window.location.search.substr(1).match(reg);if(r!=null)return unescape(r[2]); return null;

}var domain = "";var myurl=GetQueryString("domain");if(myurl !=null && myurl.toString().length>1){

domain= GetQueryString("domain");

}

//这里就可以获取到taobao.com


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。