首页 > 编程知识 正文

session和cookie原理,php cookie session

时间:2023-05-06 14:50:25 阅读:284052 作者:4307

HTTP协议中,客户端请求服务端是一种无状态的连接-每次请求都是独立的请求。

Cookie:
如我们在网上购物的时候, 开始的时候先登录,然后选中商品加入到自己的购物车-其在客户单与服务器端的动作如下:
客户端—–(request:包含登录信息)——->服务器端
客户端<—(response:登录成功与否)——-服务器端
客户端—–(request:购物车里的信息)—–>服务器端
客户端<—(response:添加成功与否)—— -服务器端
这里关键是在第二次请求加入购物车的时候,因为客户端请求服务端是一种无状态的连接,那么服务器端怎么知道是谁,以及加入到谁的购物车。
解决的方式就是request到达服务器端的时候,服务器给在response中加一个“小饼干”,这个“小饼干”中就包含用户登录时候的一些基本的信息。当第二次客户端发起请求的时候,服务端检查到这个“小饼干”,据此识别出客户端,并进行相应的操作。而这个所谓的“小饼干”就是Cookie,持有这个小饼干的是客户端-即客户端保存中数据。

简单例子加以理解:

//以get的方式提交到firstCookie<form action="firstCookie" method="get"> 用户名:<input type="text" name="user"/><br/> <input type="submit" value="提交"/></form> //类FirstCookie中的doGet处理方法protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String user = request.getParameter("user"); //以user创建cookie,并加入进去 Cookie cookie=new Cookie("user",user); response.addCookie(cookie); //重定向到secondCookie response.sendRedirect("secondCookie"); } 类SecondCookie中的doGet处理方法protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //获取cookies Cookie[] cookies = request.getCookies(); if (cookies != null && cookies.length > 0) { for (Cookie ck : cookies) { //打印出cookie的值 System.out.println(ck.getValue()); } } }


这里很清楚的可以看出客户端设置Cookie后,在请求头中会包含Cookie头,即客户端保存数据。



Session:
Cookie方法的是把数据保存在客户端,而Session是把数据保存在服务器,而客户端具有一个唯一的ID.
小例子与上述一样,只是在两个类的处理方法的时候用到的是Session.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String user = request.getParameter("user"); HttpSession session = request.getSession(); session.setAttribute("user", user); response.sendRedirect("secondCookie"); } protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { HttpSession session = request.getSession(); System.out.println(session); Object obj = session.getAttribute("user"); if (obj != null) { String user = (String) obj; System.out.println(user); } }

抓取数据包如下:

可以看出Session中也有Cookie,只是其中保存的不再是直接的数据,而是一个ID,在服务器端,服务器根据客户端的JSESSIONID来判断。
服务器端是以键值对的方式保存数据的,这里的key就是JSESSIONID,根据key来获取value,如果没有这个JSESSIONID,就新创建加入Map中。

二者比较:

相同点:
cookie与session都是用来跟踪浏览器用户身份的会话方式。

不同点:
总的来说,cookie是采取的客户端保状态的会话方式,而session采取的是服务器保持状态的会话方式。
采用session的会话方式,用户量大时,因为数据保存在服务器,其服务器压力毫无疑问会比较大。还有其他的一些不同,如二者的存取方式等。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。