12 servlet——session对象

session对象

session对象使用来在同一个用户的不同请求之间传递信息的。每个网站都会为每个用户在登录后创建一个session对象。

原理

用户第一次访问服务器,服务器会创建一个session对象给此用户,并将该session对象的JSESSIONID使用cookie技术存储到浏览器中,保证用户的其它请求能够获取到同一个session对象,也保证了不同请求能获取到共享的数据。

特点

  • 在服务端创建
  • 存储在服务端
  • 依赖cookie技术
  • 一次会话(session的生命周期  )

作用域

  • 一次会话
  • 在JESSIONID和session对象不时效的情况下,整个项目内。

使用

创建session对象/获取session对象(都用同一句代码)

HttpSession hs = req.getSession();

  •   如果请求中有session的标识符也就是JSESSIONID,则返回对应的session队形
  •   如果请求中没有session的表示符也就是JESESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储在浏览器(如下图1)
  •   如果session对象失效了,也会重新创建一个session对象,并将JSESSIONID存储在浏览器内存中

获取JSESSIONID

hs.getId();

设置Session时间

  hs.setMaxInactiveInterval(int seconds);

  注意:在指定时间(默认30min)内session对象没有被使用,则销毁。如果使用了则重新计时。

修改默认session生命周期

在项目的web.xml内(也可以是tomcat下的web.xml,那对所有的项目生效,优先级低),添加如下代码(单位:秒):

<session-config>

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

</session-config>

  

强制失效

hs.invalidate();

使用session存取数据

  • 存储:hs.setAttribute(String name ,Object obj);
  • 获取:hs.getAttribute(String name);//返回类型为object
  • 注意:存储的动作和取出的动作发生在不同的请求中,存储要先于取出

注意:JSESSIONID存储在了cookie的临时存储空间中,浏览器关闭即失效。

小案例1

为了验证session可以在同一用户的不同请求中传递信息,我们来做这样一个小案例:SessionServlet创建session,然后看看Session2Servlet能不能拿到SessionServlet设置的session的JSESSIONID。

SessionServlet

package com.xiaohei.servlet;

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;

public class SessionServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设置请求编码格式
		req.setCharacterEncoding("utf-8");
		//设置响应编码格式
		resp.setContentType("text/html;charset=utf-8");
		//获取请求信息
			String anme = "张三";//假设我们获取到
		//处理请求
			//创建session对象
			HttpSession hs = req.getSession();//即是创建也是获取,取决于请求里面有没有session的id
			System.out.println(hs.getId());
              //设置时间
      
              hs.setMaxInactiveInterval(30*60);//单位:秒
//		响应
			//直接响应
			resp.getWriter().write("session学习");
	}
}

  

Session2Servlet

public class Session2Servlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("session2Servlet"+req.getSession());
	}
}

  

运行SessionServlet

可以看到首次运行设置了一个cookie:JSESSIONID=xxxxx;

运行Session2Servlet

可以看到在请求中携带的cookie:JSESSIONID与上面一致,说明了他们访问的是同一个session对象。

小案例2

请看下一篇文章

原文地址:https://www.cnblogs.com/Scorpicat/p/12355595.html