内容全部来源于互联网,属于总结性质:
jsp中session的声明周期
问题1:说说session和cookie的作用
答案:
在web中常用的两种用户信息管理方式:cookie 和 session.
cookie是保存在用户客户端的数据,用于避免每次发送http请求时,连带过多的数据,造成复杂化。所以Cookie保存在客户端中,根据服务器端的要求,保存特定的内容,在每次http请求后,自动添加一定的内容。
session是保存在服务器端的数据,用于验证几次请求是否属于同一会话,在同一会话中,会避免进行不必要的验证,保证用户的操作连贯性。
问题2:在JSP中,当浏览器关闭后,Session就销毁了吗?
答案:
存在于浏览器上的唯一标识符SessionID消失了,但是服务器中存放的Sessionid并Session没有立马销毁。
关闭浏览器后浏览器不会向服务器发送请求来关闭Session,所以Session不会被销毁。虽然可以在所有的客户端页面使用JS的window.onclose来监听浏览器的关闭动作,然后向服务器发送一个请求来关闭Session,但是这种做法在实际的开发中也是不推荐使用的,最正常的办法就是不去管它,让它等到默认的时间后,自动销毁。
那么为什么当我们关闭浏览器后,就再也访问不到之前的session了呢?其实之前的Session一直都在服务器端,而当我们关闭浏览器时,此时的Cookie是存在于浏览器的进程中的,当浏览器关闭时,Cookie也就不存在了。
为什么关闭浏览器后存在浏览器的Cookie就不存在了呢?Cookie有两种,分别存在浏览器的进程和硬盘。
而Session的Cookie存在浏览器的进程中,这种Cookie我们称为会话Cookie(在JSP中该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效。) 当我们重新打开浏览器时,之前的Cookie中存放的SessionID已经不存在了,此时服务器从HttpServletRequest对象中没有找到SessionID,那么服务器会再发送一个新的存有SessionID的Cookie到浏览器中,即开启了一个新的会话,而服务器上原先的Session等到它的默认时间到之后,便会自动销毁。
问题3:结束Session生命周期有哪些方式?
1,手动失效 调用HttpSession 的 invalidate()方法,手动删除 HttpSession 对象和数据。不过这个方法在实际的开发中,并不推荐,可能在强制注销用户的时候会使用;
2 自动失效 两次访问时间间隔大于 Session定义的非活动时间间隔,Session过期导致失效。
3, 浏览器关闭导致 Session的ID 失效
4,服务器重新启动
问题4:如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?
答案:
绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。
URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。
如下,为jsp页面中Session声明周期的详细介绍
当一个Session开始时,Servlet容器会创建一个HttpSession对象并为该HttpSession对象分配一个唯一标识符即SessionID,Servlet容器把SessionID作为一种Cookie保存在客户端的浏览器中(因为http协议是无状态的,Session不能依据http连接来判断是否为同一客户),该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效。用户每次发出Http请求时,Servlet容器会从HttpServletRequest对象中取出SessionID,然后根据这个SessionID找到相应的HttpSession对象,从而获取用户的状态信息。
1 当用户第一次访问一个支持Session的Web应用时,会开启一个新的Session会话,此时服务器端的Servlet容器会创建一个HttpSession对象,该HttpSession对象可以存放用户状态的信息。JSP的session对象默认时30分钟过期。可通过函数方法设置过期时间session.setMaxInactiveInterval(60);//单位是秒
,也可以通过web.xml文件设置过期时间
2 Servlet容器为每个HttpSession对象分配一个唯一标识符即SessionID,把它作为一种Cookie保存在客户端即浏览器中。
3 之后用户发出的HTTP请求都会携带此SessionID进行校验,服务端的Servlet容器会从HttpServletRequest对象中取出SessionID,然后根据这个SessionID找到对应的HttpSession对象,从而获取用户的状态信息。