0313 session

session技术是将数据存放在服务器的技术,就是每个客户端请求的时候,服务器就会根据客户端的用户自动开辟一块区域,并自动生成一个JSESSIONID,自动将这个id返回给客户端,然后客户端可以携带id去服务器访问属于自己的区域

原理

 

 所以说session技术是基于cookIe的技术,所有类似cookie技术的功能都是自动的,所以不需要研究,我们只需要研究

(1)怎样获得属于本客户端的session对象(内存区域) 获取session对象

HttpSession session = request.getSession(); 通过这个方法

这个方法可以获取一个session对象,如果服务器端没有session对象,服务器就会创建一个session返回,如果有就直接将已经有的session返回

获取JSESSIONID方法 getId()

public class SessionServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取session对象
		HttpSession session=request.getSession();
		//获取JSEEIONID
		String JESSIONID=session.getId();
		response.getWriter().write(JESSIONID);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

 

当我们关闭浏览器再重新打开访问

 

 两次访问的id值是不一样 的。是因为关闭浏览器重新打开,这是第二个客户端访问,是感觉已经销毁了,其实不是,是客户端的JSESSIONID销毁了,但是在服务器的session域还是存在的

那要想我关闭浏览器,我再打开访问还是这个id值,那就要用到cookie技术去设置这个JSESSIONID在客户端存储的时间

代码展示

public class SessionServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取session对象
		HttpSession session=request.getSession();
		//获取JSEEIONID
		String JESSIONID=session.getId();
		//创建cookie对象
		Cookie cookie=new Cookie("JSESSIONID", JESSIONID);
		//设置持久化存储时间
		cookie.setMaxAge(6*60);
		//设置携带路径
		cookie.setPath("/WEB06");
		//发送cookie
		response.addCookie(cookie);
		response.getWriter().write(JESSIONID);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

  

 

 

 关闭浏览器再访问

 

 (2)怎样向session中存取数据(session也是一个域对象)

在servlet01中存数据,在servlet02中取

代码展示

public class Servlet01 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取域
		HttpSession session=request.getSession();
		//存值
		session.setAttribute("uname", "张三");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

  

public class Servlet02 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取域
		HttpSession session=request.getSession();
		//取值
		String name=(String)session.getAttribute("uname");
		//解决响应乱码
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write(name);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

  先访问servelet01 再访问servlet02

 

 此时servlet01是没有东西的

 

 如果我们没访问servlet01,直接访问servlet02,就会发现空指针异常,因为域中没有数据

(3)Session对象的生命周期

第一次执行request.getSession()时创建

服务器(非正常)关闭时销毁

从不操作服务器端的资源开始计时 三十分钟自动销毁

可以设置时间长一点 那就在xml文件中设置一个标签

例:

<session-config>

        <session-timeout>30</session-timeout>

</session-config>

还可以手动销毁:session.invalidate();

 

posted @ 2021-03-13 11:02  公雪  阅读(135)  评论(0编辑  收藏  举报