前言
前面的学习中我们知道HTTP协议是一种无状态协议。有时候我们需要在多个页面之间共享
数据,这在web应用中如何实现呢?Session可以帮助我们做到!
Session
用户访问某个网站时,web服务器就会在服务器的内存中为该浏览器分配一个空间,这个
空间是被浏览器独占的。该空间就称其为Session空间,用户通过浏览器访问服务器,再到
浏览器退出访问这段时间叫做session会话,这个会话时间通常为30min(可以手动修改)。
Session的作用
理解Session最好从Session的作用入手,一般来说Session的作用如下:
1、保存用户登录信息。
2、同一客户端浏览器各个页面共享数据
3、验证用户是否非法登录某个页面
对于Session的理解我们应该从浏览器对web服务器的一次会话中去理解。
session数据的存在时间默认为30min,当你浏览某个网站,中途出去吃饭
浏览器并未关闭。超过30min之后session数据会被清空。当你从新浏览页面
时,服务器会查询看session空间里面的内容若为空,则需用户重新登录。
这也是一种较为安全的做法。
Session与Cookie
与Cookie不同的是Session是存在与服务器的,是有Tomcat服务器维护的,
而session存在与客户端浏览器,有浏览器维护。基于这点Session相对于Cookie
来说更加的安全。
Session的工作原理
1、服务器为客户端创建并维护一个Session对象,用于存放数据。
2、在创建Session对象的同时,服务器将会为该Session对象生成一个唯一的
sessionID
3、服务器以cookie的方式将sessionID存放在客户端。
4、当浏览器再次访问该服务器时,会将sessionID作为cookie信息带到服务器
服务器可以通过sessionID检索到以前的session对象,并对其进行访问。
Session源码
了解了session的概念和工作原理之后我们来看看Session的源码,通过其源码的
阅读了解下session有哪些操作。具体方法笔者也不过多的去阐述了,给个方法一览
吧。
这里我们经常使用的是setAttribute和getAttribute方法,同样setMaxInactiveInterval
方法设置Seesion会话有效的时间。以秒为单位。
那么HttpSession又是如何得到的呢?HttpSession是从请求中的得到的,具体的做法
就是。
HttpSession session = request.getSession();//返回当前request的session,如果没有则创建一个两外可以参考:
/** * * Returns the current <code>HttpSession</code> * associated with this request or, if there is no * current session and <code>create</code> is true, returns * a new session. * * <p>If <code>create</code> is <code>false</code> * and the request has no valid <code>HttpSession</code>, * this method returns <code>null</code>. * * <p>To make sure the session is properly maintained, * you must call this method before * the response is committed. If the container is using cookies * to maintain session integrity and is asked to create a new session * when the response is committed, an IllegalStateException is thrown. * * * * * @param create <code>true</code> to create * a new session for this request if necessary; * <code>false</code> to return <code>null</code> * if there's no current session * * * @return the <code>HttpSession</code> associated * with this request or <code>null</code> if * <code>create</code> is <code>false</code> * and the request has no valid session * * @see #getSession() * * */ public HttpSession getSession(boolean create);
简而言之:
HttpServletRequest.getSession(ture) 等同于 HttpServletRequest.getSession()
HttpServletRequest.getSession(false) 等同于 如果当前Session没有就为null;
Session简单实例--用户验证
有这么一种要求当用户登录一个网站,中途有事,但并未关闭浏览器,等到用户回来的
时候如果Session会话时间结束处于安全性的考虑需要用户重新登录。这里我们做一个简单
的实践。
我们现在Servlet中做简单的登录验证,验证通过之后就将用户信息保存在Session中,之后
再在各个jsp页面中添加验证代码,验证不通过则返回登录界面。
Servlet逻辑部分代码如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false);//得到HttpSession对象 String email = request.getParameter("email"); String password = request.getParameter("pass"); User user = new User(); user.setEmail(email); user.setPassword(password); if(email.equals("1406754158@qq.com")&&password.equals("kiritor")) { session.setAttribute("user", user); session.setMaxInactiveInterval(20);//设定时间为20秒 System.out.println(session.getAttribute("user")); response.sendRedirect("index.jsp"); } }之后我们在index界面简单的添加验证代码。
<%@page import="com.Dao.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <% HttpSession httpSession = request.getSession(); User user = (User)httpSession.getAttribute("user"); out.print(user.getEmail()); %> 欢迎来到首页 </body> </html>看看实际的效果吧。
登录验证成功之后我们进入index界面,之后我们耐心的等待20秒钟,在刷新页面
可以发现的是重新跳转到登录界面了。
Session存活时间
上述的代码中我们修改了Session存在时间,那么有其他的方式修改其存在时间吗
答案是肯定的,而且不止一种,现在笔者就简要的对其进行下总结。
1、 在tomcat——>conf——>servler.xml文件中定义:
<Context path="/test" docBase="/test" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/>2、在web.xml中定义:这个针对具体项目
<session-config> <session-timeout>20</session-timeout> </session-config>3、程序中定义,这个就不多提了,上面有实现。
4.Tomcat在conf/context.xml文件设置:这个是针对所有的项目了
<Manager className="org.apache.catalina.session.PersistentM anager" > debug=0 saveOnRestart="true" maxActiveSession="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1" <Store className="org.apache.catalina.session.FileStore" directory="../session" /> //这里代表的是文件持久化.也可以自己实现Store </Manager>好了,今天的总结就到这里了。
By Kiritor
2012/06/13