session和cookie (详解)

场景

http超文本传输协议:
HTTP协议定义了浏览器(即万维网客户进程)怎样向万维网服务器轻请求万维网文档,以及服务器怎样把文档传送给浏览器。简单来说,就是客户端和服务器进行数据传输的一种规则。
无状态:
当我们的浏览器请求服务器的过程中,第一次请求和第二次请求,只要访问路径完全相同,那么服务器返回的数据是一样的,服务器并不能区分,到底是哪一个浏览器或者客户端请求的,这就是无状态。
会话追踪技术
为了解决无状态问题,于是乎就引出了 会话追踪技术,比如cookie或者session。这时候的每一次请求都是一次会话,服务器通过会中的信息就能判断到底是那一个客户端在请求。

session常用代码实现

首先创建一个maven管理的Javaweb项目演示:

创建一个类 SessionServlet01.java

@WebServlet("/s1")
public class SessionServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String sessionId = session.getId();
        System.out.println("sessionId = " + sessionId);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
    }
}

1、我们启动项目 首先用谷歌浏览器去访问 s1 这个地址 看一下打印的sessionID

sessionId = F8A8FEB80A23738F69F4AEFFECF5DF45

2、继续刷新页面 可见打印的sessionID都是一样的

3、然后换其他浏览器 再去访问这个 s1

sessionId = 89DA4D47150ABE13A451DF66F137AC93

可见sessionId改变了。

由此可见 在每个浏览器中(客户端中) 访问的时候 session是相同的

这时候去给session中去保存一个值然后获取
代码:
SessionServlet01.java

@WebServlet("/s1")
public class SessionServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String sessionId = session.getId();
        System.out.println("sessionId = " + sessionId);
        session.setAttribute("name","tom");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
    }
}

SessionServlet02.java

@WebServlet("/s2")
public class SessionServlet02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String sessionId = session.getId();
        System.out.println("sessionId = " + sessionId);
        Object name = session.getAttribute("name");
        System.out.println("name = " + name);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

接着 我们先用浏览器去访问 s1保存 name属性 接着访问 s2看能不能拿到name属性的值
name = tom 可见是可以拿到的
这个时候换一个浏览器去 直接访问 s2
name = null 可见拿不到值

总结 当我们用浏览器1去访问 获得会话之后 保存的值 直接用浏览器1访问 他们之间是一次会话 因此是可以获取到值,再去换一个浏览器再直接访问 的时候 就属于另外一次会话了 就访问不到了。
这样 服务器端就能清除的分辨到底是哪一个客户端请求的,解决的无状态的问题。

cookie

cookie是保存的客户端本地的文件中的,是浏览器安排的,我们先发送一个cookie到客户端
CookieServlet01.java

@WebServlet("/c1")
public class CookieServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie=new Cookie("username","tom");
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

当访问c1的时候就会向客户端发送一个cookie 并且保存到本地文件中如windows系统的谷歌浏览器
在C:\Users\jay\AppData\Local\Google\Chrome\User Data\Default\Cookies文件中 下次请求浏览器就会自动携带cookie

在这里插入图片描述
上面的Keep-Alive:timeout=20 就是这个cookie有效时间是20s 之后就会失效
这个过期时间可以自己设置。

这就是为啥有的网站 可以多少天免登录 这就是 第一次登录的时候就由网站的服务器向客户端发送了一个cookie 然后浏览器就把cookie保存在本地文件中,下次再次访问浏览器就会自动携带这个cookie 服务器判断如果有cookie就不用登录了。
但是换一个浏览器,或者设备,或者清除了浏览器的一些缓存 网站信息,或者cookie 就必须重新登录。

session和cookie的区别

session
Session 是存放在服务器端的类似于HashTable结构,当浏览器 第一次发送请求时,服务器自动生成了一个Session ID用来唯一标识,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比。

一般情况下,服务器会在一定时间内(默认20分钟)保存这个 session,过了时间限制,就会销毁。

cookie
Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能。

Cookie的Domain和Path属性标识了这个Cookie是哪一个网站发送给浏览器的;Cookie的Expires属性标识了Cookie的有效时间,当Cookie的有效时间过了之后,这些数据就被自动删除了。

如 果不设置过期时间,则表示这个Cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,Cookie就消失了。这种生命期为浏览会话期的Cookie 被称为会话Cookie。会话Cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次 打开浏览器,这些Cookie依然有效直到超过设定的过期时间。存储在硬盘上的Cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存 在内存的Cookie,不同的浏览器有不同的处理方式。

区别

cookie数据保存在客户端,session数据保存在服务器端。

简单的说,当登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,客户端每次请求服务器的时候会发送 当前会话的sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的sessionid,用特殊的浏览器伪造该用户的请求也是能够成功的。sessionid是服务 器和客户端链接时候随机分配的,一般来说是不会有重复。

如果浏览器使用的是 cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了 cookie用户信息,那么,当你再次请求服务器的时候,浏览器会将用户信息一块发送给服务器,这些变量有一定的特殊标记。服务器会解释为 cookie变量。所以只要不关闭浏览器,那么 cookie变量便一直是有效的,所以能够保证长时间不掉线。如果能够截获某个用户的 cookie变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以,使用 cookie被攻击的可能性比较大。如果设置了的有效时间,那么它会将 cookie保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有 cookie,如果有的话,就读取该 cookie,然后发送给服务器。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值