cookie和session、请求转发和重定向

会话

分为有状态会话和无状态会话

在HTML中,"会话"一般指的是Web服务器与客户端(通常是浏览器)之间进行的一系列请求和响应。它是一种在网络上模拟人与人之间通信的方式,常见于Web应用程序中。

会话、Cookie和Session都是Web开发中用于跟踪和管理用户状态的重要概念。下面我将对它们进行简要解释和比较:

  1. 会话(Session):
    • 会话是一种服务器端技术,用于在多个页面请求之间保持用户状态。
    • 服务器为每个用户创建一个唯一的会话,并在服务器端存储与该会话相关的数据,例如用户身份、登录状态等。
    • 会话通常使用一个唯一的会话ID来标识,该ID可以通过Cookie或URL重写等方式在客户端和服务器之间传递。
    • 会话数据存储在服务器端,因此可以存储更多的信息,并且相对安全。
  1. Cookie:
    • Cookie是一种存储在用户浏览器中的小型文本文件,用于跟踪用户状态。大部分浏览器会限制cookie的大小,4KB/8KB,对同一个域名下的cokie也有限制,一般为20个。
    • 当用户首次访问网站时,服务器可以通过在响应头中设置Set-Cookie来发送一个或多个Cookie到用户的浏览器。
    • 浏览器会存储这些Cookie,并在后续的请求中自动将其发送回服务器,以便服务器能够识别用户并恢复其状态。
    • Cookie通常用于存储用户的登录状态、个性化设置等。一般用来设置到期规则,在到期之前会一直存在浏览器上,除非将其清除。
    • Cookie可以被篡改,一般被用于存储少量且不敏感的数据。浏览器可以设置Cookie禁用。
  1. Session与Cookie的比较:
    • 存储位置:会话数据存储在服务器端,而Cookie数据存储在用户的浏览器中。
    • 数据安全性:会话数据相对更安全,因为存储在服务器端,不容易被篡改或窃取。而Cookie数据存储在客户端,存在被恶意用户篡改或窃取的风险。
    • 数据容量:会话可以存储更多的数据,因为数据存储在服务器端,没有大小限制。而Cookie的大小通常受到限制(通常是4KB)。
    • 生命周期:会话通常具有短暂的生命周期,通常在用户关闭浏览器或一段时间无活动后过期。而Cookie可以设置过期时间,可以长期存储在用户的浏览器中。
    • session用来记录用户状态,服务端会对每个浏览器会设置一个session对象,一般一个浏览器会独占一个session对象

总结起来,会话和Cookie都是用于跟踪和管理用户状态的技术,但它们在存储位置、数据安全性、数据容量和生命周期等方面存在差异。根据具体需求和应用场景,开发人员可以选择使用会话、Cookie或它们的组合来实现用户状态的跟踪和管理。

setCookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、服务端创建cookie对象
        Cookie cookie =  new Cookie("role", "aa");   //键、值,在有效期内,如果键相同,值不同,关闭再次打开,值会覆盖之前的;如果键不同,会重新创建一个cookie
        //2、设置cookie有效期
        // >0  cookie有效期
        //  <0  临时存储,是一个会话,关闭浏览器就消失了
        // 0 删除,刷新页面就没有了
        cookie.setMaxAge(0);
        //3、将cookie响应给客户端
        response.addCookie(cookie);
    }
getCookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取cookie信息
        Cookie[] cookies =  request.getCookies();
        for(int i=0;i<cookies.length;i++) {
            /*if(cookies[i].getName().equals("account")) {
                System.out.println(cookies[i].getValue());
            }*/
            System.out.println(cookies[i].getName()+"--->"+cookies[i].getValue());    //获取关键字和值
        }
    }
JS和JQuery设置获取cookie
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="resource/js/jquery.js"></script>
<script src="resource/js/jquery.cookie.js"></script>
<script type="text/javascript">

//设置cookie
//document.cookie="password=123456;max-age="+60*60
//获取cookie 
//document.cookie

//根据关键字获取cookie值的方法
//indexOf() 判断有没有这个子串,有返回匹配的第一个串的第一个位置,没有返回-1
//indexOf("admin",n)跳过n个元素查找这个子串
//lastIndexOf()判断有没有这个子串,有返回匹配的最后一个串的第一个位置,没有返回-1

