typora-copy-images-to: img
Cookie与Session
Cookie:客户端会话跟踪技术
Seesion:服务端会话跟踪技术
Cookie
创建Cookie对象
Cookie cookie=new Cookie(String name,String value)
响应Cookie给浏览器
resp.addCookie(cookie);
服务器端获取Cookie
Cookie[] cookies=resquest对象.getCookies();
//因为获取所有Cookie是数组所以需要遍历用getValue();获取cookie的值
Jsp中获取Cookie数据
//推荐同EL表达式
${cookie.username.value}<br/>
在servlet中修改Cookie中的值
//方式一
cookie.setValue("一个新的值");
//方式二
cookie=new Cookie("同名","新的值");
//两者最后都需要响应对象返回给浏览器
resp.addCookie(cookie);
设置Cookie存活时间
cookie.setMaxAge("秒数");
//大于0则为存活秒数 硬盘cookie
//小于0则随着浏览器关闭而销毁 内存cookie
//等于0则立即删除cookie对象
Cookie中文问题
//往Cookie中存中文数据
Cookie cookie=new Cookie("名字",URLEncoder.encode("值","编码类型"))
// 从 Cookie 中获取中文数据
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if("username".equals(cookie.getName())) {
System.out.println(URLDecoder.decode(cookie.getValue(), "UTF-8"));
}
}
Cookie的域和路劲(我理解为作用域)
//默认Cookie中的域式创建Cokie的服务器的域名
//一级(主)域名 baidu.com
//多级域名 news.baidu.com
cookie.setDomain(".baidu.com")
//默认为创建 Cookie 的资源的路径。例:/cookie/login 创建 Cookie,则 path 为 /cookie,则访问 /cookie 开头的资源都会携带该 Cookie。
cookie.setPath("/")//即可访问服务器上所有资源
//总结: - 若主域不同,不管 path 如何,都无法带上其他主域的 Cookie。
// - 若主域相同,且 path 也为 /,则访问该域下的任意资源都会携带该域的 Cookie。
Session
获取Session
//获取 Session 对象可通过使用 HttpServletRequest 的 API:
req.getSession()
//判断是否存在 Session(浏览器是否带了 sessionId),存在则获取,不存在则创建新 Session 对象返回(推荐)
Session数据共享
HttpSession API:
方法 | 作用 |
---|---|
setAttribute(String name, Object value) | 设置属性名和属性值 |
getAttribute(String name) | 通过属性名去获取属性值 |
removeAttribute(String name) | 从 Session 中移除指定属性名的属性值 |
invalidate() | 移除整个 Session 对象,删除所有的属性和属性值 |
removeAttribute 和 invalidate 视情况选择,删除部分数据使用 removeAttribute,删除全部数据使用 invalidate。
局部修改
session.setMaxInactiveInterval(int interval);//设置超时时间为XX秒
Session使用规范
session.setAttribute("XX_IN_SESSION",值);
存在的问题
Session 是基于 Cookie 的,sessionId 是存在浏览器上,用户可选择不接受 Cookie 或者禁用 Cookie,此时 Session 失效。
解决方案
//设置在URL后拼接的jsessionid 用;来间隔
//自动检测用户是否开启Cookie接收,若开启则不拼接
rsponse.encodeURL("/session/list")
//Jsp中重写
<%String url=response.encodeURL("/session/list")%>
<a href="<%=url%>">收件箱</a>
//EL重写
${pageContext.response.encodeURL("/session.list")}
ing url=response.encodeURL("/session/list")%>
<a href="<%=url%>">收件箱</a>
//EL重写
${pageContext.response.encodeURL("/session.list")}