github找个springMVC的例子,运行起来以供测试。https://github.com/Cenyol/SpringMVC
修改部分代码
// 首页
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index() {
ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
HttpServletRequest req = attr.getRequest();
HttpServletResponse response = attr.getResponse();
HttpSession session = req.getSession();
Enumeration enumerations = session.getAttributeNames();
String sessionId = session.getId();
String sessValue = (String)session.getAttribute("sess");
session.setAttribute("sess","session123456");
ServletContext servletContext = session.getServletContext();
Cookie[] cookies = req.getCookies();
Cookie cookie = new Cookie("aaaa", "bbb");
response.addCookie(cookie);
}
客户端(浏览器)和服务端如何识别同一个session
猜测 通过sessionID
验证:
image.png
image.png
image.png
同样的,如果不重启服务器。清空浏览器的cookie使得发送的请求头不包含cookie,服务端会视该请求为首次请求,并返回set-cookie。
session
java代码中的session
是服务器用于存储key
为sessionID
,value
为Map的容器.
如下图:
屏幕快照 2017-11-01 10.42.13.png
JSESSIONID是java容器默认生成名为JSESSIONID
的session id。
Examples of the names that some programming languages use when naming their cookie include JSESSIONID (Java EE), PHPSESSID (PHP), and ASPSESSIONID (Microsoft ASP).
cookie
cookie是客户端存储数据的空间。
但为什么服务端可以操作cookie,客户端也可以操作cookie,这两者之间有什么关联和区别?
服务端操作cookie的方式是set-cookie,而客户端是取cookie。
在客户端首次访问服务时,请求头中没有包含cookie,这时服务端会判断用户为首次登录,记录标识并在返回的头部包含set-cookie键值。
随后客户端拿到这set-cookie并存放在cookie中,再次访问服务时,request的头部中会包cookie字段。
session ID 与token
session ID
和token
是一码事,都是用于标识会话,只不过它们的生成规则不一样。
它们通常会存储于cookie中,并会随着http请求
发送至服务端。
参考
- https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#innerlink_set-cookie
- https://en.wikipedia.org/wiki/Session_(computer_science)#Web_server_session_management
- https://en.wikipedia.org/wiki/Session_ID
- 会话(Cookie,Session,Token)管理知识整理(一)
- https://docs.oracle.com/javaee/6/api/index.html?javax/servlet/http/HttpSession.html