Session
1. web中的会话是指一个客户端与web服务器之间连续发生的一系列请求和响应过程
2. 会话状态是指定web服务器与浏览器在会话过程中产生的状态信息
3. 一次会话可以跨越多个请求
4. 创建会话两个方法:getSession()如果没有会新建一个会话,并赋予唯一的ID,有的话就根据要求返回相匹配的会话。
5. getSession(boolean flag)用flag来指定是否有必要创建一个会话,调用getSession(false)时,若客户先前没有建立过会话,则方法将返回null
6. 结束会话:invalidate()
7. 有状态的会话是服务器能够记录客户端跟服务器会话的状态信息
8. http协议是一种无状态的协议
9. 常用的会话跟踪技术:通过cookie在请求消息中传递会话ID,它是浏览器访问资源时,有web服务器在http消息头中附带的传送给浏览器的一段数据;
在web.xml中设置会话的超时时间是在这整个项目设置的实效时间,而用setMaxInactiveInterval(int Interval)是在当前的应用中设置的超时时间。setMaxInactiveInterval设置的是当前会话的失效时间,不是整个web的时间,单位为以秒计算。如果设置的值为零或负数,则表示会话将永远不会超时。常用于设置当前会话时间。
10. 服务器通过设置响应消息头的Set-Cookie域来发送Cookie。Set-Cookie:Name=value;Domain=XX;Max-age=seconds;Path=path;
Name指的是cookie名称;value指的是cookie名称的值,domain指定cookie在那个域中有效,浏览器访问这个域中所有的主机的时候,都将返回传这个cookie的信息。默认值为当前主机名;path用于指定当前应用的哪个url目录路径有效;
11. url重写原理,讲会话id写到url末尾(如果浏览器不支持cookie就必需重写url)
12. url重写方法:encodeURL(Stringurl)对超链接和form表单中的URL进行重写
encodeRedictURL()对要传递给sendRedirect()方法的url进行重写
总结1. 会话:Web应用中,客户端与服务器的一系列连续的请求和响应过程。
会话状态:在会话过程中,产生的一些状态数据。
2. 会话状态是服务器端保存的,在JavaWeb是使用HttpSession对象,也叫会话作用域。
3. HttpSession接口:每一个HttSession对象都有一个惟一的标识符,会话ID。
1) 获取: request.getSession(); //request.getSession(boolean flag);
2) boolean isNew(); //是否为新建的会话
3) String getId(); //会话ID
4) long getCreationTime(); //得到会话创建的时间
5) void setAttribute("名",Object 值);
6) Object getAttribute("名");
7) void removeAttribute("名");
8) public long getLastAccessedTime(); //得到最后一次访问此会话的时间毫秒值
9) void invalidate(); //使会话失效,会话实效不是销毁,在页面中用该方法使会话实效时,仍可通过getId()得到其id,只有再跳转到下一个页面的时候才会新生成一个session
4. 会话结束:
1) 主动结束会话:HttpSession的invalidate(); //会员显式“退出”时。
2) 自动超时结束:当两次针对HttpSession操作的时间间隔超过了默认的超时时间(30分钟)时,会话自动结束。
在本应用的web.xml中通过
在Web容器中可以配置:如tomcat是在CATALINA_HOME/conf/web.xml中。
5. 会话跟踪的原理:Web服务器必须以某种方式把会话ID(jsessionid)作为响应的一部分交给客户端,而客户端必须把会话ID作为请求的一部分发回给服务器。
6. 会话跟踪的常用两种技术:
1) Cookie:自动进行,无须开发人员管理。缺点: 客户端有可能会禁用Cookie。
2) URL重写:使用response.encodeURL(Stringurl); 根据客户端是否支持Cookie来选择是否需要将会话ID添加到URL的结尾,以标识该会话
http://127.0.0.1:8080/webappName/xxx.do?paramName=value¶mName=value;jsessionid=xxxxxxxxxxxxxxxxxx
缺点:Web应用所有跳转的url都需要进行URL重写。
7. HttpSession对象的序列化问题:
为了提高服务器内存资源的利用率,Web服务器通常将那些暂时不活动但未超时的HttpSession对象持久化到磁盘文件系统中保存,一旦服务器需要使用它们时,再将它们从文件系统中装载进内存。
注意:凡是存放到HttpSession中的对象都要是可序列化的。该对象对应的类要实现Serializable接口,并且所有的属性也要可序列化。
8. Cookie:是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一段数据。
浏览器可以决定是否保存这段数据。一旦浏览器保存了这段数据,那么它在以后每次访问该Web服务器时,都会在HTTP请求头中将这段数据传给Web服务器。
1) HTTP规范中没有定义Set-Cookie消息头字段,但所有浏览器都支持Cookie的如下属性:Path=PATH;
Name :指定 Cookie的名称;
VALUE:指定 Cookie名称的值。
Domain:指定 Cookie在哪个域中有效,浏览器访问这个域中的所有主机时,都将回传这个Cookie信息。默认值为当前主机名。
Max-age: 指定Cookie 在客户端保持有效的时间(秒)
正数——保存在客户端文件系统中。
0——通知浏览器立即删除这个Cookie。
负数——在浏览器关闭时删除这个Cookie。保存在浏览器进程对应的内存空间中,也叫内存Cookie。和没有设置Max-Age效果相同。
Path:用于指定Cookie对服务器上的哪个URL目录和其子目录有效。
2)Servlet API中提供了一个javax.servlet.http.Cookie类来代表Cookie:
a) 服务器端Servlet发送Cookie到客户端:使用HttpServletResponse提供的void addCookie(Cookie)方法
一个servlet/jsp设置的cookies能够被同一个路径下面或者子路径下面的servlet/jsp读到。
b) 客户端发送Cookie到服务器端: 自动发送
c) 服务器端获取客户端发送的Cookie:HttpServletRequest提供Cookie[] getCookies()方法来获取取客户端发送所有Cookie