Java开发者出路在哪?牛皮轰轰

2023-05-16

正文

先问小伙伴们一个问题,登录难吗?“登录有什么难得?输入用户名和密码,后台检索出来,校验一下不就行了。”凡是这样回答的小伙伴,你明显就是产品思维,登录看似简单,用户名和密码,后台校验一下,完事了。但是,登录这个过程涵盖的知识点是非常多的,绝不是检索数据,校验一下这么简单的事。

那么登录都要哪些实现方式呢?i最传统的就要是Cookie-Session这种方式了,最早的登录方式都是这样实现的。但是随着手机端、H5端的兴起,前后端分离的模式越来越流行,基于Cookie-Session这种登录方式不是很方便,渐渐的JTW开始流行,现在大部分项目的登录方式都是基于JWT的了。那么Cookie和JWT都是怎样实现登录的呢?这两种方式有什么区别呢?我们在做登录的x时候该怎么选择呢?咱们先看看这两种方式的原理。

Cookie方式

因为Http协议是无状态的,我们后台的服务(如Tomcat)在接收到前端发送过来的Http请求时,是区分不出哪个请求是谁发出的,这和我们的登录功能是相违背的,登录的功能就是要区分每一个请求是由哪个用户发出的,这就变成了有状态,那怎么办呢?Cookie应运而生,Cookie是存储在浏览器端的,在Cookie中存储的内容是键值对,也就是name-value。浏览器在向后台发送请求的时候,会把Cookie放在请求头中,传送给后台的服务,后台的服务会从请求头中取到Cookie,再从Cookie中取出键值对中jsessionid对应的值。这个jsessionid的值就是你这次会话的id,对应着服务端的一个session。

好了,到这里session这个概念出来了,session是什么呢?session是存储在服务端的,每一个会话对应服务中的一个session。咱们可以把session理解为一个Map,它的key存储的session的id,value存储的东西就随便了,我们在写程序时想存啥就存啥。它的key存储的值就是Cookie中存储的jsessionid的值,这样,浏览器发送请求到后台服务,后台才能根据Cookie中的jsessionid取到对应的session,再从session中取到之前存储的状态,如存储在session中的登录状态、用户id等。Cookie-Session机制是通用的,所有的浏览器都支持Cookie,就连最低端的IE都支持,你说他普遍不普遍。Session是后端容器必须支持的,如Tomcat,还有像其他的如Resin、jetty等。这些对开发人员都是透明的,无需过多关注。

Cookie-Session的由来给大家说完了,我们看看基于Cookie这种方式的登录流程,

  • 用户在浏览器输入用户名、密码,点击登录,发送请求到后台服务;
  • 后台服务校验用户名、密码,将登录状态状态和用户id存储在session中;
  • 将session的id存储在Cookie中,通过响应头返回到浏览器;
  • 当用户点击其他功能时,向后台发送的请求中会自动带上Cookie;
  • 后台通过Cookie中的jsessionid找到对应的session,开发人员可从session中取出当前会话的登录状态和用户id。

基于Cookie-Session机制的登录实现方式的整体流程就是这个样子。看上去很完美,但还是存在不少问题的,我们来看看这些问题。

分布式会话

上面的示例,我们的后台服务只有一个,一个服务往往很难支撑服务,为了保障可靠性,最少都是部署两个后台服务。但是当部署多个后台服务时,我们的session就会出现问题,看看下面的图,

  • 假如用户登录的请求,分配到了后台服务1,后台服务1的session存了用户的登录状态和用户id。
  • 用户在点击其他功能时,请求分配到了后台服务2,可是后台服务2的session并没有存储登录状态和用户id。

我们怎么解决这个问题呢?其实也很简单,第一,session集中管理,比如使用Redis;第二,所有的后台服务在获取session时,统一从Redis中获取。如下所示,

我们可以使用中间件Spring-Session和Redis就可以解决这个问题。

CORS

