浅谈cookie和session

文章目录

    • 序言
    • 1 Cookie
      • 1.1 什么是Cookie
      • 1.2 cookie的生命周期
      • 1.3 案例
    • 2 Session
      • 2.1 Session与Cookie的区别
      • 2.2 session对象的创建及其声明周期

序言

现如今,我们打开浏览器访问网上的任何资源都是通过HTTP进行传输连接的,但是HTTP协议是无状态的,即一次连接成功后并不会记住当前的状态,例如,当你登录了一个网站之后,进入该网站的子页面任然需要你重新登录(这就是HTTP协议的无状态带来的影响),这样频繁的进行用户登录极大的降低了用户体验。所以必须要有一种方案让浏览器或者服务器来记住当前的连接状态,这时Cookie和Session就出现了。Cookie和Session两者的共同点简单点来说就是为了记住当前的用户状态,弥补HTTP协议的无状态带来的不便。

1 Cookie

1.1 什么是Cookie

cookie记住用户的连接状态是将需要保存的用户信息保存在浏览器中的,其他人可以查看浏览器保存的cookie信息从而进行信息的窃取,因而cookie存储用户信息并不是十分的安全,但是网上的一些常见的功能却是由cookie实现的,例如记住密码和记住一周自动登录等等。在上述的序言部分就已经简单的介绍了Cookie的本质作用就是为了记住用户的状态,那么具体是怎么样记住的呢?这里就给出本人的一些简单见解。当我们请求访问一个网络资源时,第一次请求访问并不会携带我们指定的cookie请求头信息,此时在服务器端因为没有识别到想要的cookie信息,就认为我们是第一次访问,所以在后端服务器新建了一个Cookie(通过Cookie cookie=new Cookie(“key”,“value”)的方式创建cookie),并通过response对象将我们创建好的cookie以响应返回给我们的浏览器(服务器会在相应消息中添加Set-Cookie的字段,将用户信息发送给浏览器),这样咋后续访问服务器时都会加上这个cookie的请求头信息,从而时服务器识别出是哪个用户发出的。浅谈cookie和session_第1张图片具体的请求过程如下图: 浅谈cookie和session_第2张图片

1.2 cookie的生命周期

默认情况下cookie的生命周期是第一次访问某个站点到浏览器关闭的整个过程,此时浏览器一旦关闭cookie就销毁了,此时这种cookie称为会话级别的cookie。可以通过Cookie提供的一些api,将会话级别的cookie转化为持久化级别的cookie(持久化级别的cookie信息保存在文件中,也就是硬盘上),时间到了自动销毁。Cookie提供的api中的setMaxAge(int time)方法用来设置cookie的持久化时间,单位是按秒来计算的。
删除某个持久化的cookie:创建一各新的同名cookie,并设置setManAge(0)的参数为0,表示手动删除某个cookie(但前提是该cookie的path属性值必须和要删除的cookie一致,否则浏览器会认为是两个不同的cookie,从而导致删除失败)。
setPath(String url):该属性用于设置哪些资源路径能访问当前的cookie,例如setPath("/demo/test"),表示只有在demo项目下的test目录中的所有文件都能访问cookie,再如setPath("/demo")表示demo项目下的所有文件都能访问该cookie。

1.3 案例

下面就是用cookie做一个简单的案例,需求:第一次访问某个站点时显示“欢迎您,您这是第一次访问”,后续访问该站点时,显示上一次的访问时间案例分析:第一次访问servlet时判断请求头信息中有没有指定的cookie对象,若没有则是第一次访问,则向前台输出“欢迎您,您这是第一次访问”,并创建cookie,将需要的信息存进去,这里存的就是一个当前的时间。若有则是后续的访问了,只需用cookie提供的api将cookie中存的值取出来显示在前台即可,同时需要更新cookie保存的时间为当前的时间。

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class getTimeServlet extends HttpServlet {
     
 //获取上次的访问时间
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
  Date date=new Date();
  SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  String current = sf.format(date);
  //创建cookie
  Cookie cookie=new Cookie("lastTime",current);
  cookie.setMaxAge(60);
  response.addCookie(cookie);//向浏览器发送cookie
  String lastTime=null;
  Cookie[] cookies = request.getCookies();
  for (Cookie coo : cookies) {
     
   if(coo.getName().equals("lastTime")){
     //第一次访问时,还没有lastTime的cookie,所以该段代码不会执行
      lastTime=coo.getValue();
      System.out.println(lastTime);
   }
  }
  response.setContentType("text/html;charset=utf-8");
  if(lastTime==null){
     
  response.getWriter().println("您是第一个访问");
  }else{
     
 	response.getWriter().println("您上次的访问时间为:"+lastTime);
  }
}
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
  	doGet(request, response);
    }
}

在浏览器中输入我们的访问路径
第一次访问时,确实符合我们的需求
浅谈cookie和session_第3张图片
此时按F12查看我们的请求信息,在响应头数据中能看到我们后台设置的cookie,此cookie会在后续的访问中随着请求头信息一并发送给服务器。
下面两张图是第一次访问时的请求头和响应头信息

浅谈cookie和session_第4张图片
浅谈cookie和session_第5张图片
下面进行后续的访问
在这里插入图片描述
第二次访问后查看再次查看我们的请求头与响应头信息
浅谈cookie和session_第6张图片
可以看到在之后的访问中,浏览器都会携带该cookie到后端服务器中。后端服务器一旦发现了该cookie就更新当前的时间。至此我们的需求就算完成了。

2 Session

2.1 Session与Cookie的区别

总的来说session和cookie是一样的,都是保存用户状态的一种技术,但是区别在与session是将用户信息保存在服务器上的,而cookie是将用户信息保存到了用户各自的浏览器中的,因此session的存储更安全。Cookie只能存储字符串类型的值,而session可以存任意类型的对象,且没有存储大小的限制,而cookie则存在存储的限制。
但实际上session技术还是得基于cookie技术的,我们在服务端新建了一个session对象之后,我们必须要有一条线将我们的客户端与服务中的session相关联起来,这条线就是由cookie牵起来的。我们在服务端新建了一个session之后,服务端会自动的给我们的前端浏览器发送一个名为JSESSIONID的cookie,其值保存的是新建的session的唯一标识,之后用户再次访问时也将携带这个cookie,根据其值找到相对应的session。
浅谈cookie和session_第7张图片
发送sessionid和根据sessionid寻找相应的session区域是服务器和浏览器帮我们编写的,不用我们自己手动编写代码

2.2 session对象的创建及其声明周期

HttpSession session = request.getSession();
此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有 的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在 session了)
向session里面存数据的话只需调用session.setAttribure(Stringkey,Object value);session可以存储任意类型的数据。
在此之前已经介绍过session是基于cookie的,那么session的生命周期应该与当前的cookie一致的,其实这种想法是片面的,cookie是用来协助我们在服务器找到相应的session区域的,cookie一旦失效这条连接客户端与服务端的线也就断了,但是session对象在服务端中仍然是存在的并不会立马消失,默认情况下,session对象在服务器中的存活时间为30分钟(从我们不操作浏览器开始计时),可以在web.xml中设置session的有效时间,时间一到session才会自动销毁。

<session-config>
        <session-timeout>30session-timeout>
session-config>

你可能感兴趣的:(cookie,session)