面试java开发被问最多的“cookie、session、token”问题,安排!

秋招记录贴(天津) 笔试面试经历 由于我是河北人,不想离家太远,也不想北漂,女朋友也在天津,所以投的大部分都是天津的公司,和极少数北京公司,想来天津的同学欢迎交流。 以下是我走完流程的所有公司 渤海银行总行信息科技部 8月18号已投 29号笔试 9月6号面试 收到体检通知 offer 京东(北京) 8月24已投 9月11号笔试 16号一面 17号二面 28号hr面 offer 中科创达9月9号已投 11号笔试 17号一面 18号hr面 offer 宏信建发 8月13号被要简历 14号一面过, 二面过 offe... 阅读详情

在这里插入图片描述

前言

作为一个JAVA开发,之前有好几次出去面试,面试官都问我,JAVAWeb掌握的怎么样,我当时就不知道怎么回答,Web,日常开发中用的是什么?今天我们来说说JAVAWeb最应该掌握的三个内容。

发展历程

1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记住是谁刚刚发了HTTP请求, 每个请求对我来说都是全新的。

2、但是随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,马上就面临一个问题,那就是要管理会话,必须记住哪些人登录系统, 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开,这就是一个不小的挑战,因为HTTP请求是无状态的,所以想出的办法就是给大家发一个会话标识(session id), 说白了就是一个随机的字串,每个人收到的都不一样, 每次大家向我发起HTTP请求的时候,把这个字符串给一并捎过来, 这样我就能区分开谁是谁了。

3、这样大家很嗨皮了,可是服务器就不嗨皮了,每个人只需要保存自己的session id,而服务器要保存所有人的session id ! 如果访问服务器多了, 就得由成千上万,甚至几十万个。

这对服务器说是一个巨大的开销 , 严重的限制了服务器扩展能力, 比如说我用两个机器组成了一个集群, 小F通过机器A登录了系统, 那session id会保存在机器A上, 假设小F的下一次请求被转发到机器B怎么办? 机器B可没有小F的 session id啊。

有时候会采用一点小伎俩: session sticky , 就是让小F的请求一直粘连在机器A上, 但是这也不管用, 要是机器A挂掉了, 还得转到机器B去。

那只好做session 的复制了, 把session id 在两个机器之间搬来搬去, 快累死了。

image-20210712162145823

后来有个叫Memcached的支了招: 把session id 集中存储到一个地方, 所有的机器都来访问这个地方的数据, 这样一来,就不用复制了, 但是增加了单点失败的可能性, 要是那个负责session 的机器挂了, 所有人都得重新登录一遍, 估计得被人骂死。

image-20210712162600049

也尝试把这个单点的机器也搞出集群,增加可靠性, 但不管如何, 这小小的session 对我来说是一个沉重的负担

4 于是有人就一直在思考, 我为什么要保存这可恶的session呢, 只让每个客户端去保存该多好?

可是如果不保存这些session id , 怎么验证客户端发给我的session id 的确是我生成的呢? 如果不去验证,我们都不知道他们是不是合法登录的用户, 那些不怀好意的家伙们就可以伪造session id , 为所欲为了。

嗯,对了,关键点就是验证 !

比如说, 小F已经登录了系统, 我给他发一个令牌(token), 里边包含了小F的 user id, 下一次小F 再次通过Http 请求访问我的时候, 把这个token 通过Http header 带过来不就可以了。

不过这和session id没有本质区别啊, 任何人都可以可以伪造, 所以我得想点儿办法, 让别人伪造不了。

那就对数据做一个签名吧, 比如说我用HMAC-SHA256 算法,加上一个只有我才知道的密钥, 对数据做一个签名, 把这个签名和数据一起作为token , 由于密钥别人不知道, 就无法伪造token了。

image-20210712163843772

这个token 我不保存, 当小F把这个token 给我发过来的时候,我再用同样的HMAC-SHA256 算法和同样的密钥,对数据再计算一次签名, 和token 中的签名做个比较, 如果相同, 我就知道小F已经登录过了,并且可以直接取到小F的user id , 如果不相同, 数据部分肯定被人篡改过, 我就告诉发送者: 对不起,没有认证。

image-20210712163519280

Token 中的数据是明文保存的(虽然我会用Base64做下编码, 但那不是加密), 还是可以被别人看到的, 所以我不能在其中保存像密码这样的敏感信息。

当然, 如果一个人的token 被别人偷走了, 那我也没办法, 我也会认为小偷就是合法用户, 这其实和一个人的session id 被别人偷走是一样的。

这样一来, 我就不保存session id 了, 我只是生成token , 然后验证token , 我用我的CPU计算时间获取了我的session 存储空间 !

