HttpSession对象可以保存同一个客户多个请求的会话状态
容器如何知道客户是谁?
通过唯一的会话ID
怎样得到会话?
- HttpSession session = request.getSession();
HttpSession session = request.getSession();
如果找到与该请求匹配的会话,返回会话,如果没有,创建一个新会话
客户和容器如何交换会话ID信息?
通过cookie,如果客户端cookie被禁用,则采用URL重写
怎样知道会话是已经存在,还是刚刚创建?
- HttpSession session = request.getSession();
- if (session.isNew) {
- // is a new session
- }
HttpSession session = request.getSession();if (session.isNew) { // is a new session}
如果只想要一个现有的会话呢?
- HttpSession session = request.getSession(false);
- if (session == null) {
- //如果不存在,返回null
- }
HttpSession session = request.getSession(false);if (session == null) { //如果不存在,返回null}
只有告诉响应要对URL编码,URL重写才能奏效
- response.encodeURL("/BeerTest.do");//向这个URL增加额外的会话信息
response.encodeURL("/BeerTest.do");//向这个URL增加额外的会话信息
要使用URL重写,页面必须是动态生成的,静态HTML页面不能URL重写。
URL重写只有响应有关
会话的三种死法:
1.超时 2.在会话上调用invalidate() 3.应用结束(崩溃或取消部署)
如何设置会话超时?
1.DD中配置
- <session-config>
- <session-timeout>15</session-timeout>
- </session-config>
15
单位是分钟
2.设置特定会话的超时(不影响其他会话)
- sesson.setMaxInactiveInterval(20 * 60);
sesson.setMaxInactiveInterval(20 * 60);
单位是秒
使用cookie
- // 创建一个新cookie
- Cookie cookie = new Cookie("username", username);
- // 设置一个cookie在客户端存活多久
- cookie.setMaxAge(30 * 60); // 如果是-1,那么浏览器退出时cookie消失
- // 把cookie发送到客户
- response.addCookie(cookie);
- // 从客户请求得到cookie
- Cookies[] cookies = request.getCookies();
- for (Cookie cookie : cookies) {
- if (cookie.getValue().equals("username")) {
- // do something
- }
- }
// 创建一个新cookieCookie cookie = new Cookie("username", username);// 设置一个cookie在客户端存活多久cookie.setMaxAge(30 * 60); // 如果是-1,那么浏览器退出时cookie消失// 把cookie发送到客户response.addCookie(cookie);// 从客户请求得到cookieCookies[] cookies = request.getCookies();for (Cookie cookie : cookies) { if (cookie.getValue().equals("username")) { // do something }}
没有得到一个cookie的方法,只能得到cookie数组,遍历操作你想要的cookie