当前位置:网站首页>Cookie技术&Session技术&ServletContext对象

Cookie技术&Session技术&ServletContext对象

2022-07-06 07:03:00 aigo-2021

一、Cookie技术

Http协议有一个特点,就是无状态每次请求响应的数据不进行持久化保存。但是在做某些Web需求时,是需要记录用户的状态的。

Cookie技术能将一些用户的信息记录在客户端。通过ServletAPI 中提供的Cookie类,可以将数据存储到客户端的 cookie文件中,当发送请求时,cookie文件中的内容包含在http请求中。

实现将数据通过Cookie存储在客户端,在服务器端创建Cookie类的对象,将数据封装到Cookie对象中,通过 response对象将Cookie对象响应回客户端,客户端自动将Cookie的数据存储到客户端指定文件夹的Cookie文件中。

例如:访问一个TestServlet1 将一个姓名存储到客户端

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/text1.do")
public class TestServlet1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //将tom名字 存储到访问这个Servlet的客户端上
        Cookie cookie = new Cookie("name1","tom");
        cookie.setMaxAge(60*60*24);
        resp.addCookie(cookie);
        Cookie cookie1 = new Cookie("name2","jack");
        cookie1.setMaxAge(60*60*24);
        resp.addCookie(cookie1);
        Cookie cookie2 = new Cookie("password","123");
        cookie2.setMaxAge(60*60*24);
        resp.addCookie(cookie2);
    }
}

在浏览器访问 http:localhost:8080/emp/text1.do    设置中查看存储的Cookie数据

可以通过访问某个站点,在请求中获得这个站点的Cookie数据(客户端的)

@WebServlet("/text2.do")
public class TestServlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse resp) throws
ServletException, IOException {
    //获得 客户端存储的Cookie
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie:cookies){
            System.out.println(cookie.getName()+","+cookie.getValue());
        }
    }
}

二、Session技术

Session是会话的意思,代表客户端和服务器的一个会话对象,存储在服务器上的一个对象。

当客户端访问了服务器,就会在服务器上创建一个会话对象,当客户端再次访问了服务器,使用的还是这个会话对象,在会话对象的有效期内没有产生任何的请求响应,会话对象将被销毁,tomcat的session的有效期默认是20分钟

服务器上有一个存储会话对象的散列表(哈希表),当浏览器访问了服务器时,服务器读取浏览器中Cookie中存 储的会话id。

三 、Session对象的生命周期

由于Session的生命周期长,可以向Session中存储一些数据,那么这些数据的生命周期就等同于session的生命周 期,例如登录状态要保存多久?只要有请求响应的操作,就要保存登录状态。

如何向Session中存储数据:

HttpSession接口提供了setAttribute方法,可以向Session对象中存储数据。

存储数据

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/text1.do")
public class TestServlet1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
        //向Session对象中存储 姓名tom
        //首先要获得session对象
        HttpSession session = request.getSession();
        //session对象中封装了一个Map对象,将数据存储到了Map中,通常也说存储到了Session的属性中
        session.setAttribute("name1","tom");//key,value的形式存储
    }
}

获取数据

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/text2.do")
public class TestServlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse resp) throws
ServletException, IOException {
        //获取Session中的数据
        HttpSession session = request.getSession();
        System.out.println(session.getAttribute("name1"));
    }
}
获得Session数据,先访问text1.do,再访问text2.do

四、设置Session有效期

在web.xml中,设置session有效期,单位是分钟

<session-config>
    <session-timeout>1</session-timeout><!--设置为1分钟-->
</session-config>

有效期内有没有请求响应,Session被销毁

当然,也可以通过调用HttpSession的方法,让Session对象失效

//让session失效
session.invalidate();

session失效和销毁是不同,session失效后无法获得其属性值,也不能再次失效了,不能做这些操作了,但 session对象还存在;session对象的销毁是Session对象不存在了,清除了。

五、ServletContext对象

ServletContext是Servlet上下文对象,又叫应用程序的上下文对象。在Web服务器(tomcat)启动时 ServletContext对象被创建,Web服务器销毁时,ServletContext对象被销毁。

ServletContext对象的生命周期 长于 Session

可以向ServletContext对象中存储一些数据,数据的生命周期与ServletContext的生命周期相同。 也是通过setAttribute和getAttribute方法进行存储和获取的

思考:

什么样的数据存在Session中?什么样的数据存在ServletContext中?

每个页面共享的数据存储到Session中;所有用户共享的数据存储到ServletContext中

原网站

版权声明
本文为[aigo-2021]所创,转载请带上原文链接,感谢
https://blog.csdn.net/aigo_2021/article/details/125587091