//split()用于把一个字符串分割成字符串数组
/* function getCookie(key){
    var cookies = document.cookie.split(";")
    console.log(cookies)
    for(var i=0;i<cookies.length;i++){
        if(cookies[i].trim().indexOf(key)==0){
            return cookies[i].trim().substring(key.length+1)
        }
    }
    return ""
}

console.log(getCookie("account")) */


//jquery设置cookie
$.cookie('name', 'value', { expires: 7 });   //设置7天后过期
console.log($.cookie('name'))  //根据关键字读取cookie的值
console.log($.cookie())   //读取cookie所有的信息
$.removeCookie('name')   //根据关键字删除cookie的信息
 
</script>
</head>
<body>
hello
</body>
</html>

setSession
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //获取session对象
        HttpSession session =  request.getSession();
        //设置值
        session.setAttribute("key", "value");
        session.setAttribute("account", "xixi");
        
        //重写url追加jsessionid
        String newUrl =  response.encodeRedirectURL("getSession");
        //重定向
        response.sendRedirect(newUrl);
        
        
        /*//获取sessionid
        System.out.println(session.getId());
        //获取session信息
        System.out.println(session.getAttribute("key"));
        System.out.println(session.getAttribute("account"));
        //删除
        session.removeAttribute("key");
        System.out.println(session.getAttribute("key"));
        System.out.println(session.getAttribute("account"));
        //销毁session
        session.invalidate();*/
        
    }
getSession
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //获取session对象
        HttpSession session =  request.getSession();   //如果有jsessionid会到服务端找到对应的session,如果没有则创建一个新的session对象
        System.out.println(session.getId());
        //获取session信息
        System.out.println(session.getAttribute("key"));
        System.out.println(session.getAttribute("account"));
        //删除
        /*session.removeAttribute("key");
        System.out.println(session.getAttribute("key"));
        System.out.println(session.getAttribute("account"));*/
        //销毁session
        session.invalidate();
    }

cookie禁用后,请求转发和重定向

当用户禁用了Cookie时,请求转发和重定向的行为可能会受到一些影响。下面我将简要解释这些影响:

  1. 请求转发(Forwarding):是一种服务器行为,当客户端请求到达后,服务器进行转发
    • 在请求转发过程中,请求从客户端发送到服务器,然后由服务器转发到另一个服务器或资源。
    • 当Cookie被禁用时,服务器可能无法识别和跟踪用户的会话。因此,当请求转发到另一个服务器或资源时,新的服务器可能无法识别用户的身份或状态。
    • 这可能导致用户在请求转发后被视为新用户,并需要重新登录或重新输入个人信息。
  1. 重定向(Redirection):服务端指导客户端行为,客户端发出一个请求,被服务端接收处理之后,服务端给客户端一个响应(一个新的地址),当客户端接收到新的地址之后,立马发起第二次请求,服务端接收并响应
    • 重定向是指将用户的请求从服务器A重定向到服务器B,然后返回一个新位置的响应。
    • 当Cookie被禁用时,与请求转发类似,服务器可能无法识别和跟踪用户的会话。因此,当用户被重定向到另一个服务器时,新的服务器可能无法识别用户的身份或状态。
    • 这可能导致用户在重定向后被视为新用户,并需要重新登录或重新输入个人信息。

需要注意的是,即使Cookie被禁用,某些情况下仍然可以使用其他技术来跟踪用户状态,例如通过URL参数、隐藏表单字段或服务器端会话来传递必要的信息。然而,这些方法可能不如使用Cookie方便和高效。

因此,当设计Web应用程序时,开发人员应该考虑到用户可能禁用Cookie的情况,并采取适当的措施来确保应用程序的正常运行和用户体验。

请求转发和重定向

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class S01
 */
