前言          

                        前面的学习中我们知道HTTP协议是一种无状态协议。有时候我们需要在多个页面之间共享

                    数据,这在web应用中如何实现呢?Session可以帮助我们做到!

            Session

                         用户访问某个网站时,web服务器就会在服务器的内存中为该浏览器分配一个空间,这个

                     空间是被浏览器独占的。该空间就称其为Session空间,用户通过浏览器访问服务器,再到

                     浏览器退出访问这段时间叫做session会话,这个会话时间通常为30min(可以手动修改)。

                        Servlet之Session--不同用户页面共享_Tomcat

                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有哪些操作。具体方法笔者也不过多的去阐述了,给个方法一览

                              吧。

                                             Servlet之Session--不同用户页面共享_Session_02

                                      这里我们经常使用的是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>
                              看看实际的效果吧。

                             Servlet之Session--不同用户页面共享_Tomcat_03

                            登录验证成功之后我们进入index界面,之后我们耐心的等待20秒钟,在刷新页面

                      可以发现的是重新跳转到登录界面了。

                               Servlet之Session--不同用户页面共享_时间_04

                  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