解除了session id这个负担, 可以说是无事一身轻, 我的机器集群现在可以轻松地做水平扩展, 用户访问量增大, 直接加机器就行。 这种无状态的感觉实在是太好了!

Cookie

1.什么是Cookie

Cookie翻译成中文的意思是‘小甜饼’,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。Cookie存储的数据量有限,且都是保存在客户端浏览器中。不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用Cookie实际上只能存储一小段的文本信息(key-value格式)。

2.Cookie的机制

当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送会经历以下4个步骤:

  1. 客户端发送一个请求到服务器;

  2. 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部;

  3. 客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部;

  4. 服务器返回响应数据。

image-20210709083823647

为了探究这个过程,写了代码进行测试,如下:

我在doGet方法中,new了一个Cookie对象并将其加入到了HttpResponse对象中

@RestController
public class TestController {
   
   

    @GetMapping(value = "/doGet")
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   
        Cookie cookie = new Cookie("jiangwang",System.currentTimeMillis()+"");
        // 设置生命周期为MAX_VALUE
        cookie.setMaxAge(Integer.MAX_VALUE);
        resp.addCookie(cookie);
    }
}

浏览器输入地址进行访问,结果如图所示:

image-20210708111331506

可见Response Headers中包含Set-Cookie头部,而Request Headers中包含了Cookie头部。name和value正是上述设置的。

3.Cookie的属性

Expires

该属性用来设置Cookie的有效期。Cookie中的maxAge用来表示该属性,单位为秒。Cookie中通过getMaxAge()和setMaxAge(int maxAge)来读写该属性。maxAge有3种值,分别为正数,负数和0。

如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中(每个浏览器存储的位置不一致)。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。

Cookie cookie = new Cookie("jiangwang",System.currentTimeMillis()+"");
// 设置生命周期为MAX_VALUE,永久有效
cookie.setMaxAge(Integer.MAX_VALUE);
resp.addCookie(cookie);

当maxAge属性为负数,则表示该Cookie只是一个临时Cookie,不会被持久化,仅在本浏览器窗口或者本窗口打开的子窗口中有效,关闭浏览器后该Cookie立即失效。

Cookie cookie = new Cookie("jiangwang",System.currentTimeMillis()+"");
// 设置生命周期为MAX_VALUE,永久有效
cookie.setMaxAge(-1);
resp.addCookie(cookie);

当maxAge为0时,表示立即删除Cookie。

Cookie[] cookies = req.getCookies();
Cookie cookie = null;

// get Cookie
for (Cookie ck : cookies) {
   
   
    if ("jiangwang".equals(ck.getName())) {
   
   
        cookie = ck;
        break;
    }
}

if (null != cookie) {
   
   
    // 删除一个cookie
    cookie.setMaxAge(0);
    resp.addCookie(cookie);
}

修改或者删除Cookie

HttpServletResponse提供的Cookie操作只有一个addCookie(Cookie cookie),所以想要修改Cookie只能使用一个同名的Cookie来覆盖原先的Cookie。如果要删除某个Cookie,则只需要新建一个同名的Cookie,并将maxAge设置为0,并覆盖原来的Cookie即可。

新建的Cookie,除了value、maxAge之外的属性,比如name、path、domain都必须与原来的一致才能达到修改或者删除的效果。否则,浏览器将视为两个不同的Cookie不予覆盖。

Cookie的域名

Cookie是不可以跨域名的,隐私安全机制禁止

Jmeter接口测试实战:登录鉴权与403问题深度排查指南 接口测试是软件质量保障的核心环节,其核心在于验证不同系统组件间数据交换的正确性与可靠性。其原理是通过模拟客户端请求,对服务端接口进行功能、性能及安全性的验证。掌握接口测试技术,对于构建稳定、高效的软件系统具有重要价值,广泛应用于API回归测试、微服务架构验证及持续集成流程。在实际应用中,处理需要身份认证的接口是常见挑战,尤其是当登录成功后,后续接口仍返回403禁止访问状态码时,问题排查尤为关键。这通常涉及对会话管理机制(如Token传递)和Web安全框架(如Spring Security的CSRF保护)的深 阅读详情

相关推荐

软件测试面试高频考点全解析:从理论到自动化完整复习指南

软件测试是软件质量保障的核心环节,其方法论体系涵盖测试理论、用例设计、接口验证、数据库检查与系统排错等多个维度。测试原则与流程是工程实践的基石,掌握等价类划分、边界值分析等用例设计方法能显著提升缺陷发现效率。随着研发效能要求提高,自动化测试框架如Selenium、Pytest以及性能测试工具JMeter已成为测试工程师的必备技能,接口测试和持续集成更是现代质量保障体系的关键能力。对于从功能测试向自动化测试转型的从业者,系统掌握SQL查询、Linux日志分析、接口验证及框架搭建可以构建完整的知识链路。本文围绕

