Session与Cookie的原理以及使用小案例

Cookie和Session所解决的问题

都是用来解决HTTP的无状态问题,由于HTTP每一次请求都相当于不同的用户向服务器发送请求。HTTP协议无法记住浏览器端是不是同一个用户。Cookie和Session都是为了解决一个用户的多次请求之间数据的共享问题,只是实现原理不同,只能实现一个用户多个请求之间的数据共享。

Session与Cookie的原理

Cookie的原理

  • 数据是存储在浏览器端的,服务器负责生成Cookie并设置好规则(可访问的路径、过期时间),然后响应给浏览器。
  • 浏览器在收到响应的Cookie后,服务器指定的规则内请求服务器端,都会携带上该Cookie
  • 服务器则可以通过读取request请求对象中的Cookie信息来进行用户身份的识别等...

    提示:

    第一次请求时,浏览器没有Cookie信息携带,而是由服务器响应Cookie给浏览器

    第2次请求及其之后的请求,浏览器会携带Cookie信息向服务器发送请求(满足Cookie规则的情况)

    特点:服务器压力小,不用存储任何数据,但是一旦浏览器的Cookie信息清除后,再向服务器发送请求时,相当于一个新的用户。

Cookie的失效时机

  • 当浏览器的Cookie过期时(默认Cookie过期时间为一个会话,浏览器关掉就没了)
  • 当服务器响应中设置cookie过期时间为0时
  • 当浏览器的Cookie被清空时

小提示

当浏览器的Cookie的过期时间还没到时,如果浏览器没有清空Cookie,那么就算关掉浏览器,Cookie也依然存在。

Session的原理

  • 数据是存储在服务器端的,服务器端通过浏览器请求中名为SessionID的Cookie来识别用户

    提示:
  • 浏览器第一次请求服务器时,就会在服务器端开辟一片空间,其中有sessionId,浏览器会响应一个名为SessionID的Cookie设置到浏览器中
  • 当浏览器第二次以及往后的请求时,每次向服务器发送的请求都会携带这个名为SessionId的Cookie
  • 服务器就是以该Cookie来识别用户的,以该SessionID去对应的那一片内存空间获取数据。
  • 只能解决单个用户的多个请求

Seesion的失效时机(仅在一个会话当中)

  • 服务器清空Session:Session.invalidate()
  • 超过Session过期时间未活动,在tomcat的conf目录的web.xml中可以看到配置的时间,默认为30分钟(可以在web服务器的web.xml中配置)
    <session-config>
<session-timeout>30</session-timeout>
</session-config>
  • 更改当前项目的当前session的失效时间,单位为秒
session.setMaxInactiveInterval(10);
  • 当用户将浏览器关闭时。(其实这并没有真正的使服务器的session失效)

    解释:由于浏览器向服务器第二次请求以后,都会携带名叫SeesionId的Cookie,而关闭掉了浏览器时,Cookie就被清除了。所以再向服务器访问时,就相当于一个新的用户,服务器会重新在内存中开辟一片空间,其空间通过生成的SessionId访问,并把这个新的SessionId响应给浏览器。

第一次请求

第二次请求及其之后的请求

小提示

即使使用了req.getSession().setMaxInactiveInterval(1000);设置了session的过期时间,浏览器在关闭时,也会清空session的Cookie。这个设置过期时间是针对服务器端的,到了过期时间,服务器就会销毁该session

Cookie 和 Session的区别

  • Cookie保存在客户端,Session保存在服务器端(SessionId可以通过Cookie保存在浏览器,也可以通过重写URL的方式获得)
  • Cookie安全性不高,用户可以通过浏览器直接看到Cookie信息,可以仿造Cookie(可以加密Cookie),Session较为安全
  • Session会在一定的时间保存在服务器中,如果访问量增多,考虑性能时,可以考虑使用Cookie
  • 单个Cookie在客户端的大小限制是3k,也就是一个站点在客户端保存的数据不能超过3K。而Seesion可以保存任意类型的数据(javaBean等)

Cookie与Session的使用场景及小案例

- Cookie :记住我、网页皮肤、最近浏览商品
- Session:登录的用户信息、购物车(也可以用Cookie)

实现登录的记住我功能

LoginServlet

package com.it.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet(urlPatterns = "/Login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String readme = req.getParameter("readme"); // 判断用户名和密码是否为空
if("".equals(username) || "".equals(password)){
req.setAttribute("errorMsg","用户名和密码不能为空!");
req.getRequestDispatcher("/index.jsp").forward(req, resp);
return;
} //1、创建Cookie
Cookie cookie1 = new Cookie("username", username);
Cookie cookie2 = new Cookie("password", password); // 2、设置Cookie的访问规则, / 当前服务器有效,req.getContextPath() 当前项目有效
cookie1.setPath("/");
cookie2.setPath("/");
// 如果用户点击了readme,则设置Cookie的过期时间为1小时
if(readme != null) {
// 3、设置过期时间为1个小时
cookie1.setMaxAge(60 * 60);
cookie2.setMaxAge(60 * 60);
}else {
// 未点击readme,将cookie时间直接设置为过期
cookie1.setMaxAge(0);
cookie2.setMaxAge(0);
} // 4、响应给浏览器
resp.addCookie(cookie1);
resp.addCookie(cookie2); //5、跳转到登录成功页面
resp.sendRedirect(req.getContextPath() + "/success.jsp"); }
}

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<%
String path = request.getContextPath(); String username = "";
String password = "";
// 如果Cookie中没有值,则为空,有值的话设置为checked,让记住我的按钮动态选中
String readme = "";
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("username")) {
username = cookie.getValue();
readme = "checked";
}
if (cookie.getName().equals("password")) {
password = cookie.getValue();
}
}
} %>
<base href="<%=path%>/">
</head>
<body>
<center>
<form action="Login">
<p>用户名:<input type="text" name="username" value="<%=username%>"></p>
<p>密码:<input type="text" name="password" value="<%=password%>"></p>
<p><input type="checkbox" name="readme" <%=readme%> >记住我</p>
<p><input type="submit" value="点击登录"></p>
</form>
</center>
</body>
</html>