使用Cookie实现登录的另外一个问题就是跨域,现在往往都采用前后端分离的方式进行开发,在开发的过程中,前端和后端通常不在一个域下,由于浏览器的同源策略,Cookie不能传入到后端。至于同源策略,不明白的小伙伴可以问一下度娘,这里不过多介绍了。要解决这个问题,在前端、后端都要进行设置,在我的另一篇文章《前后端分离|关于登录状态那些事》中有详细的介绍。总体归纳为:

  • 后端设置CORS允许跨域的域名,并且withCredentials设置为true;
  • 前端在向后端发送请求时,也需要设置withCredentials = true;

这样,我们的Cookie就可以实现跨域了。不进行这些设置,Cookie跨域是不可能的,同源策略保证了我们Cookie的安全。

CSRF

CSRF,这个CORS是不一样的,长的比较像,也比较容易混。CSRF往往和系统的安全扯上联系,也是等保测试中比较重要的测试内容,它也是和Cookie有关的,大体的流程是这样的,

  • 用户登录了A网站,并没有退出;
  • 此时,用户又访问了B网站;
  • 在B网站有个隐藏的请求,请求了A网站的一个重要的接口,比如:转账、支付等。
  • 在请求A网站的同时,带上了A网站的Cookie,所以一些危险的操作就成功了。

关于CSRF的攻防,在我前面的文章《CSRF的原理与防御 | 你想不想来一次CSRF攻击?》中有详细的介绍。总之,使用Cookie实现登录是需要重点防范一下CSRF攻击的。

JWT方式

近年来,由于手机端的兴起,前后端分离开发方式的流行,JWT这种登录的实现方式悄然兴起,那么什么是JWT呢?JWT是英文JSON Web Token的缩写,它由3部分组成,

  • header,一般情况下存储两个信息,1类型,一般都是JWT;2加密算法,比如:HMAC、RSA等;
  • payload,这里就存储登录的相关信息了,比如:登录状态、用户id、过期时间等。
  • signature,签名,这个是将header、payload和密钥的信息做一次加密,后台在接收到JWT的时候,一定要验签,谨防JWT的伪造。

下面咱们看看JWT的登录实现,

我们看到整体的流程和Cookie的实现方式是一样的,只不过是没有用到Cookie、Session。那么它与Cookie-Session的区别是什么呢?

  • 登录状态、用户id并没有存储到session,而是存在JWT的payload里,返回给了前端。
  • 在前端JWT不会自动存储到Cookie中,前端开发人员要处理JWT的存储问题,比如LocalStorage
  • 再次发起请求,JWT不会自动放到请求头中,需前端同学手动设置
  • 后端从请求头中取出JWT,验签通过后,拿到登录状态、用户id,不是从session中取

相比Cookie的方式,JWT的方式需要更多的开发工作量。那么其他的问题存在吗?我们一个一个看。

分布式会话

我们后台部署多个服务,会有分布式会话的问题吗?

无论请求被分配到哪一个后台服务中,登录状态和用户id都是从JWT中取出来的,不会出现分布式会话的问题。我们在后台部署集群的时候,根本不用care这个问题。

CORS

Cookie的跨域受到同源策略的保护,不经过特殊的设置,是不能够跨域的。那么JWT呢?JWT是前端同学手动在请求头中设置的,如果向其他的域发送请求要注意,稍不注意,在请求的时候,调用了封装的公共方法,就会把JWT发送给其他域的后台,前端的小伙伴要打起精神啊。

CSRF

Cookie的方式,B访问A网站,会把A的Cookie带上,从而造成了安全隐患。那么JWT呢?JWT在前端存储在A网站的域下,B在访问A网站时,是拿不到A网站的JWT的,那么也不可能在请求头中设置JWT,A网站的后台拿不到JWT,也不会做其他操作。所以,JWT可以很好的防止CSRF攻击。

最后

给大家送一个小福利

资料都是免费分享的,附送高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。点我免费领取!!!

友们。点我免费领取!!!