weixin_34007906的博客 340

第四范式测试开发笔试题复盘:考点、题型与备考策略

软件测试是保障产品质量的关键环节,测试开发工程师不仅需要掌握功能验证,还需具备自动化测试、用例设计与数据分析能力。在人工智能与机器学习平台快速落地的背景下,AI公司的测试开发岗位对候选人的要求更为复合:既要理解传统测试理论(如等价类、边界值、异常场景覆盖),也要能评估模型效果(如准确率、召回率、AUC),同时还需具备扎实的编程与工程基础(如Python、pytest、SQL、Linux)。从技术原理到工程实践,这套方法论广泛应用于接口自动化、模型评测、线上质量监控等场景。本文结合第四范式测试开发笔试题的复盘

weixin_34211761的博客 605

OPPO后端笔试复盘:Java基础、数据库与并发场景全解析

后端开发岗位的技术笔试,本质上是考察候选人对计算机基础原理的掌握深度与工程实践能力。无论是Java集合源码、JVM内存模型,还是数据库索引与事务隔离级别,这些核心概念都直接决定了系统在高并发场景下的稳定性与性能表现。同时,熟悉ACM模式的输入输出处理,也是应对在线笔试环境的关键技能之一。理解并发编程中的线程安全、锁机制,以及Redis缓存、乐观锁等数据一致性方案,能够帮助开发者在真实的设备管理、账号体系、抢购活动等业务场景中设计出健壮的解决方案。手机厂商后端笔试往往将基础知识与业务场景结合,通过算法题、专业

weixin_34090562的博客 450

移动端安全开发笔试考点拆解:从Android基础到逆向加固

移动端安全是当前企业对抗恶意攻击、保障用户隐私的基石,其核心在于深刻理解平台机制与攻击面。Android作为主流移动操作系统,其沙箱隔离、权限模型、四大组件暴露面、WebView交互以及数据存储安全,构成了安全评估与漏洞挖掘的基础框架。在实际工程中,开发人员不仅需要掌握加密通信与证书校验原理,还需具备对抗逆向分析的安全加固意识。从简单的代码审计到复杂的业务场景威胁建模,这些能力共同支撑起App的纵深防御体系。无论是准备安全岗位笔试,还是构建实战化的移动安全方案,从系统机制出发、沿攻击者视角思考,均是高效的学

dengjuanshou7445的博客 441

科大讯飞测试开发笔试高频考点与备考路线深度拆解

软件测试工程师的成长路径中,测试开发岗位不仅要求扎实的编程基础,更强调对测试理论、自动化框架和工程工具的灵活运用。测试用例设计、SQL查询、Linux命令以及pytest参数化等知识点,共同构成了大厂笔试的核心考察维度。自动化测试与接口测试的真实落地场景,要求候选人具备从需求分析到用例设计的完整思维链路,并能通过日志分析、数据库操作等手段定位问题。本文结合科大讯飞测试开发岗的真题特征,梳理了笔试中的高频考点与筛选逻辑,帮助求职者理解岗位能力模型,建立系统化的备考路径,从而在竞争中更稳地拿到理想offer。

weixin_34353714的博客 385

功能测试面试题库:Web/App/API全场景覆盖

功能测试是软件质量保障的核心环节,通过验证系统行为是否符合需求规格来确保产品可靠性。其技术原理包括等价类划分、边界值分析等经典方法,能有效发现业务逻辑缺陷和交互问题。在工程实践中,功能测试需要覆盖Web前端兼容性、App中断恢复、API接口验证等不同维度,结合Postman、Charles等工具形成完整测试方案。随着DevOps普及,自动化测试与持续集成深度结合,测试左移和右移成为提升交付效率的关键。本文整理的功能测试面试题库包含50个实战问题,特别针对电商、金融等行业场景,帮助面试官全面考察候选人的测试思

weixin_30252709的博客 292

comsol移动网格_comsol模拟移动的纳秒脉冲激光烧蚀材料,温度场分布,结果总不理想,求助大佬!!...

本人comsol新手一枚,希望大家多多指点研究课题:纳秒脉冲激光刻蚀材料表面想用comsol模拟刻蚀过程中的温度场分布,脉宽为300ns,重复频率100kHz,光斑移动速度为5000mm/s,光斑直径50um,激光功率10W,材料种类为:有机涂层,属性如下目前,采用的是一个移动的高斯面光源x脉冲函数,脉冲函数我用的是一个周期性方波:周期性拓展后,画出来的脉冲图,不知道为什么在0~1s的区间内只有1...

weixin_33288893的博客 4742

