Cookie与Session

服务器中的内存区域-ServletContext

能够被所有用户共享的区域,和request一样也可以通过setAttribute和getAttribute来读写数据。但也因为被所有用户共享,所以放进去的数据区分不开是哪个用户的,也就是说它的范围太大了。

数据保存在本地的技术-Cookie

数据存储在客户端本地,减少了服务器端存储的压力,但安全性不好,客户端可以清除Cookie。使用Cookie在本地存储数据时,是以键值对的形式来存储的,只能存储字符串类型的数据,不能保存对象,且不能保存中文。一个Cookie的容量不超过4KB。当我们通过服务器把Cookie设置到浏览器客户端后,浏览器的每次访问都会带着所有的Cookie,因此我们也可以在Servlet中获取到浏览器带有的Cookie。

我们通过如下形式可以给浏览器设置Cookie,当浏览器访问该Servlet时,就会通过response给浏览器设置两个Cookie。

@WebServlet("/setCookie")
public class CookieServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("CookieServlet.service");
        Cookie cookie1 = new Cookie("goods", "IPhone");
        Cookie cookie2 = new Cookie("name", "IPhone");
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}

在这里插入图片描述
浏览器访问其他Servlet时,也会带着所有的Cookie,我们可以获取浏览器带有的Cookie,并打印验证。

@WebServlet("/getCookie")
public class getCookieServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("getCookieServlet.service");
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            System.out.println("Name: " + cookie.getName() + ", Value: " + cookie.getValue());
        }
    }
}

控制台的输出:
在这里插入图片描述

在这里插入图片描述
我们还可以设置Cookie在客户端的持久化时间

cookie.setMaxAge(10 * 60); // 保存10分钟

对于括号中的参数:
正数:有效的保存时间
负数:浏览器关闭的时候Cookie就丢失
零:删除同名的Cookie数据

Cookie案例:记录上一次访问网站的时间

从req中我们可以得到上一次访问的时间,本次访问的时间我们记录下来后通过resp设置到浏览器,覆盖之前的同名Cookie。即可实现记录上一次访问该网站的时间。

@WebServlet("/lastAccessTime")
public class LastAccessTimeServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 记录本次的访问时间,当下一次访问的时候从req中取出,即可得到上一次的访问时间
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-ddhh:mm:ss");
        String time = format.format(date);
        Cookie cookie = new Cookie("lastAccessTime", time);
        resp.addCookie(cookie);

        String lastAccessTime = "";
        Cookie[] cookies = req.getCookies();
        if (cookies != null && cookies.length != 0) {
            for (Cookie cook : cookies) {
                String name = cook.getName();
                if (name.equals("lastAccessTime")) {
                    lastAccessTime = cook.getValue();
                    break;
                }
            }
        }
        
		// 解决服务器响应浏览器时的中文乱码问题
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("您上一次访问的时间:" + lastAccessTime);
    }
}

在这里插入图片描述

会话技术分为Cookie和Session,其中Session技术又用到了Cookie

在浏览器与服务器进行会话的过程中,会产生一些会话数据,而这里的Cookie与Session就是用来管理会话过程中产生的会话数据的两种技术。Session会借助Response以Cookie的形式把SessionID带到浏览器,使得浏览器端访问服务器时,能够找到自己特定的内存空间。

数据保存在服务器端的技术-Session

使用Session技术会为每个客户端都创建一块内存空间来存储客户的数据,但客户端每次访问需要携带一个用于标识自己的ID,用来去服务器中找到自己的内存空间,因此这里就用到了Cookie技术,当客户端第一次访问时,服务器会给该客户端分配一块内存空间来存储其数据,同时在给该客户端的响应response中以Cookie的形式把SessionID带到浏览器,该客户端再次访问时,就会带着已有的SessionID来访问服务器,就可以找到自己对应的内存空间。
获得Session对象:

// 得到session对象。原来有Session就直接返回,没有返回null
// 不加参数,默认是true
HttpSession session = request.getSession(true) 
// 创建或得到session对象。原来有Session就直接返回,没有Session自动创建新的session对象。
HttpSession session = request.getSession(false) 

向session中存取数据:

session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);

Session对象的创建与销毁:
创建:第一次执行request.getSession()时创建
销毁:
1)服务器关闭时
2)session过期/失效(默认30分钟)
我们还可以通过setMaxInactiveInterval(int interval)来设置session的有效时间

手动销毁Session(注销或退出时会使用):

session.invalidate();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值