[外链图片转存中…(img-O4N7KtcX-1624874629979)]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java开发者出路在哪?牛皮轰轰 的相关文章

  • 24届春招百度暑假实习笔试第二题

    题干 解答 该题目在解决的时候 xff0c 需要发现就是对于相同的字符我们应该放在一起 xff0c 这样在进行修改的时候 xff0c 对其他字符的影响才会小 然后连续相同字符个数 和 组成的回文子串数目 它们的通解为 an 61 n 2 4
  • ROS学习(八)launch启动文件的使用方法

    前言 使用命令行输入代码需要不断打开终端比较繁琐 xff0c 而且容易输入错误 xff0c 那么有没有什么方法可以快速启动所需节点呢 xff1f 一 launch文件介绍 Launch文件 xff1a 通过XML文件实现多节点的配置和启动
  • 【git】git lfs

    目录 原理 使用方法 报错记录 certificate signed by unknown authority 原理 项目中的大文件会很占空间 git lfs large file storage 将大文件替换为小指针 当真正需要到这些大文
  • gdb调试应用程序记录

    gdb 调试说明 xff1a 判断程序是否为debug版本 xff1a 方法一 xff1a 命令 xff1a gdb a out 注 xff1a 这里的命令是指在Linux终端下面输入的命令 非debug版本 xff0c 会提示 xff1a
  • 3D打印机硬件驱动-马林固件最新版本2.0.X中文注释(3)marlin 2.0.9.2 截至发稿时间2021年12月16日

    Marlin 3D Printer Firmware 头描述详见其他两个文件头描述 Copyright c 2020 MarlinFirmware https github com MarlinFirmware Marlin Based o
  • 字符串结尾‘\0‘

    C语言中字符串的结束标志是 39 0 39 C语言中没有专门的字符串变量 xff0c 通常用一个字符数组来存放一个字符串 xff0c 字符串总是以 39 0 39 作为结束符 39 0 39 就是8位的00000000 xff0c 因为字符
  • 蒙德里安的梦想 状压 DP

    定义 状压 DP 是动态规划的一种 xff0c 通过将状态压缩为整数来达到优化转移的目的 例题 xff1a 蒙德里安的梦想 求把 N M 的棋盘分割成若干个 1 2 的长方形 xff0c 有多少种方案 例如当 N 61 2 xff0c M
  • Hadoop 核心三大件

    一 Hadoop Distributed File System xff0c 简称 HDFS xff0c 是一个分布式文件系统 二 YARN架构 三 MapReduce架构概述 MapReduce将计算过程分为两个阶段 xff1a Map和
  • 努力加油——感想帖

    一直很想写一篇自己的心路历程 xff0c 这篇文章于2022 10 28午编写 2020年7月10日在高考地理考卷上给自己的中学生涯画上了句号 走出考场那一刻 xff0c 心里像是有一块沉甸甸的石头被放了下来 xff0c 但好像自己并不是很
  • 小国王——状压DP

    在 n n 的棋盘上放 k 个国王 xff0c 国王可攻击相邻的 8 个格子 xff0c 求使它们无法互相攻击的方案总数 输入格式 共一行 xff0c 包含两个整数 n 和 k 输出格式 共一行 xff0c 表示方案总数 xff0c 若不能
  • 小国王(目标状态优化版)—— 状态压缩DP

    在 n n 的棋盘上放 k 个国王 xff0c 国王可攻击相邻的 8 个格子 xff0c 求使它们无法互相攻击的方案总数 输入格式 共一行 xff0c 包含两个整数 n 和 k 输出格式 共一行 xff0c 表示方案总数 xff0c 若不能
  • 炮兵阵地——状态压缩DP

    司令部的将军们打算在 N MN M 的网格地图上部署他们的炮兵部队 一个 N MN M 的地图由 NN 行 MM 列组成 xff0c 地图的每一格可能是山地 xff08 用 H 表示 xff09 xff0c 也可能是平原 xff08 用 P
  • hadoop项目实战——奥运会数据分析

    大三学期项目 hadoop MapReduce 奥运会数据分析结果 xff1a 有没需要详细实现方法的小伙伴呀 xff1f 可以在评论区评论一下 如果人多 xff0c 那么后续会详细更新实现方法
  • RT-Thread 内核线程切换原理

    1 背景 本文章主要说明 rtthread 内核线程是如何切换的 xff0c 初学者刚从裸机开发接触 RTOS 时难免会有些不适应 xff0c 明白这部分原理之后就会对 RTOS 有更深的理解 在学习内核线程切换原理之前需要有以下基础知识铺
  • 【多线程】C/C++语言中多线程和简单例子

    目录 前言 一 pthread两种状态joinable和unjoinable 二 thread join 方法存在的必要性 三 为什么要多线程 xff1a 问题 xff1a 简单的多线程编程 线程的数据处理 四 实例代码 C 43 43 C
  • 单片机开发之裸机也能 “多任务”?

    单片机开发之裸机也能 多任务 xff1f 1 背景 对于一些简单的单片机项目 xff0c 没必要非得跑RTOS xff0c 因此 xff0c 很多项目都是在 裸奔 指纯循环加上中断的机制 所以 xff0c 开发出一套好用的裸机框架是非常有必
  • vscode如何运行C++程序

    首先说一下vscode是一个支持跨平台的轻量级编辑器 1 安装c c 43 43 编译器 Linux系统一般都自带gcc和g 43 43 xff0c 但对于Windows系统而言就需要安装Mingw w64来获得编译器 步骤如下 xff1a
  • TX2 安装显卡驱动

    1 官网查询驱动版本 官方 GeForce 驱动程序 NVIDIA 这个版本gcc不合适 xff0c 换了下一个 又换了一个版本 xff0c 依旧有gcc版本问题 但查了一些资料 xff0c 对照一些版本 xff0c 觉得可能gcc冲突并不
  • 04 ROS Client-Service-Server实例

    零 Service机制 Client与Server向ROS MASTER注册MASTER根据Client订阅的信息 xff0c 查阅注册表中是否有提供对应Service的ServerClient收到Server的TCP通信地址Client用
  • ROS2教程 02 功能包

    一 检查别人的功能包依赖 当移植别人的功能包到本机时 xff0c 需要在工作空间目录下检查功能包依赖是否健全 rosdepc span class token function install span i from path src ro

