一、概述
因为HTTP
协议是一个无状态协议,即Web
应用程序无法区分收到的两个HTTP
请求是否是同一个浏览器发出的。为了跟踪用户状态,服务器可以向浏览器分配一个唯一ID,并以Cookie
的形式发送到浏览器,浏览器在后续访问时总是附带此Cookie
,这样,服务器就可以识别用户身份。
二、Session
我们把这种基于唯一ID识别用户身份的机制称为Session
。每个用户第一次访问服务器后,会自动获得一个Session ID
。如果用户在一段时间内没有访问服务器,那么Session
会自动失效,下次即使带着上次分配的Session ID
访问,服务器也认为这是一个新用户,会分配新的Session ID
。一次Session
会话中往往包含着若干次request
请求。
JavaEE
的Servlet
机制内建了对Session
的支持。当我们需要获取Session
时,可以通过request
请求对象的getSession()
方法。例如:
package com.apesource.web.servlet;
import java.io.IOException;
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;
@WebServlet("/test_session.do")
public class TestSeesionServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws servletexception, IOException {
System.out.println("Get请求:TestSeesionServlet被请求到了");
// 第一次在访问Session时,服务器会创建Session
// 并根据Session_ID,创建一个1个名称为"JSESSIONID"的Cookie
HttpSession session = req.getSession();
System.out.println(session.getId());
}
}
获取HttpSession
后,常见的操作方法有:
-
void setAttribute(String name, Object value)
:将指定Key-Value
键值对,存入当前Session
会话中。 -
Object getAttribute(String name)
:按照指定的Key
从当前Session
会话中获取Value
,返回值为Object
类型的对象,如果不存在,则返回null
。 -
void removeAttribute(String name)
:按照指定的Key
从当前Session
会话中删除Key-Value
键值对。 -
long getCreationTime()
:获取当前Session
会话的创建时间。 -
long getLastAccessedTime()
:获取当前Session
会话最后一次请求的访问时间。 -
String getId()
:获取当前Session
会话的SESSION ID
。
服务器识别Session
的关键就是依靠一个名为JSESSIONID
的Cookie
。在Servlet
中第一次调用req.getSession()
时,Servlet
容器自动创建一个Session ID
,然后通过一个名为JSESSIONID
的Cookie
发送给浏览器。
使用Session
时,由于服务器把所有用户的Session
都存储在内存中,如果遇到内存不足的情况,就需要把部分不活动的Session
序列化到磁盘上,这会大大降低服务器的运行效率,因此,放入Session
的数据不能太大,否则会影响服务器的运行。
三、Cookie
实际上,Servlet
提供的HttpSession
本质上就是通过一个名为JSESSIONID
的Cookie
来跟踪用户会话的。除了这个名称外,其他名称的Cookie
我们可以任意使用。
创建一个新Cookie
时,除了指定名称和值以外,通常需要设置setPath("/")
,浏览器根据此前缀决定是否发送Cookie
。如果一个Cookie
调用了setPath("/user/")
,那么浏览器只有在请求以/user/
开头的路径时才会附加此Cookie
。通过setMaxAge()
设置Cookie
的有效期,单位为秒,最后通过resp.addCookie()
把它添加到响应。
通过创建Cookie
,我们可以实现在客户端浏览器中存储数据的目的,例如保存用户名和密码。在Chrome
浏览器中,单个 Cookie
的长度不能超过 4069 个字符(包括 name,但不包括 = 号)。
我们可以在浏览器看到服务器发送的Cookie
如果我们要读取Cookie
package com.apesource.web.servlet;
import java.io.IOException;
import javax.servlet.servletexception;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/test_get_cookie.do")
public class TestGetCookieServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws servletexception, IOException {
System.out.println("测试获取Cookie!");
// 获取该客户端浏览器本次请求头(Request Header)中所有的Cookie
Cookie[] cookie = req.getCookies();
if(cookie != null) {
for (Cookie ck : cookie) {
System.out.println(ck.getName());
System.out.println(ck.getValue());
System.out.println();
}
}
}
}
所以,读取Cookie
主要依靠遍历HttpServletRequest
附带的所有Cookie
。
小结:
原文地址:https://www.jb51.cc/wenti/3283322.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。