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

news2024/9/27 5:51:15

会话

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

在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);
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 基础二part1.运算符:赋值、一元、比较、逻辑运算符

JavaScript 基础二 1.1 赋值运算符1.2 一元运算符自增运算符的用法&#xff1a;例题 1.3 比较运算符不同类型间的比较严格相等对 null 和 undefined 进行比较 1.4 逻辑运算符例题 1.5 运算符优先级 1.1 赋值运算符 赋值运算符&#xff1a;对变量进行赋值的运算符 已经学过的赋…

c++学习第八讲---类和对象---继承

继承&#xff1a; 使子类&#xff08;派生类&#xff09;拥有与父类&#xff08;基类&#xff09;相同的成员&#xff0c;以节约代码量。 1.继承的基本语法&#xff1a; class 子类名&#xff1a;继承方式 父类名{} &#xff1b; 例&#xff1a; class father { public:in…

李沐-《动手学深度学习》-- 01-预备知识

一、线性代数知识 1. 矩阵计算 a. 矩阵求导 ​ 当y和x分别为标量和向量时候&#xff0c;进行求导得到的矩阵形状&#xff0c;矩阵求导就是矩阵A中的每一个元素对矩阵B中的每一个元素求导 ​ 梯度指向的是值变化最大的方向 ​ 分子布局和分母布局&#xff1a; b. 常识 ax…

cube生成电机库,启用了RTOS,编译报错[0xc43ed8:5050106] in osSignalWait

cube生成电机库&#xff0c;启用了RTOS&#xff0c;编译报错[0xc43ed8:5050106&#xff0c;解决办法] in osSignalWait 1.现象 编译报错[0xc43ed8:5050106] in osSignalWait 导致链接失败 2.解决办法 将keil5的版本升级到5.18.00&#xff0c;我的版本也是5.14.00。

我的第一个前端项目,vue项目从零开始创建和运行

​入门前端&#xff0c;从基础做起&#xff0c;从零开始新建项目 背景&#xff1a;VUE脚手架项目是一个“单页面”应用&#xff0c;即整个项目中只有1个网页&#xff01; 在VUE脚手架项目中&#xff0c;主要是设计各个“视图组件”&#xff0c;它们都是整个网页中某个部分&…

Python如何生成个性二维码

Python-生成个性二维码 一、问题描述 通过调用MyQR模块来实现生成个人所需二维码。 安装&#xff1a; pip install myqr 二、代码实现 1.普通二维码 from MyQR import myqr # 普通二维码 myqr.run(wordshttp://www.csdn.net/mayi0312,save_nameqrcode.png ) 效果图&#…

学习录

概述 这几年在迷茫中看了不少资料&#xff0c;有觉得写得很棒的&#xff0c;也有写的很糟糕的。所以一直想写这块的总结来进行归纳&#xff0c;同时也希望能给其他处于迷茫中的朋友提供一份高质量的资料列表(也许一个读者也没有)&#xff0c;以下清单个人觉得值得反复看以及思…

利用ChatGLM3构建Prompt实现Text2SQL

之前使用ChatGLM3的自定义工具实现了查询MySQL数据库&#xff0c;但感觉功能还是比较受限。 https://blog.csdn.net/weixin_44455388/article/details/135270879?spm1001.2014.3001.5501 使用ChatGLM3实现Text2SQL 前言Text2SQL的构建第一阶段&#xff1a;SQL脚本构建&#xf…

听GPT 讲Rust源代码--compiler(32)

File: rust/compiler/rustc_middle/src/middle/exported_symbols.rs 在Rust的源代码中&#xff0c;rust/compiler/rustc_middle/src/middle/exported_symbols.rs文件的作用是实现编译器中处理导出符号的功能。 该文件中定义了一些结构体和枚举&#xff0c;用于描述导出符号的信…

MySQL 存储引擎和索引类型介绍

