您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
05-Session原理&细节(解决No plugin found for prefix 'tomcat7' in the current project and in the p
发布时间:2024-12-05 23:00:45编辑:雪饮阅读()
-
判断两个请求中获取的session是否是同一个session对象,只需要println比较下他们的地址结果(地址)是否相同即可。
携带session id,当有session会话被设置的情况下请求头中会携带session id于set cookie中,如:
set-cookie: JSESSIONID=2CA04EE214632B6152730D1BDFBE5485; Path=/day11ProjectModule/; HttpOnly
正常关闭重启服务器,session还会存在
正常重启服务器,在IntelliJ IDEA菜单中的maven运行tomcat插件方式不方便。
可以在terminal中运行命令如mvn tomcat7:run
但是你可能会报错如:
No plugin found for prefix 'tomcat7' in the current project and in the plugi
那么这里你可能是项目架构是empty Project下面创建的maven Module,那么此时实际上你默认情况下terminal中新开的terminal默认路径就是在你的project路径,而不是在module路径。
知道问题的症结,你就明白怎样解决了。
那么现在我的第一个servlet是进行设置session的,实现如:
package com.session;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/SessionServlet01")
public class SessionServlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session= req.getSession();
session.setAttribute("username","kasumi");
System.out.println("session1:"+session);
req.getRequestDispatcher("/SessionServlet02").forward(req,resp);
}
}
然后我的第二个servlet则是负责读取session的,实现如:
package com.session;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/SessionServlet02")
public class SessionServlet02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session= req.getSession();
System.out.println("session2:"+session);
Object username=session.getAttribute("username");
System.out.println("username:"+username);
}
}
此时如果你第一次访问如
localhost:8080/day11ProjectModule/SessionServlet01
在控制台中看到的session获取的username则是从servlet2中获取的。
所以此时如果你ctrl+c中断了tomcat命令行运行服务后,再次运行后直接访问如
localhost:8080/day11ProjectModule/SessionServlet02
那么也能得到同样的username的输出,则表示了在服务器正常关闭后,tomcat会自动将session数据写入硬盘的文件中
这里就涉及到了两个概念。
钝化:在服务器正常关闭后,tomcat会自动将session数据写入硬盘的文件中
活化:再次启动服务器后,从文件中加载数据到session中。
那么你可能发现了,此时如果你访问的是第一个servlet后,然后就ctrl+c会发现命令行没有听话的感觉,就是一直没有反映,稍微过了一会儿才反应过来。
这我的理解就是正在做钝化处理的过程吧,然后最好提示你按y停止服务器。
那么此时你可以到它控制台中提示的这个目录
Using existing Tomcat server configuration at D:\os\day11ProjectModule\target\tomcat
中,然后导航至如
D:\os\day11ProjectModule\target\tomcat\work\Tomcat\localhost\day11ProjectModule
这个目录中你可以看到如SESSIONS.ser这个文件就是钝化后的session存储的文件。
那么当你再次运行mvn tomcat7:run后你就会发现该session钝化后的存储文件就会自动删除了。
我的理解就是钝化是相当于将session数据类似序列化到文件,而活化过程就正好是相反过来,将序列化后的文件重新载入到内存中。
相同浏览器关闭重开后,重新获取的session不是同一个。
你可以尝试先访问如
http://localhost:8080/day11ProjectModule/SessionServlet02
得到了username这个session的变量值。
那么当你关闭你当前所用浏览器后重新打开后再次访问该链接后你会发现,这次的username输出值变成了null了。
其实这个时候我的理解就是Session并不是销毁了,而是这是一个新的session会话,会话id是不同的,在这个session会话中却并没有上次会话中设置的username。
Session销毁:
默认情况下,无操作,30分钟自动销毁
这个可见于tomcat安装目录下conf/web.conf中的配置如:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
那么基于此,我们也可以在我们的项目中webapp下面的WEB-INF下面的web.xml中配置为100分钟,则如:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
version="4.0"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:javaee="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
<display-name>Archetype Created Web Application</display-name>
<session-config>
<session-timeout>100</session-timeout>
</session-config>
</web-app>
顺带说一下,这里的web-app的version是4.0,这是我用maven项目骨架产生的,至于这个版本号,据说是3.0以后都可以,在我这里我看到讲师用的是3.1。
那么除了这种配置的方式修改销毁机制,其实也可以手动销毁session的。
在代码中控制,可以用session对象自身来销毁session。
比如说刚才的servlet2中我可以这样:
HttpSession session= req.getSession();
System.out.println("session2:"+session);
Object username=session.getAttribute("username");
System.out.println("username:"+username);
session.invalidate();
也就是说访问到session并取值后就销毁session,那么此时你直接访问servlet1后可以看到控制台正常输出username,但再次独立访问servlet2的时候就发现username又变成null了。
关键字词:session,tomcat7,plugin
相关文章
- 04-Session-基本使用
- 13-SqlSessionFactory工具类抽取(代码复用与性能优化)
- 11-添加&修改功能(insert、update标签、useGeneratedK
- 3-4 控制器之session处理
- 11_EL_获取域中存储的值(从request与session中拿取数据
- 20_会话技术_Session_细节2(session实例引用地址不同
- 19_会话技术_Session_细节1(用cookie来控制session关闭
- 17_会话技术_Session_快速入门(session设置及获取)
- webman-session管理-配置文件-更換session驅動為redis
- webman-session管理-配置文件-redis集群搭建(單宿主機