@WebServlet("/S01")
public class S01 extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S01() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        String account = request.getParameter("account");
        String password = request.getParameter("password");
        System.out.println("s01账号:"+account);
        System.out.println("s01密码:"+password);

        System.out.println("s01");
        //请求转发
        //可以转发至网站内任意资源
        //一次请求,数据在request域中共享
        //地址栏不发生改变
               //不能跨域                  
        //服务端行为
        //request.getRequestDispatcher("S02").forward(request, response);
        //request.getRequestDispatcher("main.html").forward(request, response);
        //request.getRequestDispatcher("WEB-INF/demo.html").forward(request, response);
        //重定向,不能访问到WEB-INF里面的,WEB-INF屏蔽了所有客户端行为,WEB-INF是针对服务端的
        //客户端行为
        //两次请求,数据在request域中不共享
        //可以重定向到任意地址(可以跨域)
        //response.sendRedirect("S02");
        //response.sendRedirect("main.html");
        //response.sendRedirect("https://www.baidu.com/");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class S02
 */
@WebServlet("/S02")
public class S02 extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public S02() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        String account = request.getParameter("account");
        String password = request.getParameter("password");
        System.out.println("s02账号:"+account);
        System.out.println("s02密码:"+password);
        System.out.println("s02");

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue电商后端管理API接口测试

引言 最近有人在学习接口自动化测试时没有接口练手&#xff0c;其实接口的话&#xff0c;要么找第三方提供的&#xff0c;要么自己开发。第三方在线API需要认证&#xff0c;并且普通的话每天调用次数有一定的限制。自己开发的话&#xff0c;只要不停电&#xff0c;想怎么用就怎…

Jmeter接口自动化测试 :Jmeter变量的使用

在使用jmeter进行接口测试时&#xff0c;我们难免会遇到需要从上下文中获取测试数据的情况&#xff0c;这个时候就需要引入变量了。 定义变量 添加->配置元件->用户自定义的变量 添加->配置元件->CSV 数据文件设置 变量的调用方式&#xff1a;${变量名} 变量的作…

低代码平台的崛起:探索火爆背后的因素

文章目录 前言低代码开发平台优缺点有哪些&#xff1f;速度稳定性赋能一致性安全简单低代码为什么能火&#xff1f;由哪些因素导致&#xff1f; 低代码的优势后记 前言 在当前科技发展快速的时代&#xff0c;低代码开发平台越来越受到关注和推崇。与传统的软件开发方式相比&am…

C++学习笔记——类作用域和抽象数据类型

目录 一、C类作用域 类内作用域 类外作用域 二、类作用域案列详细的解释说明 三、抽象数据类型 四、总结 类作用域 抽象数据类型&#xff08;ADT&#xff09; 五、图书馆管理系统 一、C类作用域 在C中&#xff0c;类作用域是指类定义中声明的标识符&#xff08;成员变…

我建立了一个资源分享群

我建立了一个资源分享群 在为寻找资源犯愁&#xff1f; 在为分享资源犯愁&#xff1f; 一起加入分享资源群&#xff08;是wx群哦&#xff09;吧&#xff01;你可以分享自己的资源帮助他人。你可以在群组里需求资源获取别人的帮助。发广告请绕行&#xff0c;会被拉黑哦 微信…

基于SpringBoot+Vue人力资源管理系统(前后端分离)

该项目完全免费 系统介绍 基于 SpringBootVue 实现的人力资源管理系统是为了提高企业人力资源管理水平而开发的。主要目标是通过对员工 及人力资源活动信息&#xff08;考勤、工资 ) 等的编制来提高企业效率。 系统一共分为五大菜单项&#xff0c;分别是首页、薪资管理、权…

Linux安装nginx(带http ssl)

nginx安装 nginx文件 以及gcc pcre zlib openssl 网盘下载 1.安装gcc yum -y install gcc gcc-c 2.安装pcre rpm -ivh pcre-8.32-17.el7.x86_64.rpm --force --nodeps rpm -ivh pcre-devel-8.32-17.el7.x86_64.rpm --force --nodeps 3.安装zlib tar -zxvf zlib-1.2.11.ta…

Bayes贝叶斯识别Spam Email垃圾邮件

目录 介绍&#xff1a; 一、Gaussian Naive Bayes(连续型变量) 1.1数据处理 1.2建模 1.3cross_val_score函数评估 1.4classification_report函数评估 1.5classification_report函数和cross_val_score函数的区别 二、 Multinomial Naive Bayes&#xff08;离散型变量&…

