Http协议是基于请求/响应模式、无状态的协议;所有请求时相互独立的、无连续的;服务器无法记住与识别用户。
对于简单的页面浏览或信息获取,http协议可以完全胜任;对于需要提供客户端和服务器端交互的网络应用则必须记住客户端状态。
会话就是一个连续不断的在在客户端和服务器端进行请求响应的一系列交互。
会话跟踪就是在这些请求和响应中维护需要的数据信息,使得这些相关的请求和响应得到正确的运作。
会话的实现过程:
- 当服务器端接收到客户端的首次请求时,服务器初始化一个会话并分配给该会话一个唯一标识符
- 在以后的请求中,客户端必须将唯一标识符包在请求中,服务器根据此标识符将请求与对应的会话联系起来。
实现会话跟踪的技术:
- 使用Cookie:所有的Http消息,不管是请求还是响应均包含头信息,由浏览器存储在客户端机器上的头信息就称作Cookie,以“属性=属性值;..”方式组成的文本信息;优点:简单性、基于文本的key-value对
- 创建Cookie : //Cookie c =new Cookie("userId","a1234");
- 设置最大时效:c.setMaxAge(60*60*24*7);
- 把cookie放入到http响应中:response.addCookie(c);
- 从客户端读取cookie:Cookie[] cookies=request.getCookies(); if(cookies!=null){for(int i =0;i<cookies.length;i++){Cookie cookie =cookies[i]; if(cookieName.equals(cookie.getName())){//do something with(codeValue)}}}
- cookie的属性:
- getMaxAge(); //设置cookie到期时间
- getName(); //读取cookie的名称
- getValue(); //读取/设置与cookie关联的值
- URL重写:
- 优点:必须对所有指向您的网站的url进行编码;所有页面必须动态生成;不能使用预先记录下来的url进行访问
- 缺点:cookie被禁用或者根本不支持的情况下依旧能够功能
- 隐藏的表单域
- <input type="hidden" name="session" value="..."/>
- 优点:cookie被禁用或者根本不支持的情况下依旧能够工作。
- 缺点:所有的页面必须是表单提交之后的结果。
- 会话对象生存于服务器上;会话自动通过cookie或url重写与客户关联起来,允许我们将任何对象存储到会话中
- HttpSession
- servlet容器提供httpsession接口来代表客户端和服务器端的会话;当一个Servlet容器为客户端开始一个会话时,创建一个新的HttpSession对象,除了代表会话外,httpSession对象还可以用于存储与会话相关的信息
- httpSession会话跟踪基础:
- 访问会话对象,request.getSession();
- getAttribute
- setAttribute
- removeAttribute,invalidate
会话失效:
通过web.xml的<session-timeout>,由程序来结束会话httpSession接口提供了invalidate()