随机推荐

  • 从零开始学习无人机 00 硬件配置

    遥控器 型号 乐迪Radiolink AT9S Pro 固件更新 对遥控器固件作更新 乐迪Radiolink AT9S Pro 固件更新 光流传感器 型号 思动智能ThoneFlow 3901U 开发文档 Pmw3901光流传感器PX4开发
  • 树莓派ubuntu镜像备份详细教程

    1 获取镜像 将配置好环境的树莓派sd卡放入读卡器将读卡器插入电脑在Windows操作系统上使用软件win32diskimager获取镜像将镜像保存到Linux操作系统上某个位置 xff0c 例如ubuntu22 04 2 减小镜像体积 安
  • Java开发必须会的技能!kafka集群3个节点挂掉一个

    Maven权威指南 首先 xff0c 本书适合所有Java程序员阅读 由于自动化构建 依赖管理等问题并不只存在于Java世界 xff0c 因此非Java程序员也能够从该书中获益 无论你是从未接触过Maven 还是已经用了Maven很长时间
  • 大厂首发!阿里面试官跟我死磕MySQL,Java岗

    前言 蓦然回首自己做开发已经十年了 xff0c 这十年中我获得了很多 xff0c 技术能力 培训 出国 大公司的经历 xff0c 还有很多很好的朋友 但再仔细一想 xff0c 这十年中我至少浪费了五年时间 xff0c 这五年可以足够让自己成
  • C语言和数据结构与算法(99)

    1 预处理和关键字 22道 1 1 宏定义是在编译的哪个阶段处理的 xff1f 答案 xff1a 在编译的预处理阶段 xff0c 被处理的 编译预处理包括 xff1a 宏替换 文件包含 条件编译 其他预处理指令 1 2 写一个 标准 宏定义
  • 【MYSQL】同时查询两个表并将结果合并到一起

    目录 从两个表中查不同字段并拼接到一起 xff08 从两个表中查的字段不一样 xff09 将两个表结果合并 xff08 从两个表中查的字段一样 xff09 SQL多表合并UNION ALL和UNION 从两个表中查不同字段并拼接到一起 xf
  • C语言和数据结构与算法(99)

    2 数据类型 xff08 22道 xff09 2 1 用变量a给出下面的定义 xff08 1 xff09 一个整型数 xff1a int a xff08 2 xff09 一个指向整型数的指针 xff08 一重指针 xff09 xff1a i
  • 详解STL---vector

    目录 1 vector的介绍及应用 1 1vector的介绍 1 2vector的使用 1 2 1 vector的定义 1 2 2 vector iterator 的使用 1 2 3 vector 空间增长问题 1 2 4 vector 的
  • C#中的委托(Delegate)和事件 (Event)详解与使用范例

    一 委托 Delegate 1 委托 Delegate 简介 最近天气晴雨不定 你因为害怕打游戏时忘记在下雨时收衣服或者在天晴时把衣服挂出去 于是你委托好友小明在天气发生变化时打电话通知你 这就是一种委托 下面是这种委托的实例代码 定义一个
  • 学习OpenMV(一)详细参数及简单介绍

    目录 一 Open MV 简介 1 OpenMV摄像头的特点 xff1a 2 OpenMV摄像头的应用 xff1a 3 规格 xff1a 二 搭建环境 xff0c Open MV IDE安装 1 Windows系统 2 Linux系统 三
  • IEEE trans on cybernetic被拒后可以和主编argue争取下吗

    IEEE trans on cybernetic xff1a 一审两个人审稿人 xff0c 主编的决定是reject amp resubmit 二审又增加了一个审稿人 xff0c 前两个审稿人都同意发表的情况下 xff0c 新加的审稿人提了
  • 获取IntelRealSense d435i 相机内参

    获取IntelRealSense d435i 相机内参 摘要实现 摘要 本文提供了一种获取IntelRealSense d435i相机内参的方法 实现 span class token macro property span class t
  • 用Clion代替keil对CubeMX生成代码进行编写的基础准备

    网上教程比较多 首先需要安装CubeMX Clion 以及相关的依赖 xff0c 不一一赘述 xff0c 可以参考以下链接 CLion xff1a 安装 搭建 配置 插件 忘尘 丶莫负的博客 CSDN博客 clion安装插件 在确认搭建好环
  • Ubuntu下如何创建工作空间(详细)

    Ubuntu下工作空间的创建方法 xff1a xff08 1 xff09 mkdir p catkin ws src 创建工作空间catkin ws和子目录src xff0c 自定义空间名 cd catkin ws 进入到工作空间catki
  • Turtlebot移动机器人gazebo仿真及自动导航(详细级)

    目的 在仿真环境中控制Turtlebot3 Burger运动 slam和自动导航 环境 xff1a 双系统下ROS为noetic xff08 其他版本的ROS注意在下载软件包时改成自己的ROS xff09 步骤 xff1a xff08 1
  • 【linux】linux中fork()详解(实例讲解)|fork的运行机制

    目录 linux中fork xff08 xff09 函数详解 从一道面试题谈linux下fork的运行机制 linux中fork xff08 xff09 函数详解 原文 xff1a linux中fork xff08 xff09 函数详解 x
  • 当面试官问你Promise的时候,他究竟想听到什么?

    1 什么是Promise xff1f Promise是异步操作的一种解决方案 2 为什么要使用Promise xff1f Promise能很好的解决层层嵌套的回调函数 xff0c 即回调地狱 callback hell 的问题 3 什么是回
  • win10安装Ubuntu16.04

    第一次安装双系统 xff0c 踩了不少坑 xff0c 花了两三天才装好 xff0c 因为电脑的不同 xff08 本人电脑联想小新i5 xff09 xff0c 网上那些安装过程有些不适用 xff0c 所以花了好长时间 xff0c 甚至差点决定
  • 12道C++经典笔试题及答案(2022)

    目录 一 题目 二 题目以及答案 一 题目 1 C和C 43 43 中的struct有什么区别 2 C 43 43 中的struct和class有什么区别 xff1f 3 如何判断一段程序是由C编译程序还是由C 43 43 编译程序的 xf
  • Java开发者出路在哪?牛皮轰轰

    正文 先问小伙伴们一个问题 xff0c 登录难吗 xff1f 登录有什么难得 xff1f 输入用户名和密码 xff0c 后台检索出来 xff0c 校验一下不就行了 凡是这样回答的小伙伴 xff0c 你明显就是产品思维 xff0c 登录看似简