1. 引言 MySQL 是一个流行的关系型数据库管理系统&#xff0c;提供多种存储引擎以满足不同的业务需求。本文将介绍几种常见的 MySQL 存储引擎和索引类型比较&#xff0c;并给出相应的示例。 2. 存储引擎概述 2.1 InnoDB 存储引擎 InnoDB 是 MySQL 的默认存储引擎&#xff0…

向量数据库:usearch的简单使用+实现图片检索应用

usearch的简单使用 usearch是快速开源搜索和聚类引擎&#xff0c;用于C、C、Python、JavaScript、Rust、Java、Objective-C、Swift、C#、GoLang和Wolfram &#x1f50d;中的向量和&#x1f51c;字符串 // https://github.com/unum-cloud/usearch/blob/main/python/README.md …

解决ImportError: Failed to import test module: sys.__init__

解决ImportError: Failed to import test module: sys.init 背景 学习通过文件夹执行测试脚本时&#xff0c;出现了错误&#xff1a;ImportError: Failed to import test module: sys.__init__ 解决过程 根据报错信息&#xff1a;sys is not a package大胆猜测可能是文件名…

【MySQL】数据库之MMM高可用

目录 一、什么是MMM 二、关于MMM架构的说明 三、实操MMM的高可用 步骤一&#xff1a;完成主主复制、主从复制 步骤二&#xff1a;所有节点服务器都安装mysql-mmm,并完成mmm_common.conf文件的配置 步骤三&#xff1a;完成monitor节点服务器的配置文件修改mmm_mon.conf 步…

SpringCloud系列篇:入门讲解Spring Cloud是什么

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Spring Cloud是什么 二.Spring …

家里有必要买NAS吗?

完全没有必要&#xff0c;因为用旧电脑搭建NAS不仅价格实惠&#xff0c;而且非常简单&#xff0c;效果也完全不差买了的&#xff01; 并且......还环保 教程链接&#xff1a; 用旧电脑搭建NAS在您的家庭中&#xff0c;通过将旧 PC 转变为NAS服务器&#xff0c;您可以轻松搭建…

Ubuntu 虚拟机挂接 Windows 目录

Windows 共享目录 首先 Windows 下共享目录 我这里偷懒直接直接 Everyone &#xff0c;也可以指定用户啥的 Ubuntu 挂接 挂接命令&#xff0c;类似如下&#xff1a; sudo mount -o usernamefananchong,passwordxxxx,uid1000,gid1000,file_mode0644,dir_mode0755,dynperm //…

04set注入专题/简单类型/数组/List/Set/Map/空字符串/null/特殊符号

1.1注入外部Bean 在之前使用的案例就是注入外部Bean的方式。 <!-- class属性声明要管理哪个类中的对象 property标签的name是提示set方法名ref标签指明注入的bean的id--><bean id"userServiceBean" class"com.powernode.spring6.service.UserService…

WorkPlus支持平台级定制,助理企业自主掌控业务和生态

在数字化时代&#xff0c;企业越来越需要满足自身特性和需求的定制化解决方案。WorkPlus不同于企业微信、钉钉和飞书&#xff0c;它支持平台级的定制服务&#xff0c;完全掌控自身数字化进程。WorkPlus可根据企业的安全特性、强可控要求和高定制化场景&#xff0c;提供原厂平台…

基于 HTTPS 协议配置 Git 连接 GitHub

文章目录 0.安装 Git1.注册 GitHub 账号2.配置 Git 的用户名和邮箱3.远程连接 GitHub 有两种传输协议4.基于 SSH 协议配置 Git 连接 GitHub5.基于 HTTPS 协议配置 Git 连接 GitHub5.1 创建 GitHub 个人访问令牌5.2 有两种方法将本地仓库和远程仓库关联起来5.2.1 第一种方法&…

位运算--二进制中1的个数(含常见的二进制运算操作)

目录 二进制中1的个数操作 1 查看第k位的数字是否为1操作2 lowbit操作 解题代码&#xff1a; 原题链接: 二进制中1的个数 给定一个长度为 n 的数列&#xff0c;请你求出数列中每个数的二进制表示中 1 的个数。 输入格式 第一行包含整数 n 。 第二行包含 n 个整数&#xff0c…