【简介】: HTTP是无状态的,也就是没有记忆力的,也无法确定发出请求的用户身份,只负责一问一答。
【问题】: 多个请求之间无法共享数据。
【解决方案】:
【简介】: Cookie 是 客户端技术,程序把每个用户的数据以 cookie 的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的 Web 资源时,就会带着各自的数据到服务器。这样,Web 资源处理的就是用户各自的数据了。
Cookie cookie = new Cookie(String name,String value);
属性 | 方法 | 说明 |
---|---|---|
name | getName() | 共享数据名称 |
value | getValue() | 要共享的数据 |
resp.addCookie(cookie);
【说明】: 浏览器发请求时,自动将 Cookie 发送到服务器,服务器程序直接获取即可。数据在请求中,使用请求对象中的 getCookies() 方法获取所有的 Cookie 对象。
Cookie[] cookies = requset.getCookies();
【注意】: 以上两种方式都会修改Cookie的数据,但是修改的都是服务端的数据,和浏览器中存的Cookie没有关系,所以需要将新的Cookie重新响应给浏览器进行更新。
【语法】:
resp.addCookie(新的 Cookie 对象);
【语法】:
cookie.setMaxAge(int expiry);
【参数】:
expiry 数值 | 举例 | 说明 |
---|---|---|
大于0 | setMaxAge(60) | Cookie存活时间,单位为秒,例:60s |
等于0 | setMaxAge(0) | 立即删除当前Cookie |
小于0 | setMaxAge(-1) | 会话Cookie,浏览器关闭就销毁 |
【语法】:
cookie.setMaxAge(0);
resp.addCookie(cookie);
【注意】: 在删除cookie之后要重新发送给浏览器去更新Cookie。
【域和路径的作用】: 为了让浏览器可以识别 Cookie 发送给对应的服务器,以及识别哪些请求需要携带 Cookie,默认Cookie 都带了服务器的识别标识以及需要带 Cookie 的资源标识,这是出于安全考虑,为了保护Cookie 中的数据不被带到其他服务器中去。
【域】: 域用来识别服务器,包含 IP:端口或域名:端口,可通过 Cookie 对象的 setDomain 方法设置。默认Cookie 中的域是创建 Cookie 的服务器的域名。
【举例】: 若想要在相同的主域名下来共享 Cookies 数据,例如,百度和百度地图,百度音乐共用账号,则只需要设置 Cookie 的 domain 即可。若主域不同,是无法共享 Cookie 数据。
cookie.setDomain(".baidu.com");
【路径】: 路径用来识别资源,可通过 Cookie 对象的 setPath 方法设置。默认为创建 Cookie 的资源的路径。
【举例】: /cookie/login 创建 Cookie,则 path 为 /cookie,则访问 /cookie 开头的资源都会携带该Cookie。若想要在访问服务器上的任意资源都带上 Cookie,则只需要在创建 Cookie 之后设置下 path 为 / 即可。
cookie.setPath("/");
方法 | 作用 |
---|---|
getSession(true) | 判断是否存在 Session,存在则获取,不存在则创建新 Session 对象返回 |
getSession(false) | 判断是否存在 Session,存在则获取,不存在则返回 null (不符合需求) |
getSession() | 判断是否存在 Session(浏览器是否带了 sessionId),存在则获取,不存在则创建新 Session 对象返回(推荐) |
方法 | 作用 |
---|---|
setAttribute(String name, Object value) | 设置属性名和属性值 |
getAttribute(String name) | 通过属性名去获取属性值 |
removeAttribute(String name) | 从 Session 中移除指定属性名的属性值 |
invalidate() | 移除整个 Session 对象,删除所有的属性和属性 |
【全局修改】:
<session-config>
<session-timeout>30session-timeout>
session-config>
【局部修改】:
// 设置超时时间,单位:秒
session.setMaxInactiveInterval(int interval);
【问题】: Session 是基于 Cookie 的,sessionId 是存在浏览器上,用户可选择不接受 Cookie 或者禁用 Cookie,此时 Session 失效。
【解决方案】:
【servlet中重写URL】: 在请求的 URL 后面拼接 jsessionid(自动检测用户是否开启 Cookie 接收,若开启了,则不拼接jsessionid)
response.encodeURL("/session/list");
【在jsp中重写URL】:
<%
String url = response.encodeURL("/session/list");
%>
${pageContext.response.encodeURL("/session/list")}
\