#HttpSession
##会话跟踪
为什么需要会话跟踪?
- HTTP协议是一种无状态的协议(一般情况下,在响应客户后就与客户断开连接)
- 需要对用户在访问同一web应用(** 一个用户访问一个web容器或服务器会产生一个会话对象 **)时对用户进行跟踪(如: 是否登录等)
HttpSession
:在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。(Session ID是通过Cookie来传递的,服务器端获取Session对象依赖于客户端携带的Cookie中的JSESSIONID数据)
- HttpSession是java web对用户进行会话跟踪的一个** 接口 **
- HttpSession由Servlet容器的提供者实现
- HttpSession通过** HttpServletRequest **的getSession()或者getSession(Boolean)方法获取
- getSession()如果会话没有被创建则创建并返回
- getSession(boolean) 如果参数是false,如果会话存在则返回,否则返回null;如果参数为true,和无参数方法一致。
常用方法:
- String getId() 返回包含分配给此会话的唯一标识符的字符串(会话ID)
- void invalidate() 使会话无效,然后取消对任何绑定到词汇化的对象的绑定
- void setAttribute(String name,Object value)使用指定名称将对象绑定到此会话
- Object getAttribute(String name)返回此会话中的指定名称绑在到一起的对象
- void removeAttribute(String name)从此会话中移除与指定名称绑定在一起的对象。
cookie
:Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用** Response **向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
- Cookies是Servlet发送到Web浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。Cookie一般用来保存会话ID来实现会话跟踪(jsessionid=xxxxxxxx)
- 一个Cookie拥有一个名称、一个值和一些可选属性,比如注释、路径和域限定符、最大生存时间和版本号。
- Servlet通过使用HTTPServletRespone的addCookie(cookie)方法将Cookie发送到浏览器,该方法将字段添加到HTTP响应头发送到浏览器。浏览器支持每台Web服务器有20个Cookie。总共有300个Cookie。每个Coolie的大小默认为4kb
- 浏览器通过向HTTP请求头添加字段将Cookie(cookie) 返回给Servlet。可使用HttpServletRequset的getCookie()方法从请求中获取Cookie
- Cookie通过名称和路径来进行区分。
####常用方法:
- Cookie(String name,String value)构建通过key/value保存的信息
- void setDomain(String pattern)指定应在其中显示此Cookie的域
- String getDomain()返回为此Cookie设置的域名
- void setMaxAge(int expiry)设置 Cookie的最大生存空间,以秒为单位。负值浏览器退出时删除。0值会导致删除cookie
- int getMaxAge()返回以秒为单位指定的Cookie的最大的生存空时间
- String getName()返回Cookie的名称。名称在创建后不得更改
- String getValue() 返回Cookie的值
- void setPath(String url)指定客户端应该返回Cookie的路径。对于指定目录中的所有页面及其子目录中的所有页面都是可见的。
URL重写
- 为什么要对URL进行重写
- 客户端不支持Cookie或者禁用Cookie
- 服务器端不能通过Cookie获取jsessionid
- URl重写
- 将jsessionid加入到URL之后
- 使用HttpServletRequest进行重写
- String encodeURL(String url) 通过将会话ID包含在指定URL中并对该URL进行编码。如果不需要编码,则返回未更改的URL。
- String encodeRedirect(String url) 对指定URL进行编码,以便在 sendRedirect 方法中使用它,如果不需要编码,则返回未更改的URL(可判断是否需要将ID加入到URl)