1、Session简介
-
什么是session
session是javaEE下面的一个HttpSession接口,它可以实现一次会话的多次请求之间共享数据。比如请求的转发里面共享的request域,就是在一次请求之间共享数据。session就是在一次会话之间共享数据,还有一个比较大的域对象,叫application,它是在一个应用里面共享数据。 -
session与cookie的区别
1、session与cookie都是存储用户数据的功能,他们都是一个对象。但是cookie是存储在浏览器里的,而session是存储在服务器里面。
2、存储数据大小不同,session没有任何大小限制,而cookie好像最多只能存储4KB。
3、安全性不同:session存储在服务器,相当于比较安全,而cookie在浏览器随时能够查看,你的登录信息很可能被别人盗走,所以不怎么安全。
2、session的创建和获取
session比较特殊,它的创建和获取都是用req.getSession();如果服务器已经有对应的session,那就直接通过请求头向服务器发送session的ID,可以利用session的ID获取。如果服务器没有session就新建一个,然后将session的ID响应给浏览器。
@WebServlet("/session001")
public class SessionDemo001 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.修改编码方式
resp.setContentType("text/html;charset=utf-8");
//2.创建session
HttpSession session = req.getSession();
//3.判断session是否为刚创建的
if(session.isNew()){
resp.getWriter().write("这个session是刚创建的!!!");
}else{
resp.getWriter().write("这个session不是刚创建的!!!");
}
//4.获取sessionID
String id = session.getId();
resp.getWriter().write("<br/>session的ID是:"+id);
}
}
第一次请求,新建session
第二次请求:ID完全一样
3、创建和获取session域数据(方法和request域大致一样)
1、创建session域数据
@WebServlet("/session002")
public class SessionDemo002 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
session.setAttribute("key1","value1");
session.setAttribute("key2","value2");
session.setAttribute("key3","value3");
session.setAttribute("key4","value4");
resp.getWriter().write("session数据创建好了!!!");
}
}
2、获取session域数据
@WebServlet("/session003")
public class SessionDemo003 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
Object key1 = session.getAttribute("key1");
Object key2 = session.getAttribute("key2");
Object key3 = session.getAttribute("key3");
Object key4 = session.getAttribute("key4");
resp.getWriter().write("session数据获取了"+"<br/>");
resp.getWriter().write("以下是Session程序2中的session域数据<br/>"+key1+"<br/>"+key2+"<br/>"+key3+"<br/>"+key4);
}
}
4、修改session超时时长
什么是超时时长:就是在浏览器连续两次请求之间的最大允许时间,超过这个时间session就会被销毁。
session可以保存在服务器,但不是永久保存的。如果永久保存服务器将会浪费大量资源。session有一个默认的超时属性,这个属性可以在Tomcat服务器下面的配置文件查看。
tomcat\工程\conf\web.xml查看。这里的30是默认的30分钟。
Session的钝化:web服务器关闭后,服务器会将session写入磁盘文件之中。
session的活化:在重新启动服务器时,从文件之中加载数据到session中。
获取session超时时长:getMaxInactiveInterval();
@WebServlet("/session004")
public class SessionDemo004 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
int maxInactiveInterval = session.getMaxInactiveInterval();
resp.getWriter().write("默认的session超时时长是:"+maxInactiveInterval+"秒");
}
}
2.修改超时时长
@WebServlet("/session005")
public class SessionDemo005 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
session.setMaxInactiveInterval(10);
resp.getWriter().write("session超时时长已经修改!!!");
}
}
5、html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<base href="http://localhost:8700/cookie_war_exploded/">
</head>
<body>
<iframe name="target" width="500px" height="500px"></iframe>
<label>
<li><a href="session001" target="target">创建和获取session</a></li>
<li><a href="session002" target="target">新建session域数据</a></li>
<li><a href="session003" target="target">获取session域数据</a></li>
<li><a href="session004" target="target">获取session超时时长</a></li>
<li><a href="session005" target="target">修改session超时时长</a></li>
</label>
</body>
</html>