1.引入
Cookie的不足:
-
不能保存对象
-
不能保存中文
-
大小才4k
-
数据明码保存在客户端,不安全
另外的解决方案就是使用session。
Session是将会话数据保存在服务端的技术
2.Session技术核心
Session的创建:
session的创建是由服务器创建,我们只能向服务器要session对象: HttpSession req.getSession()/getSession(Boolean b):返回一个Session对象
Session的设置:
1.void setMaxInactiveInterval(int num):设置Session的存活时间
2.void invalidate():销毁Session对象
3.String getId():返回Session对象的id
Session作为域对象的api:
1.void setAttribute(String key,Object value):添加一个键值对
2.Object getAttribute(String key):根据键获取值
3.Void removettribute(Strinf key):根据键删除键值对
3.session的原理
1.session是如何区分出不同的浏览器?
浏览器1——》第一次访问网站——》服务器检测这个浏览器是不是第一次访问——》服务器会创建一个session对象,与这个浏览器绑定
浏览器1——》第n次访问网站——》服务器发现是第n次访问——》服务器资源需要session的时候会直接使用与浏览器绑定的session对象
浏览器2——》第一次访问网站——》服务器会创建一个新的session对象与浏览器绑定
......
2.session与浏览器是如何绑定的?
浏览器第一次访问的时候,服务器检查cookie中有没有一个名字叫做JSESSIONID的,如果有,说明是第n次访问,没有就是第一次访问
a.第一次访问:
服务器会创建一个session对象,将session对象的id使用cookie(JSESSIONID,id)发送给浏览器
b.第二次访问:
读取sessionId,根据id获取服务端保存的session对象
3.session在服务端如何保存的?
session在服务端的保存,类似于map结构
<String,HttpSession>
<"s001",session1>
<"s002",session2>
......
4.session细节
HttpSession req.getSession() 和 getSession(Boolean b)区别:
1.getSession()效果:
a.如果当前的请求还没有对应的session对象,就创建一个新的session对象
b.如果已经有绑定的session对象,就返回原有绑定的对象
2.getSession(true) 等效 getSession()
3.getSession(false)
a.如果当前线程有session对象,就返回已经存在的session对象
b.如果当前线程没有session对象,服务器就返回null
我们在开发中使用哪个:默认使用使用无参的,getSession(false)也有使用场景
session的存活时间:
1.浏览器关闭,session失效
能不能实现:浏览器关闭,不影响session的失效,需要手动写cookie
2.如果浏览器不关闭,session也会失效的
WEB-INF->web.xml添加如下代码:session一分钟后失效
<session-config>
<session-timeout>1</session-timeout>
</session-config>
1.写入
@WebServlet(name = "session1", urlPatterns = "/session1")
public class Session1Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.session对象的获取
HttpSession session = req.getSession();
System.out.println(session.getId());
//2.使用session保存数据
session.setAttribute("user", "admin");
//3.如果需要实现浏览器关闭,session不失效,需要手写cookie
Cookie cookie = new Cookie("JSESSIONID", session.getId());
//3.1设置Cookie的超时时间
cookie.setMaxAge(60 * 60);
//3.2写Cookie
resp.addCookie(cookie);
System.out.println("cookie设置完毕");
}
}
2.读取
@WebServlet(name = "session2", urlPatterns = "/session2")
public class Session2Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.session对象的获取
HttpSession session = req.getSession(false);
System.out.println(session.getId());
//2.获取session保存的数据
String user = (String) session.getAttribute("user");
System.out.println("user = " + user);
}
}
3.销毁
@WebServlet(name = "session3", urlPatterns = "/session3")
public class Session3Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.session对象的获取
HttpSession session = req.getSession(true);
System.out.println(session.getId());
//2.销毁session对象
session.invalidate();
System.out.println("销毁成功");
}
}