Cookie和Session的基础知识

Cookie

Cookies基本使用

Cookie : 客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据访问,让服务端通过Cookie来识别客户端。

  • Cookie的基本使用:
  1. 创建Cookies对象, 设置数据
Cookie cookie = new Cookie("key", "value");
  1. 发送Cookie给客户端:使用response对象
response.addCookie(cookie);
  1. 获取客户端携带的所有Cookie对象:使用request对象
Cookie[] cookies = request.getCookies();//使用cookies时注意判断空指针异常
  1. 遍历数组,获取每一个Cookie对象
  2. 使用Cookies对象方法获取数据
cookie.getName();cookie.getValue();

Cookie原理

  • Cookie的实现是基于Http协议的
    • 响应头:set-cookie
    • 请求头:cookie

Cookie使用细节

  • Cookie的存活时间
    • 默认情况下,Cookie存储在浏览器中,当浏览器关闭,内存释放,则Cookie被销毁。
    • setMaxAge(int seconds): 设置Cookie的存活时间
      • 正数:持久化到磁盘中,到时间自动删除
      • 负数(默认值):存放在内存中,浏览器关闭自动删除
      • 0:立即删除对应Cookie

Cookie存储中文

  • Cookie不能直接存储中文,可以先将中文通过URLEncoder.encode()进行URL编码后存储,需要访问时再进行URL解码。

Session

Session基本使用

Session:服务端会话跟踪技术,将数据保存到服务端。(JavaEE提供了HttpSession接口,来实现一次会话的多次请求的数据共享)

使用:

  1. 获取Session对象
HttpSession session = request.getSession();
  1. Session对象功能
  • void setAttribute(String name, Object o) : 存储数据到session域中
  • Object getAttribute(String name) : 根据key,获取值
  • void removeAttribute(String name):根据key,删除该键值对

Session原理

  • Session是基于Cookie实现的

Session使用细节

  • Session钝化、活化

    • 钝化:服务器正常关闭时,Tomcats会自动将Session数据写入硬盘的文件中
    • 活化:再次启动服务器时,从文件中加载数据到Session中
  • Session销毁

    • 默认情况,无操作后30分钟自动销毁
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    
    • 调用Session对象的invalidate()方法销毁自己

小结

  • Cookis和Session都是来完成一次会话内多次请求间数据共享的
  • 区别:
    • 存储位置:Cookie是将数据存储到客户端,Session将数据存储到服务端
    • 安全性:Cookie不安全(可能被拦截),Session安全
    • 数据大小:Cookie最大3KB,Session无大小限制
    • 存储时间:Cookie可以长期存储,Session默认30分钟
    • 服务器性能:Cookie不占服务器资源,Session占用服务器资源

举例

testController类中的test01()方法实现的功能:当你第一次访问localhost:8080/FromZerotoExpert时会显示Hi, Welcome To From Zero To Expert,第二次访问时会显示Hello, Welcome Again To From Zero To Expert。

@RestController
public class testController {
    @GetMapping("/FromZerotoExpert")
    public String Test01(HttpServletResponse response, HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        Cookie myCookie = null;
        // 注意判断cookies是否指向空指针, 否则当浏览器没有cookie时,会抛出空指针异常
        if (cookies != null) {
            // 遍历cookies,找到对应的cookie
            for (Cookie cookie : cookies) {
                // Java中字符串的比较不能用 ==
                // cookie的key和value都要判断,防止伪造cookie
                if (cookie.getName().equals("wcx") && cookie.getValue().equals("001")) {
                    myCookie = cookie;
                    break;
                }
            }
        }
        if (myCookie != null) {
            return "Hello, Welcome Again To From Zero To Expert";
        } else {
            Cookie newCookie = new Cookie("wcx", "001");
            // 设置newCookie的存活时间为24小时
            newCookie.setMaxAge(24 * 3600);
            response.addCookie(newCookie);
            return "Hi, Welcome To From Zero To Expert";
        }
    }
}

怎么实现判断是第一次登录和自动登录思路

简单说下怎么判断用户是否是第一次登录网站,我的实现思路:我认为主要是在服务端实现。
首先,客户端浏览器向服务端发送一个登录请求,如果用户是在这个浏览器中第一次登录,通过了登录验证的话,服务器创建一个session对象(该对象有一个唯一的id,一般称之为sessionId),服务器在把这个sessionId以Cookie的形式返回给客户端浏览器,客户端浏览器会把这个sessionId记到自己的cookie缓存中,以及cookie生效的路径(你只有向目标服务器发送请求才会携带这个sessionId的cookie)。下一次客户端浏览器再向服务器发送请求就会携带上sessionId,服务器就可以根据这个sessionId判断是否是第一次登录(如果客户端请求中包含sessionId,说明不是第一次登录,如果不包含,则进行登录验证,验证通过,返回sessinId),后面服务器也可以直接根据请求中sessionId判断这个请求是否有执行某个操作的权限。比如,你关闭浏览器后,当你下次再用这个缓存了sessionId的cookie的浏览器(只要这个sessionId的cookie在浏览器的生存时间不是关闭浏览器被清除,而是持久化到硬盘中一段时间)进入服务端,在前端页面初始化时可以发送一个login请求,携带上sessionId的cookie,给服务端,服务端根据sessionId的合理性判断是否登录成功,若通过,客户端浏览器就成功登录了,实现了自动登录。要实现这个功能可能需要对cookie和session的作用和原理有个比较清楚的了解,我也是看了网上几篇博客以及帅地哥他对cookie面试总结,可能简单了解了cookie和session。
这个方法应该考虑到安全性,前端只负责发送请求,没有对数据做任何验证处理,如果用户自己构造一个不存在的sessionId的cookie发给服务端,服务端验证是可以不通过的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值