Servlet中获取Session并且设置值,以及JSP中获取Session中的数据

// Servlet的service方法中设置值
req.getSession().setAttribute("username",username); // jsp中获取值,2种方式
sessionId为:<%=session.getId()%>
用户名为:${sessionScope.username}
用户名为:<%=session.getAttribute("username")%>

Session与Cookie的原理以及使用小案例>从零开始学JAVA系列的更多相关文章

  1. JAVAWEB - Servlet原理及其使用>从零开始学JAVA系列

    目录 Servlet原理及其使用 什么是Servlet Servlet的使用 编写一个Servlet,使用继承HttpServlet的方式 配置web.xml 很简单的几个JSP文件 小提示,如果继承 ...

  2. JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

    目录 JSP的执行原理.JSP的内置对象.四大作用域解析.MVC模式理解 JSP的执行原理 这里拿一个小例子来解析JSP是如何被访问到的 首先将该项目部署到tomcat,并且通过tomcat启动 通过 ...

  3. Session和Cookie的原理

    1.session和cookie的存储 session一般保存在服务端文件中,php.ini中有个配置项--session.save_path='';这个里面填写的路径,将会使session文件保存在 ...

  4. Session和Cookie的原理,以及在分布式应用中出现的问题和解决方案

    产生原因 由于http协议是无状态的,同一个浏览器对服务器的两次请求之间是没有关系的,服务器认为两次请求都是全新的请求,不会记住上次请求成功的数据.然而现有的业务常常需要服务器能记住用户的访问情况, ...

  5. session和cookie工作原理说明

    session 第一次请求: session_start 1.第一次发送http请求,由于第一次未携带session_id ,首先自动生成一个session_id,初始化$_SESSION[]; 2. ...

  6. 从零开始学java(小游戏 石头剪刀布)

    Game.java package com.java;import java.util.Scanner;public class Game {        private Player player ...

  7. [转]ASP.Net篇之Session与Cookie

    本文转自:http://www.cnblogs.com/japanbbq/archive/2011/08/31/2160494.html Session: Session是“会话”的意思,然而,因为h ...

  8. 知识记录——Session与Cookie

    Session: Session是“会话”的意思,然而,因为http协议是无状态的,那么每次客户端请求服务器端,服务器端都会以“崭新”的页面展示给客户端,这在静态的html页面中是不会存在任何影响,但 ...

  9. 浅析Django之session与cookie

    浅析Django之session与cookie 1 session与cookie概述 原理: 由于HTTP协议是无状态,无连接的,当用户发起网路请求时,需要服务端能标识用户ID,用以存储用户相关信息, ...

随机推荐

  1. linux下 大日志文件查看与搜索---less

    场景 有一个几十m的大日志文件,里边的记录是按时间排序的. 现在需要找到其中,不知道在什么位置的一条错误消息.这时候,想把内容拷出来都费劲,就算拷出来了,一般的编辑器也难以hold住这么大的文件.这时 ...

  2. 你的电脑适合升级 Win11 吗?「GitHub 热点速览 v.21.26」

    作者:HelloGitHub-小鱼干 WhyNotWin11 是个有意思的项目,本以为是从 360 度"抨击" Windows 11 的不好用之处,但它是一个实实在在地从硬件角度告 ...

  3. Redis并发竞争key的解决方案详解

    1. 需求由来 1.Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞 ...

  4. 不藏了,这些Java反射用法总结都告诉你们

    摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...

  5. 什么是forward和include?

    请求包含的例子 第一个Servlet (DispatcherServlet) @Override protected void doGet(HttpServletRequest req, HttpSe ...

  6. Prometheus(一):Web服务环境监控

    写在前面 现每个后端的同学的日常都在跟服务(接口)打交道,维护老的比较大单体应用.按业务拆得相对比较细的新服务.无论企业内部用的,面向用户的前端的服务.流量大的有流量小的,有重要的有不那么重要的. 但 ...

  7. bugKu管理员系统

    先F12看看,有啥发现的,发现一段注释... 感谢那个群友分享了怎么辨别base64编码,通常是A-Z,a-z,0-9,+,/,=.最后通常有0个到2个等号,我也成功用在线解码器,确实是base64编 ...

  8. 从新建文件夹开始构建ShadowPlay Engine游戏引擎(3)

    本篇序言 各位可能看到博文的名字换了,也就是引擎名字换了,其实是在下想到了一个更棒的名字:皮影戏(ShadowPlay),取这个名字的含义是因为,游戏中的角色(Puppet)不也是由于我们的操作而动起 ...

  9. asp.net 读取 connectionStrings

    connectionStrings 在vs.net 2005 beta 2开始,如果你在web.config中使用了数据库连接字符串的配置,那么应该按如下的方法去写: <connectionSt ...

  10. VisualEffectGraph基础操作 --创建VEG项目步骤讲解

    一:建立VEG项目步骤 首先打开Unity Hub,  使用unity2020.1 新建项目(本技术博客,默认使用unity2020.1 版本演示),选择HDRP 高清渲染管线,确定项目目录与名称. ...