您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
20_会话技术_Session_细节2(session实例引用地址不同并不代表session不同(特别是钝化与活化时))
发布时间:2022-09-04 00:50:46编辑:雪饮阅读()
服务器的重启后session是否与之前正常运行时候的session是同一个session?默认情况下由于session也是对象实例,则一般是不会相同的
可通过如下代码结合服务器(当然这里说的是在intellij idea情况下)查看效果:
response.getWriter().write(String.valueOf(request.getSession()));
如何将intellij idea上面的项目搬到原来纯tomcat上面运行?
情况1:
如果有在intellij idea上面部署多个虚拟目录(只在intellij idea上面启动一个tomcat不用切换到某个项目才启动某个项目的tomcat(这样除非不同端口),就是说同一端口多个虚拟目录(多个Deploy at the server startup)),这种情况会比较复杂(可能还会分多module)。
情况2:
单纯一个项目单一module的情况。
按照情况2这种在intellij idea上面在项目目录上右键里面Show in Explorer可以进入如:
C:\Users\Administrator\IdeaProjects
这个目录中然后进一步根据你的项目目录名称找到如下这个目录
C:\Users\Administrator\IdeaProjects\session20\out\artifacts\session20_war_exploded
将这个目录里面的内容压缩为zip并更名为war格式,放置于tomcat的webapps目录中
随着tomcat的startup.bat启动后就可以访问如:
http://localhost:8080/session20/Servlet1
那么情况1你如果这样做就会发现startup.bat启动过程中会报错中会有你这个war包单独解包时候的错误包含如:
ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Faile
这样的错误。
另外据说在intellij idea上面服务器重启后会丢失session是因为Using CATALINA_BASE那个目录里面的work目录会被销毁(好像具体点说是这个work目录里面的内容被销毁,不过这个小细节其实感觉纠结起来没有必要了)(正常停止时会保存(顿化),但正常启动时候不会活化)
然后说是纯tomcat上面服务器重启后不会丢失session(正常关闭,如shutdown.bat时才可以),那么和intellij idea的情况正好相反,就是不会销毁work目录。
但是我这里尝试了好像并不是这么一回事,可能我是win10?我看见过win7上面好像可以。
win10上面只是偶尔会出现两次session相同。
session丢失或不丢失在intellij idea上面和在原生tomcat上面的表现的补充说明
就像“据说”那样
之前一直我这里不行,是因为我直接测试的是session实例引用地址的输出是否相同,其实这样的话,在这里是不严谨的,持久化我想他这里一般不会用这种地址持久化吧。
果然,我修改为每次输出session中某个设置的key的值就和“据说”一样了。
当然是分两个servlet来测试呗
servlet0:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Servlet0")
public class Servlet0 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().setAttribute("session_name","name_kasumi");
response.getWriter().write("session set complate");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
servlet1:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write(String.valueOf(request.getSession().getAttribute("session_name")));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
关键字词:会话技术,Session,细节,实例,引用,地址,不同,代表,特别,钝化,活化