会话管理之Session详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guyan1111/article/details/54954899

            Cookie特点:

                                1)会话数据放在浏览器端

                                2)数据类型只能string,而且有大小限制的

3)相对数据存放不安全。

               Session特点:

                1)会话数据放在服务器端(服务器内存),占用服务器资源

                                2)数据类型任意类型,没有大小限制的。

                                3)相对安全

       Session使用步骤

                    HttpSession对象:

                                               1)创建HttpSession对象,用于保存会话数据

                                                                 session= request.getSession();   创建或获取session对象

                                               2)修改HttpSession对象

                                                                 voidsetMaxInactiveInterval(int interval)  设置session对象的有效时间

                                                                 voidinvalidate()   手动销毁session对象

                                               3)保存会话数据(作为域对象)

                                                                 session.setAttribute("name",Object);  保存数据

                                                                 session.getAttribute("name")   获取数据

                                                                 session.removeAttribute("name")删除数据

         Session原理

                            问题:服务器怎么区分不同的浏览器会话?

前提:     可以从session对象取出数据必须是存放数据的sessinon对象!!!

                            1)浏览器1-窗口1(001): 

                                     //1)创建HttpSession对象

                                      HttpSession session =request.getSession();  给session对象分配001

                                     //2)保存会话数据

                                      session.setAttribute("name","jacky");

                  

                            2)浏览器1-窗口2(001):

                                     //1)得到session对象

                                      HttpSession session =request.getSession();   搜索001的session对象

                                     //2)获取会话数据

                                      String name =  (String)session.getAttribute("name");     可以得到!!

                            3)浏览器2(没有标记或不是001)

                                     //1)得到session对象

                                      HttpSession session =request.getSession();

                                     //2)获取会话数据

                                      String name =  (String)session.getAttribute("name");    不可以得到!

                            4)新的浏览器1(没有标记或不是001)

                                     //1)得到session对象

                                      HttpSession session =request.getSession();

                                     //2)获取会话数据

                                      String name =  (String)session.getAttribute("name");     不可以得到!!

                                                                

                   1)服务器创建Session对象,服务器会给这个session对象分配一个唯一的标记JSESSIONID

                   2)把JSESSIONID作为Cookie发送给浏览器

                   3)浏览器得到JSESSIONID保存下来,在下次访问时携带这个JSESSIONID去访问服务器

                   4)服务器得到JSESSIONID,在服务器内存中搜索是否存在指定JSSESSINOID的session对象,

                   5)如果找到,则返回这个session对象

                   6)如果找不到,可能直接返回null,或者再创建新的session对象。          

                                               HttpSessionsession = request.getSession();

                           

                                     结论:通过JSESSIONID在服务器中查询对应的session对象。

            Session细节                  

                                     1)setMaxInactiveInterval(秒数): 设置session对象的有效时间

                                               问题:session在什么销毁?

                                               注意:不是浏览器关闭,session对象就销毁!!!

                                               默认情况:等待30分钟空闲时间,session对象才会销毁。

<!-- 设置全局的session对象的过期时间(分钟),在xml文件中设置-->

    <session-config>

       <session-timeout>1</session-timeout>

    </session-config>

                           

                                     2)可以让JSESSIONID不会随着浏览器关闭而丢失!!!!

                                              

/**

        * 设置JSESSIONID的时间,不会随着浏览器关闭而丢失!

        */

       Cookie c = new Cookie("JSESSIONID",session.getId());

       c.setMaxAge(1*30*24*60*60);//1个月

       response.addCookie(c);


                                     3)直接手动销毁sessino对象

                                               invalidate();

                                              

                                     4)  创建或得到session对象

                                               request.getSession()/ request.getSession(true): 创建或得到session对象,查询session对象,如果没有sessino对象,则    创建新的session对象

                                               request.getSession(false)          得到session对象。 查询session对象,如果session对象,如果没有sessino对象,直接返回null


实例:

创建一个Session,并传入一个值

public class SessionDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/**
		 * 把数据保存到HttpSession对象中
		 */
		//1)创建HttpSession对象
		HttpSession session = 
				request.getSession(true);
		/**
		 * 设置session的有效时间
		 */
		//session.setMaxInactiveInterval(20);
		
		/**
		 * 设置JSESSIONID的时间,不会随着浏览器关闭而丢失!
		 */
		Cookie c = new Cookie("JSESSIONID",session.getId());
		c.setMaxAge(1*30*24*60*60);//1个月
		response.addCookie(c);
		
		//2)保存会话数据
		session.setAttribute("name", "jacky");
	}
}

取出Session对象中的值

public class SessionDemo2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/**
		 * 从HttpSession对象中获取数据
		 */
		//1)得到session对象
		HttpSession session = 
					request.getSession(false);
		
		if(session==null){
			System.out.println("没有session对象");
		}else{
			//2)获取会话数据
			String name = 
					(String)session.getAttribute("name");
			System.out.println("name="+name);
		}
		
	}
}
删除Session对象中的值

public class SessionDemo3 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//1)得到session对象
		HttpSession session = request.getSession();
		//2)销毁
		session.invalidate();
		
		System.out.println("销毁成功");
	}
}



猜你喜欢

转载自blog.csdn.net/guyan1111/article/details/54954899