【算法设计与分析】分治-时间复杂度计算

目录 主定理 Master Theorem分治算法运行时间的递归表示主定理的简化形式 主定理的一般形式 递归树 Recursion Tree递归树的简单结论 主定理 Master Theorem 分治算法运行时间的递归表示 将原问题分解成 a 个子问题递归求解&#xff0c;每个子问题的规模是原问题的 1/b。同时子…

紫光展锐5G扬帆出海 | 欧洲积极拥抱更多5G选择

和我国一样&#xff0c;欧洲不少国家也在2019年进入5G商用元年&#xff1a;英国在2019年5月推出了5G商用服务&#xff0c;该国最大的移动运营商EE(Everything Everywhere)最先商用5G&#xff1b;德国在2019年年中推出5G商用服务&#xff0c;德国电信、沃达丰和 Telefonica是首批…

从0开始python学习-42.requsts统一请求封装

统一请求封装的目的&#xff1a; 1.去除重复的冗余的代码 2. 跨py文件实现通过一个sess来自动关联有cookie关联的接口。 3. 设置统一的公共参数&#xff0c;统一的文件处理&#xff0c;统一的异常处理&#xff0c;统一的日志监控&#xff0c;统一的用例校验等 封装前原本代…

手写视频裁剪框

<!-- 截取框 --><divv-show"isShow"class"crop-box":style"{width: cropWidth px,height: cropHeight px,left: cropX px,top: cropY px,}"ref"cropBox"mousedown"startInteraction"><!-- 内容在这里 --…

Kubernetes二进制部署 单节点

一、环境准备 k8s集群master1&#xff1a;192.168.229.90 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群node1: 192.168.229.80 kubelet kube-proxy docker flannel k8s集群node2: 192.168.229.70 kubelet kube-proxy docker flannel 至少2C2G 常见的k…

软件工程:数据流图相关知识和多实例分析

目录 一、数据流图相关知识 1. 基本介绍 2. 常用符号 3. 附加符号 二、数据流图实例分析 1. 活期存取款业务处理系统 2. 工资计算系统 3. 商业自动化系统 4. 学校人事管理系统 5. 教材征订系统 6. 高考录取统分子系统 7. 订货系统 8. 培训中心管理系统 9. 考务处…

【动态规划】【字符串】C++算法:140单词拆分

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 动态规划 字符串 LeetCode140:单词拆分 II 给定一个字符串 s 和一个字符串字典 wordDict &#xff0c;在字符串 s 中增加空格来构建一个句子&#xff0c;使得句子中所有的单词都在词典中。以任意顺序 返回…

PyTorch|一次画一批图像

想想这样一个场景&#xff0c;我们训练了一个神经网络&#xff0c;输入一些信息&#xff0c;这个网络可以根据信息为我们生成相关图片。 这些图片并不是一张&#xff0c;而是多张&#xff0c;我们想把这些图片一次全部显示出来&#xff0c;而不是一张一张的显示&#xff08;这…

【JAVA】异常体系

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Exception&#xff08;异常&#xff09;: Error: 结语 我的其他博客 前言 在Java编程中&#xff0c;异常处理是一个至关…

什么?谁?w (who what)

文章目录 什么&#xff1f;谁&#xff1f;w (who & what)默认的显示不显示标题行简洁模式显示更多信息 什么&#xff1f;谁&#xff1f;w (who & what) w可以认为是加强版的who&#xff0c;果然越简洁越强大&#xff0c;就比如less比more是功能更多的。 w不仅可以显示…

leetcode:2451. 差值数组不同的字符串(python3解法)

难度&#xff1a;简单 给你一个字符串数组 words &#xff0c;每一个字符串长度都相同&#xff0c;令所有字符串的长度都为 n 。 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] &#xff0c;其中对于 0 < j < n - 2 有 difference[i]…

element-ui table height 属性导致界面卡死

问题: 项目上&#xff0c;有个点击按钮弹出抽屉的交互, 此时界面卡死 原因分析: 一些场景下(父组件使用动态单位/弹窗、抽屉中使用), element-ui 的 table 会循环计算高度值, 导致界面卡死 github 上的一些 issues 和解决方案: Issues ElemeFE/element GitHub 官方讲是升…