3 Session的使用

    HttpSession对象

HttpSession是一种保存少量信息至服务器端的一种技术,第一请求时,服务器会创建HttpSession,我们可以在HttpSession对象中保存一些关于用户的状态信息,并将HttpSession的JSESSIONID以Cookie形式响应给浏览器 ,第二次请求,浏览器会携带之前的JSESSIONID的Cookie,发送给服务器,服务器根据JSESSIONID获取对应的HttpSession对象.通过这种技术可以解决HTTP协议本身无法记录用户状态情况.

 

HttpSession对象的特点
HttpSession保存在服务端

HttpSession可以存储任何类型的数据

HttpSession使用Key与Value结构存储数据 value是Object类型

HttpSession存储数据大小无限制

HttpSession对象的创建

HttpSession对象的创建是通过request.getSession()方法来创建的。客户端浏览器在请求服务端资源时,如果在请求中没有JSESSIONID,getSession()方法将会为这个客户端浏览器创建一个新的HttpSession对象,并为这个HttpSession对象生成一个JSESSIONID,在响应中通过Cookie写回给客户端浏览器,如果在请求中包含了JSESSIONID,getSession()方法则根据这个ID返回与这个客户端浏览器对应的HttpSession对象。

getSession()方法还有一个重载方法getSession(true|false)。当参数为true时与getSession()方法作用相同。当参数为false时则只去根据SessionID查找是否有与这个客户端浏览器对应的HttpSession,如果有则返回,如果没有SessionID则不会创建新的HttpSession对象。

测试代码:

 HttpSession中数据的获取

session.setAttribute("key",value)

将数据存储到HttpSession对象中

Object value = session.getAttribute("key")

根据key获取HttpSession中的数据,返回Object

Enumeration<String> attributeNames = session.getAttributeNames()

获取HttpSession中所有的key,返回枚举类型

session.removeAttribute("key")

根据key删除HttpSession中的数据

String id = session.getId()

根据获取当前HttpSession的SessionID,返回字符串类型

测试代码:

servlet1 创建HttpSession并存储数据

 
servlet2 获取上次创建的HttpSession并获取数据和session的其他信息

 
 

HttpSession的销毁方式

HttpSession的销毁方式有两种:

Ø  通过web.xml文件指定超时时间(最大不活动时间)

Ø  通过HttpSession对象中的invalidate()方法销毁当前HttpSession对象

   我们可以在web.xml文件中指定HttpSession的超时时间,当到达指定的超时时间后,容器就会销该HttpSession对象,单位为分钟。该时间对整个web项目中的所有HttpSession对象有效。时间的计算方式是根据最后一次请求时间作为起始时间。如果有哪个客户端浏览器对应的HttpSession的失效时间已到,那么与该客户端浏览器对应的HttpSession对象就会被销毁。其他客户端浏览器对应的HttpSession对象会继续保存不会被销毁。

 

<session-config>

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

  </session-config>

 


我们也可以在Tomcat的web.xml文件中配置HttpSession的销毁时间。如果在Tomcat的web.xml文件中配置了HttpSession的超时时间对应的是Tomcat中所有的Web项目都有效。相当于配置了全局的HttpSession超时时间。如果我们在Web项目中配置了超时时间,那么会以Web项目中的超时时间为准。

 

invalidate()方法是HttpSession对象中所提供的用于销毁当前HttpSession的方法。我们通过调用该方法可以销毁当前HttpSession对象。

测试代码:

 HttpSession生命周期


在HttpSession对象生命周期中没有固定的创建时间与销毁时间。何时创建取决于我们什么时候第一次调用了getSession()或getSession(true)的方法。HttpSession对象的销毁时间取决于超时时间的到达以及调用了invalidate()方法。如果没有超时或者没有调用invalidate()方法,那么HttpSession会一直存储。默认超时时间为30分钟(Tomcat的web.xml文件配置的时间就是默认超时时间)。

HttpSession对象总结

HttpSession与Cookie的区别:

Ø  cookie数据存放在客户的浏览器或系统的文件中,而HttpSession中的数据存放在服务器中。

Ø  cookie不安全,而HttpSession是安全的。

Ø  单个cookie保存的数据不能超过4K,很多浏览器都限制一个域名保存cookie的数量。而HttpSession没有容量以及数量的限制。

HttpSession的使用建议

HttpSession对象是保存在服务端的,所以安全性较高。我们可以在HttpSession对象中存储数据,但是由于HttpSession对象的生命周期不固定,所以不建议存放业务数据。一般情况下我们只是存放用户登录信息。

测试代码

Servlet1 创建并向HttpSession中存放数据

package com.mashibing.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
@WebServlet(urlPatterns = "/servlet1.do")
public class Servlet1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获得HttpSession对象  是一种保存更多数据在服务器端的一种技术
        // 一般保存当前登录 的用户
        // 用户的权限
        // 用户的其他信息 ... ...
        /*
        * getSession方法执行内容
        * 从request中尝试获取JSESSIONID的Cookie
        *
        *     A如果获取失败,
        *     认为上次会话已经结束,在这里要开启新的会话,创建一个新的HttpSession并返回
        *     将新的HttpSession对象的JSESSIONID以Cookie的形式放在Response对象,响应给浏览器
        *
        *     B如果获取成功
        *         根据JSESSIONID在服务器内找对应HttpSession对象
        *         1) 找到了,返回找到的HttpSession
        *         2) 没找到,创建新的HTTPSession并将SESSIONID以Cookie的形式放在Response对象,响应给浏览器
        *
        * */
        HttpSession httpSession=req.getSession();
        // 向HttpSession中存放一些数据
        httpSession.setAttribute("username", "msb");
        httpSession.setAttribute("password", "1234");
        httpSession.setAttribute("level", "A");
        //httpSession.invalidate();// 手动设置HTTPSession不可用   退出登录
    }
}

 

Servlet2 获得并取出HTTPSession中的数据


 

package com.mashibing.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
@WebServlet(urlPatterns = "/servlet2.do")
public class Servlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取HTTPSession
        HttpSession session = req.getSession();
        // 尝试从HTTPSession中获取数据
        String username = (String)session.getAttribute("username");
        String password = (String)session.getAttribute("password");
        String level = (String)session.getAttribute("level");
        System.out.println(username);
        System.out.println(password);
        System.out.println(level);
        // 获取Session对象的其他信息
        System.out.println("创建时间:"+session.getCreationTime());
        System.out.println("最后一次访问时间:"+session.getLastAccessedTime());
        System.out.println("最大不活动时间:"+session.getMaxInactiveInterval());
    }
}

 

posted @ 2023-03-15 08:14  CodeWhisperer001  阅读(22)  评论(0编辑  收藏  举报