javaweb:Cookie和Session

1,257 阅读8分钟

Web会话技术

web会话可简单理解为:用户开一个浏览器,访问某一个web网站,在这个网站点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.

例如:

  1. 打开浏览器
  2. 访问京东, 此时 与京东网站 产生了会话
  3. 访问京东的具体商品页面; 或 其他页面; 或访问了其他网站, 此时,一直会与京东网站保持着会话连接
  4. 关闭浏览器, 此时 与京东网站的会话结束;
    重写打开浏览器,再次访问京东, 这就是第二次会话了

Java Web开发中使用的会话技术

在客户端与服务器端交互的过程中,通常会产生一些数据, 为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是CookieSession

  • Cookie对象:
    客户端浏览器的会话技术,它可以把服务器传递过来的一些数据记录在客户端浏览器中,解决会话从什么时候开始,到什么时候结束。
  • Session对象:
    服务器端的会话技术, 它可以把同一用户与服务器多次请求响应的一些数据记录在服务器Session域中, 实现该用户在本次会话中, 可随时获取Session域中的数据, 满足多次请求响应之间 进行数据传递\访问使用.

可以用一个简单的比喻去描述,人们去超市买东西的时候,会去存取柜存放物品,而存完物品之后,存取柜会给人们一张条形码的单子,而这个纸条可以粗略的理解为Cookie,也就是服务端在客户端存储的信息,用于做一个凭证,知道客户端是谁,而Session就相当于这个存取柜,每一个不同的用户来超市购物的时候,占用的是自己的存取柜,而不会去其他人的柜子拿东西,而用户离开超市的时候,这个存取柜就会被释放出来,而不继续占有,就可以理解为这个会话结束了

Cookie

什么是Cookie

Cookie对象: 客户端浏览器的会话技术,它可以把服务器传递过来的一些数据记录在客户端浏览器中,解决会话从什么时候开始,到什么时候结束。

小结:

  • 在客户端保存的数据, 数据产生是在服务器
  • 在浏览器中Cookie是以文本的形式保存数据

cookie的应用场景

  1. 判断用户是否登陆过网站,以便下次登录时能够实现自动登录(或者记住密码)。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。
  2. 保存上次登录的时间等信息。
  3. 保存上次查看的页面
  4. 浏览计数。

Cookie的使用

服务器向浏览器发送Cookie

把服务器端想要保存在客户端的数据, 通过Cookie来完成; 保存在客户端的数据 都是较小的文本数据.

实现步骤:

  • 创建Cookie对象,直接new Cookie(String key,String value)
  • 将Cookie数据保存到客户端, 使用response对象方法 addCookie()

API:

  • Cookie类

    //构造方法: 
    Cookie(String key, String value) , 用于创建Cookie对象, 并指定Cookie中保存的键值对信息
    
  • Response对象

    //方法: 
    addCookie(Cookie c), 用于将指定的Cookie对象 响应回 客户端浏览器
    

代码演示:

@WebServlet("/simple")
public class CookieServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("yourname","kehao");
        resp.addCookie(cookie);
    }
}

在这里插入图片描述

服务器从浏览器获取Cookie

Request对象

Cookie[] getCookies();

Cookie对象

public String getName();//获取Cookie的名字
public String getValue();//获取Cookie的值

示例代码:

@WebServlet("/getcookie")
public class CookieServlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Arrays.stream(req.getCookies()).forEach(cookie -> System.out.println(cookie.getName()+"---"+cookie.getValue()));
    }
}

Cookie的携带路径

当服务端在客户端存储了Cookie之后,每次网页发起请求的时候会讲之前存储的Cookie发送到服务器,而Cookie的携带路径就指的是,在什么样的路径才会携带这个Cookie,而什么路径下不携带,能够携带Cookie的路径就称为Cookie的携带路径

cookie默认的携带路径

默认情况下,网页访问发送Cookie的当前层级以及子层级会携带Cookie 否则不会携带Cookie

修改cookie的携带路径

Cookie对象

setPath("cookie的携带路径") 

用于设置cookie携带路径, 若参数写成 request.getContextPath()代表web应用下任意资源都携带本Cookie

