Chapter9 cookie与session
9.1 Cookie
什么是Cookie
- Cookie 是服务器通知客户端保存键值对的一种技术。
- 客户端有了 Cookie 后, 每次请求都发送给服务器。
- 每个 Cookie 的大小不能超过 4kb
如何创建Cookie
浏览器向客户端发起请求
服务器创建Cookie
通知客户端保存Cookie
通过响应头Set-Cookie通知客户端保存Cookie
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建Cookie对象 Cookie cookie = new Cookie("key1","value1"); // 通知客户端保存Cookie resp.addCookie(cookie); resp.getWriter().write("Cookie创建成功"); }
<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
服务器获取Cookie
客户端发起请求
若有Cookie则通过请求头Cookie:key=value把Cookie发送给服务器
服务器通过
req.getCookies()
获取Cookie数组protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { resp.getWriter().write("Cookie["+cookie.getName()+"="+cookie.getValue()+"]<br>"); } Cookie iWantCookie = null; for (Cookie cookie : cookies) { if ("key2".equals(cookie.getName())) { iWantCookie = cookie; break; } } if (iWantCookie != null) resp.getWriter().write("找到了需要的Cookie"); }
<li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
Cookie值的修改
方案一
先创建一个要修改的同名(指的就是 key) 的 Cookie 对象
创建时同时赋于新的 Cookie 值。
调用 response.addCookie( Cookie );
Cookie cookie = new Cookie("key1","newValue1"); resp.addCookie(cookie);
方案二
- 先查找到需要修改的 Cookie 对象
- 调用 setValue()方法赋于新的 Cookie 值。
- 调用 response.addCookie()通知客户端保存修改
Cookie cookie = CookieUtils.findCookie("key2", req.getCookies()); if (cookie != null) { // 调用 setValue()方法赋于新的 Cookie 值。 cookie.setValue("newValue2"); // 调用 response.addCookie()通知客户端保存修改 resp.addCookie(cookie); }
cookie值不能包含符号、中文等,需要Base64编码
浏览器查看Cookie
- 谷歌:F12->Application->Cookies
- 火狐:F12->存储->Cookie
Cookie生命控制
- Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
- 通过setMaxAge()来设置
- 正数, 表示在指定的秒数后过期
- 负数, 表示浏览器一关, Cookie 就会被删除(默认值是-1)
- 零, 表示马上删除 Cookie
- 马上删除一个Cookie:
Cookie cookie = CookieUtils.findCookie("key2", req.getCookies()); if (cookie != null) { cookie.setMaxAge(0); resp.addCookie(cookie); }
Cookie 有效路径 Path 的设置
- Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。 哪些不发。
- path 属性是通过请求的地址来进行有效的过滤。
- 通过serPath()来设置:
cookie.setPath( req.getContextPath() + "/abc" );
// 假设有两个Cookie CookieA path=/工程路径 CookieB path=/工程路径/abc //请求地址如下: http://ip:port/工程路径/a.html CookieA 发送 CookieB 不发送 http://ip:port/工程路径/abc/a.html CookieA 发送 CookieB 发送
9.2 Session会话
9.2.1 什么是 Session
- Session 是一个接口(HttpSession) 。
- Session 是会话,是用来维护一个客户端和服务器之间关联的一种技术。
- 每个客户端都有自己的一个 Session 会话。
- Session 会话中,我们经常用来保存用户登录之后的信息。
9.2.2 Session的创建与获取
- 创建和获取 Session的 API 是一样的
request.getSession()
- 第一次调用是: 创建 Session 会话
- 之后调用都是: 获取前面创建好的 Session 会话对象
isNew()
判断到底是不是刚创建出来的(新的)true
表示刚创建false
表示获取之前创建
getId()
: 得到 Session会话的id值,每个会话都有一个唯一的ID值。
9.2.3 Session 域数据的存取
- 通过setAttribute()方法保存数据,getAttribute()读取数据
- 示例
//保存 protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException { req.getSession().setAttribute("key1", "value1"); resp.getWriter().write("已经往 Session 中保存了数据"); }
// 获取 protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException { Object attribute = req.getSession().getAttribute("key1"); resp.getWriter().write("从 Session 中获取出 key1 的数据是:" + attribute); }
9.2.4 Session 生命周期控制
public void setMaxInactiveInterval(int interval)
设置 Session 的超时时间( 以秒为单位),超过指定的时长,Session就会被销毁- 正数:Session 的超时时长。
- 负数:永不超时(极少使用)
- 修改默认超时时长
- Session 默认的超时时间长为 30 分钟
- Tomcat 服务器的配置文件 web.xml中配置了当前 Tomcat 服务器下所有的Session超时配置默认时长:
<session-config> <session-timeout>20</session-timeout> </session-config>
- 修改个别 Session 的超时时长时使用
setMaxInactiveInterval
方法 public int getMaxInactiveInterval()
获取 Session 的超时时间public void invalidate()
让当前 Session 会话马上超时无效- Session的超时指客户端两次请求的最大间隔时长
9.2.5 浏览器和 Session 之间关联的技术内幕
Session 技术, 底层其实是基于 Cookie 技术来实现的