HTTP协议是一种无状态的协议,作为 web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态
WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。
需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)。
一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。
Cookie机制
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和值(VALUE)。
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie,其中允许每个站点最多20个Cookie,每个Cookie的大小限制为4KB。
Cookie的传送过程示意图
HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段。
HttpServletRequest接口中定义了一个getCookies方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。
response.setContentType("text/html;charset=utf-8");
//获取请求中的Cookie
Cookie[] cookies = request.getCookies();
for (Cookie coo:cookies) {
response.getWriter().print(coo.getName()+":"+coo.getValue()+"<br>");
}
Session机制
1.当用户第一次使用session时(表示第一次请求服务器),服务器会创建session,
并创建一个Cookie,在Cookie中保存了session的id,发送给客户端。这样客户端就有了自己session的id了。但这个Cookie只在浏览器内存中存在,也就是说,在关闭浏览器窗口后,Cookie就会丢失,也就丢失了sessionId。
2.当用户第二次访问服务器时,会在请求中把保存了sessionId的Cookie发送给服务器,服务器通过sessionId查找session对象,然后给使用。也就是说,只要浏览器容器不关闭,无论访问服务器多少次,使用的都是同一个session对象。这样也就可以让多个请求共享同一个session了。
3.当用户关闭了浏览器窗口后,再打开浏览器访问服务器,这时请求中没有了sessionId,那么服务器会创建一个session,再把sessionId通过Cookie保存到浏览器中,也是一个新的会话开始了。原来的session会因为长时间无法访问而失效。
4.当用户打开某个服务器页面长时间没动作时,这样session会超时失效,当用户再有活动时,服务器通过用户提供的sessionId已经找不到session对象了,那么服务器还是会创建一个新的session对象,再把新的sessionId保存到客户端。这也是一个新的会话开始了。
Session的超时管理 :
会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容器定义。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
表单的重复提交:
1.重复提交的情况:
1).在表单请求了一个servlet,而servlet又通过请求转发的方式响应一个jsp界面,
当我刷新时,地址栏还是保留着servlet的那个路径,就出现了重复提交的情况;重定向不会出现重复提交
2).在响应没有完成,重复点击提交按钮;
3).点击后退,再点提交