代码演示:

@WebServlet("/location/test")
public class CookieServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("location", "1");
        cookie.setPath(req.getContextPath());
        resp.addCookie(cookie);
        resp.getWriter().println("test");
    }
}

Cookie的生存时间

浏览器中Cookie是有生存时间的, 默认是当前会话.浏览器关闭,该会话结束.
可以通过更改Cookie的生存时间, 来延长Cookie的生存时间

Cookie对象

setMaxAge(int 秒)

更改Cookie的生存时间, 参数单位: 秒

删除已存在的Cookie

要删除已经存在的cookie,后一个用来覆盖的新cookie, 必须名称与路径与原来的cookie一致

  • 覆盖原有Cookie的需要满足的要求:

    • 保证同名键

    • 保证相同的携带路径

    • setMaxAge(0)

    对获取到传来的Cookie setMaxAge(0)是无效的

Session

什么是Session

Session对象: 服务器端的会话技术, 它可以把同一用户与服务器多次请求响应的一些数据记录在服务器Session域中, 实现该用户在本次会话中, 可随时获取Session域中的数据, 满足多次请求响应之间 进行数据传递\访问使用.

  • Session与Cookie是紧密相关的。 Session的使用要求用户浏览器必须支持Cookie,如果浏览器不支持使用Cookie,或者设置为禁用Cookie,那么将不能使用Session。
  • Session信息对客户来说,不同的用户, 使用不同的Session信息来记录。当用户启用Session时,Tomcat引擎自动产生一个SessionID. 在新会话开始时,服务器将SessionID当做cookie存储在用户的浏览器中。

session与cookie的区别

cookiesession
会话数据保存的位置浏览器服务器
数据的安全性不安全安全
存储数是否有限制

Session的基本使用

Session域对象

session对象是HttpSession接口的实现类对象, session对象由tomcat引擎创建. 实现将某些数据放入session中,供同一用户的不同页面使用

  • 作用域范围 : 一次会话有效(浏览器不关闭)

实现步骤:

  • 使用Request的getSession() 当session存在时返回该session,否则新建一个session并返回该对象
  • 通过session对象的setAttribute\getAttribute 进行数据的存取

API:

  • 域对象存储数据: setAttribute(String key,String value)
  • 取出域对象数据: Object getAttribute(String key)
  • 移除域对象数据: removeAttribute(String key)

持久化Session对象

默认的Session在浏览器关闭之后就失效了,Session的实现在于每个session对象都有个唯一标识 JSESSIONID, 每当调用getSession()的时候,Tomcat会将JSESSIONID存储在客户端Cookie中,然而Cookie的默认状态就是关闭浏览器失效,所以我们可以手动的将这个Cookie的时效边长,使得Session能够持久化,因为在Cookie对象删除的时候,服务器是不知道的,所以Session对象依然还在内存之中,而只要延长了Cookie的时效,那么下一次打开浏览器的时候,依然会将Cookie传给服务端,保证了持久化

String sessionId = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionId);
cookie.setPath( request.getContextPath());
cookie.setMaxAge(60*10);
response.addCookie(cookie);

session生命周期

  • session创建时机
  1. 浏览器在servlet中第一次使用session时候,通过getSession方法创建;
  2. 浏览器第一次访问jsp的时候,服务器也会为这个浏览器创建一个session对象;
  • session销毁时机
  1. 程序员调用invalidate方法;(立刻销毁)

  2. 设置的存活时间到了;(默认是30分钟)
    这个时间可以通过修改web.xml去修改

    <session-config>
      <session-timeout>30</session-timeout>
    </session-config>
    
  3. 服务器非正常关闭;(突然断电)

注意事项:

1:正常关闭服务器,session不会销毁,而是直接序列化到硬盘上,下一次服务器启动的时候,会重新创建出来;

2:如果浏览器单方面关闭会话,服务器上对应的session不会死亡
,但是会导致服务器给浏览器创建的JSESSIONID的cookie死亡,当cookie死亡后,会导致浏览器无法找到上一个session对象,会造成服务器中session死亡的假象;