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追加jsessionidString newUrl =  response.encodeRedirectURL("getSession");//重定向response.sendRedirect(newUrl);/*//获取sessionidSystem.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"));//销毁sessionsession.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"));*///销毁sessionsession.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 stubdoGet(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 stubString 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 stubdoGet(request, response);}}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择消息队列?Kafka 与 RabbitMQ

在上一期中&#xff0c;我们讨论了使用消息队列的好处。然后&#xff0c;我们回顾了消息队列产品的历史。现在看来&#xff0c;当我们需要在项目中使用消息队列时&#xff0c;Kafka 是首选产品。但是&#xff0c;当我们考虑特定要求时&#xff0c;它并不总是最佳选择。 数据库…

网络连接 UDP2,UDP Connect, bind, send, recieve认知, -入门8

LWIP编程接口有RAW, NETCONN, SOCKET 2.UDP函数的理解 #define UDP_SERVER_PORT 8000 //PC side #define UDP_CLIENT_PORT 1234 // ctrl board side //PC IP address #define DEST_IP_ADDR0 192 #define DEST_IP_ADDR1 168 #define DEST_IP_ADDR2 3 #define DEST_IP_ADDR3 11…

实验笔记之——服务器链接

最近需要做NeRF相关的开发,需要用到GPU,本博文记录本人配置服务器远程链接的过程,本博文仅供本人学习记录用~ 连上服务器 首先先确保环境是HKU的网络环境(HKU AnyConnect也可)。伙伴已经帮忙创建好用户(第一次登录会提示重新设置密码)。用cmd ssh链接ssh -p 60001 <u…

液体装载机

效果演示 实现了一个SVG动画效果&#xff0c;其中包含了一个线条、两个圆圈和一个虚线。线条和虚线是使用SVG的stroke属性和stroke-dasharray属性实现的&#xff0c;圆圈是使用SVG的circle元素实现的。动画效果是使用CSS的animation属性实现的&#xff0c;其中包含了一个名为Sn…

解决Gitee每次push都需要输入用户名和密码

其实很简单&#xff0c;只需要使用命令 git config --global credential.helper store 在你下次push时只需要再输入一次用户名和密码&#xff0c;电脑就会保存下来&#xff0c;之后就无需进行输入了。

【数据库】聊聊常见的索引优化-上

数据库对于现有互联网应用来说&#xff0c;其实是非常重要的后端存储组件&#xff0c;而大多数系统故障都是由于存储所导致的&#xff0c;而数据库是重中之重&#xff0c;所以为了比较好掌握SQL的基本优化手段&#xff0c;打算用两篇文章从基本的联合索引优化、group by/order …

ChatGPT大升级,文档图像识别领域迎来技术革新

​写在前面ChatGPT迎来重大升级冲击与机遇并存​大模型时代的思考与探索■ 像素级OCR统一模型- UPOCR■ OCR大一统模型- SPTS v3■ 文档识别分析LLM应用 写在最后问卷抽奖 ​写在前面 2023 年 12 月 31 日第十九届中国图象图形学学会青年科学家会议在广州召开&#xff0c;该会…

AE (5)_auto exposure的驱动控制

#灵感# 有个项目&#xff0c;一开始驱动没配好&#xff0c;自动曝光乱飞。所以记下配置 参考链接&#xff1a;关于 bringup sensor 时&#xff0c;曝光时间异常的问题排查-CSDN博客 目录 确认最大曝光行&#xff1a; 1、曝光行配置 2、增益配置 raw 图发紫&#xff1a; 确…

《MySQL系列-InnoDB引擎06》MySQL锁介绍

文章目录 第六章 锁1 什么是锁2 lock与latch3 InnoDB存储引擎中的锁3.1 锁的类型3.2 一致性非锁定读3.3 一致性锁定读3.4 自增长与锁3.5 外键和锁 4 锁的算法4.1 行锁的三种算法4.2 解决Phantom Problem 5 锁问题5.1 脏读5.2 不可重复读5.3 丢失更新 6 阻塞7 死锁 第六章 锁 开…

BMS电池管理系统带充放电控制过流过压保护

2.4G无线采集BMS开发板&#xff08;主从一体&#xff09; 全新升级 &#xff08;赠送上位机源码TTL 上位机&#xff0c;可以改成自己想要的界面&#xff09; 12串电池TTL上位机 CAN通信上位机源码有偿开源&#xff0c;供项目二次开发。 增加STM32平台 USB转TTL通信 CAN通信 增加…

软件测试|使用PyMySQL访问MySQL数据库的详细指南

简介 PyMySQL是Python中流行的MySQL数据库驱动程序&#xff0c;它提供了便捷的方法来连接、查询和更新MySQL数据库。本文将为您提供使用PyMySQL访问MySQL数据库的详细指南&#xff0c;包括安装PyMySQL、连接数据库、执行查询和更新操作等。 环境准备 在开始之前&#xff0c;…

死锁与读写锁

一、死锁 死锁&#xff08;Deadlock&#xff09;是在并发计算中的一种状态&#xff0c;其中两个或多个进程无法继续执行&#xff0c;因为每个进程都在等待另一个进程释放所占用的资源。这种情况通常发生在系统中的资源分配过程中&#xff0c;其中每个进程都占用一些资源&#…