会话技术
序号 名称 数据存放位置
1 Cookie技术 会话数据保存在浏览器客户端。
2 Session技术 会话数据保存在服务器端。

2、Session技术


2.1、引入

Cookie的局限:

1)Cookie只能存字符串类型。不能保存对象

2)只能存非中文。

3)1个Cookie的容量不超过4KB。

 

如果要保存非字符串,超过4kb内容,只能使用session技术!!!

Session特点:会话数据保存在服务器端。(内存中)


1.2、Session技术核心

HttpSession类:用于保存会话数据


Session相关API
序号 类别 API
1 创建或得到session对象

HttpSession request.getSession()

HttpSession request.getSession(boolean create)

2 设置session对象

void setMaxInactiveInterval(int interval)  : 设置session的有效时间

void invalidate()     : 销毁session对象

String getId()  : 得到session编号

3 保存会话数据到session对象

void setAttribute(String name, Object value)  : 保存数据

Object getAttribute(String name)  : 获取数据

void removeAttribute(String name) : 清除数据



1.3、Session原理

问题: 服务器能够识别不同的浏览者!!!

代码解读:HttpSession session = request.getSession();

1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID

2)把JSESSIONID作为Cookie的值发送给浏览器保存

Cookie cookie = new Cookie("JSESSIONID", sessionID);

response.addCookie(cookie);

3)第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器

4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。

5)如果找到对应编号的session对象,直接返回该对象

6)如果找不到对应编号的session对象,则创建新的session对象,继续走1、2的流程

结论:通过JSESSIONID的cookie值在服务器找session对象!!!!!


获取或生成session对象Demo03.java

package com.rk.http.b_session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


/**
 * 获取或生成session对象
 * @author lsieun
 *
 */
public class Demo03 extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		//通过访问HttpSession对象,使Tomcat服务器生成名为JSESSIONID的Cookie
		HttpSession session = request.getSession();
	}

}

显示session对象信息Demo04.java

package com.rk.http.b_session;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 显示session对象信息
 * @author lsieun
 *
 */
public class Demo04 extends HttpServlet
{
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		HttpSession session = request.getSession(false);
		if(session != null)
		{
			out.write("JSSESSIONID: " + session.getId());
		}
		else
		{
			out.write("还没有Session对象");
		}
	}

}


1.4、Sesson细节

1)String getId()  : 得到session编号(也就是Cookie中JSESSIONID的值)

2)两个getSession方法:

getSession(true) / getSession(): 创建或得到session对象。没有匹配的session编号,自动创建新的session对象。

getSession(false):得到session对象。没有匹配的session编号,返回null

3)void setMaxInactiveInterval(int interval)  : 设置session的有效时间(单位:秒)

session对象销毁时间:

3.1 默认情况30分服务器自动回收

3.2 修改session回收时间

3.3 全局修改session有效时间



   60

完整的web.xml文件,如下:




  
  
  
  	60
  
  


3.4.手动销毁session对象 void invalidate(): 销毁session对象


向session中添加会话数据Demo05.java

package com.rk.http.b_session;


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 向session中添加会话数据
 * @author lsieun
 *
 */
public class Demo05 extends HttpServlet
{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		HttpSession session = request.getSession();
		//向session中保存会话数据
		session.setAttribute("username", "rk");
	}

}

修改session会话数据和有效时间Demo06.java

package com.rk.http.b_session;


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 修改session会话数据和有效时间
 * @author lsieun
 *
 */
public class Demo06 extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		HttpSession session = request.getSession();
		//向session中保存会话数据
		session.setAttribute("username", "lsieun");
		//修改session的有效时间
		session.setMaxInactiveInterval(5*60);//保存为5分钟
	}
}

销毁session对象Demo07.java

package com.rk.http.b_session;


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 销毁session对象
 * @author lsieun
 *
 */
public class Demo07 extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		HttpSession session = request.getSession(false);
		if(session!=null){
			session.invalidate();//手动销毁
		}
		System.out.println("销毁成功");
	}
}

获取session的相关信息Demo08.java

package com.rk.http.b_session;


import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 获取session的相关信息
 * @author lsieun
 *
 */
public class Demo08 extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		HttpSession session = request.getSession(false);
		if(session!=null){
			String sessionId = session.getId();//获取JSESSIONID
			int maxInactiveInterval = session.getMaxInactiveInterval();//获取Session的有效时间
			String username = (String)session.getAttribute("username");//获取Session中的会话数据
			out.write("JSSESSIONID: " + sessionId + "
"); out.write("username: " + username + "
"); out.write("Session的有效时间是: " + maxInactiveInterval + "
"); } else { out.write("还没有Session对象"); } } }




4)如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题

			/**
			 * 手动发送一个硬盘保存的cookie给浏览器
			 */
			String sessionId = session.getId();
			Cookie cookie = new Cookie("JSESSIONID",sessionId);
			cookie.setMaxAge(1*30*24*60*60);//Cookie保存1个月的时间
			response.addCookie(cookie);

完整代码Demo09.java

package com.rk.http.b_session;


import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 案例:如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题
 * @author lsieun
 *
 */
public class Demo09 extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		HttpSession session = request.getSession(false);
		if(session!=null){
			/**
			 * 手动发送一个硬盘保存的cookie给浏览器
			 */
			String sessionId = session.getId();
			Cookie cookie = new Cookie("JSESSIONID",sessionId);
			cookie.setMaxAge(1*30*24*60*60);//Cookie保存1个月的时间
			response.addCookie(cookie);
			
			out.write("已经将JSESSIONID保存入Cookie,重启浏览器后,仍然可以看JSESSIONID信息。");
		}
		else
		{
			out.write("没有找到Session对象,重启浏览器后不会看到JSESSIONID信息");
		}
	}
}