XianYuAutoDeliveryX:基于闲鱼API与大模型的智能自动发货系统实践

本文详细介绍了如何利用XianYuAutoDeliveryX系统,结合闲鱼API与大语言模型,构建一个智能自动发货解决方案。该系统能实现买家付款后秒级自动发货,并通过对接ChatGPT等大模型智能回复买家咨询,有效解放卖家时间,提升虚拟商品店铺的运营效率和客户体验。

bush的博客 1015

HTML5网页基础设计——课程介绍专栏

案例: 参考代码: <!doctype html> <html> <head> <meta charset="utf-8"> <title>动手实践</title> <style> *{ margin: 0; padding: 0; font-size:14px; } dd{ width: 461px; height: 145px; margin: -4px; pad.

shengming_tutou的博客 4594

YOLO26 无损剪枝:稀疏训练 + 结构化通道裁剪

YOLO26 无损剪枝链路:YOLO26s (7.2M) → 稀疏训练 30 epoch (L1 on BN gamma, lam=0.01) → 阈值剪枝 50% (gamma<quantile(0.5)) → 结构化重建 Conv+BN → 微调 10 epoch (lr=1e-4) → YOLO26n (1.9M, mAP50 0.808, 仅降 0.6%)。核心贡献:稀疏训练让 BN gamma 趋向二元分布 (近 0 或近 1), 剪枝阈值可直接取 median 自动 50% 压缩。

m0_64661770的博客 263

FOC高频注入量产级C语言实现方案

高频注入技术是无传感器FOC实现零速和低速控制的关键方法,解决了传统反电动势观测器在低速失效的问题。该技术通过向电机注入高频电压信号,利用永磁同步电机凸极性特性,从高频电流响应中解调出转子位置信息。文章详细介绍了三种主流高频注入方法(旋转电压注入、脉振电压注入和脉振电流注入)的原理及实现流程,重点分析了脉振电压注入的信号处理步骤和位置观测器设计。同时提供了完整的C语言实现代码,包括硬件抽象层、核心算法模块(坐标变换、电流环、SVPWM等)和系统集成方案,并给出量产优化建议和安全保护机制。这套方案适用于要求高

汽车软件开发 793

ansys 求解过程中出现未知错误。检查“求解信息”对象上的“求解器输出”,查找可能的原因。-静力学分析遇到的,这是什么原因——An unknown error occurred ——未找到解决方法

点击“确定”关闭弹窗后,进入Workbench的‌“求解信息”对象‌,查看‌“求解器输出”‌,搜索“Error”“Fatal”“Warning”等关键词,找到具体的错误描述,比如材料未定义、网格质量问题、内存不足等,这是精准解决问题的关键。进入“工具-选项-mechanical APDL”,取消勾选“分布式”,GPU加速器选择“none”。在“求解进程设置-高级”中调整内存分配参数,或切换为迭代求解器(如PCG求解器),它更省内存。尝试简化模型,比如删除非关键细节、合并重复部件,分步验证模型,定位问题源。

qq_15963745的博客 603

120、ISP 驱动架构解析:从 V4L2 请求到 ISP 硬件的配置下发流程

本文以实际案例解析ISP驱动架构的V4L2到硬件配置下发流程。作者通过一个因内存共享导致画面闪烁的bug案例,详细剖析了用户空间参数通过V4L2结构体传递、驱动层拆包与硬件寄存器映射、时序同步机制等关键环节。特别强调深拷贝、dirty flag增量更新、shadow register等实现要点,并给出多路并发隔离、寄存器写入失败等典型问题的排查方法。文章建议开发者深入理解参数到寄存器的转换过程,推荐通过debugfs实时监控寄存器状态,避免过度依赖自动调试工具。全文以实践为导向,对ISP驱动开发具有直接指导

sundong_81的博客 159

基于MATLAB自动发电控制(AGC)仿真系统的设计与实现:电力系统频率稳定与功率平衡的深入解析

自动发电控制(AGC)是电力系统运行中的一个关键功能,其主要任务是通过自动调节发电机组的输出功率,使得电网中的频率稳定在规定范围内,并维持发电与负荷的动态平衡。当电力负荷发生变化时,AGC会立即响应,调整发电机的功率输出,以避免电网频率的剧烈波动。维持系统频率稳定:电网频率通常应维持在标准值(例如50Hz或60Hz)附近。当负荷波动或电力需求突然变化时,AGC通过调节发电机输出,确保频率不发生过大的偏离。实现区域内的功率平衡。

qq_38334677的博客 1109

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 什么?学java这么久了,你对“SpringMVC-JSON“真的了解吗?
下一篇: 零基础学java,其实没有那么难!先从java基础之Object类开始吧!
Danny_java
博客等级 码龄5年 9粉丝 64原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值