一、会话机制定义:
- 用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这个整个过程叫做一次会话。会话在服务器端也有一个对应的java对象,这个java对象叫做:session。
- 一个会话中包含多次请求。
- 在java的servlet规范当中,session对应的类名:HttpSession(jarkata.servlet.http.HttpSession)
- session对象最主要的作用是:保存会话状态。(用户登录成功了,这个是一种登录成功的状态,你怎么把登录成功的状态一直保存下来呢?使用session对象可以保留会话状态。)
- request请求域(HttpServletRequest)请求级别的、session会话域(HttpSession)用户级别的、application应用域(ServletContext)项目级别的,所有用户数据共享。
- 三种域的范围比较:request<session<application
二、session的实现原理:
- sessionID以cookie形式保存在浏览器内存中。
- 正常情况服务器创建session对象后发送cookie给浏览器,浏览器记住这个id用于获取session。
- cookie禁用后,服务器正常发送cookie给浏览器,但是浏览器不要了,拒收了。并不是服务器不发了。
三、设置session对象自动销毁时间:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
四、session用法:
- 某些网页的内容需要用户登录后才能查看,为了防止用户不登录就查看网页内容(即直接输出要查看网页的URL),需要在用户的会话中加入session。只要用户不登录,就会被拦截在登录页面,后续页面也将无法查看。
实现:
(1)首先在登录成功的servlet代码中加入session.setAttribute("username",request.getParameter("username"));
,给登陆成功的用户创建session对象。
(2)然后把用户输入的信息添加到会话域中。
(3)然后在后续页面的servlet中加入if语句,if(session != null && session.getAttribute("username") != null)
,如果用户没有创建session且session中的"username"为空,则response.sendRedirect(request.getContextPath()+"/index.jsp");
重定向到登录界面。如果if为true,,则正常执行相关servlet代码。 - 用于用户点击退出登录按钮后清空cookie,提示用户需要重新登陆。
实现:
(1)获取session对象:HttpSession session = request.getSession(false);
(2)判断session是否为空:if (session != null)
(3)不为空销毁session:session.invalidate();//手动销毁session
五、访问JSP时会自动创建session:
因为JSP文件编译后的java代码中有一个变量就是session,即JSP会自动创建一个session,这个session会影响我们判断是否是用户登录成功后创建的session。
- 解决方法:
方法一:<%page session="false"%>
这样访问JSP的时候JSP就不会自动创建session了。不建议用这种方式
方法二:上述if语句中加入session.getAttribute("username") != null
,因为JSP自动创建的session中是没有“username”这个属性的,这个属性是用户登录成功后才传进session会话域的。