前言

前段时间发放了学习资料给予自学java的同学们,自学虽好,但是架不住没有老师讲解重侧点(实际上许多培训班的老师也是水分多多,甚至无实战经验),今天我就抽空把java零基础入门(六个月)的学习重点画出来,在不影响达到工作和进阶的前提下删繁就简!去掉不必要的注水内容!

正文

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

那么登录都要哪些实现方式呢?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攻击。

最后

这次要给大家分享总结的东西就是这些了

资料全都放在——***我的学习笔记:大厂面试真题+微服务+MySQL+Java+Redis+算法+网络+Linux+Spring全家桶+JVM+学习笔记图***

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

+Spring全家桶+JVM+学习笔记图](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)***

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

一线互联网架构师筑基必备技能之Java篇,工作感悟相关推荐

  1. 一线互联网架构师筑基必备技能之Java篇,一招彻底弄懂!

    前言 众所周知,Java开发人员的生存环境可谓是与以前大相径庭,以IT行业发展来说,在十几年前的时候,IT行业的技术人才是稀缺的,程序员最初的招聘行情,只要你会敲"holle world&q ...

  2. 互联网寒冬!一线互联网移动架构师筑基必备技能之Java篇,附带学习经验

    Android面试相关整理 最近有一点找工作的打算,想补下面试题.但是发现网上面试相关的文章特别多,不知道从何看起,所以简单的总结了一下我有印象的一些,方便自己随时查看,本想带下个人评价,但有些没有仔 ...

  3. 学了七年Android,连【架构师筑基必备技能】都不知道有什么

    二.成为架构师必备技能 思维脑图 基础知识 Java语言进阶 泛型与注解在Retrofit中的应用 多线程与Java File IO操作应用实战 Rxjava原理分析 JVM与内存泄漏原理解析 Cla ...

  4. 资深架构师成长路线 -- 架构师筑基必备技能

    1.并发编程进阶 线程共享和写作文 CPU核心数,线程数,时间片轮转机制解读 synchronized,volatile,ThreadLocal 如何实现线程共享 wait,notify/nofity ...

  5. JAVA资深架构师成长路线-架构师筑基必备技能-深入Tomcat底层

    文章目录 JAVA资深架构师成长路线大纲 深入Tomcat底层 Tomcat体系架构 Tomcat容器及运行机制 Tomcat类加载机制 Tomcat核心组件 Tomcat优化 Tomcat面试题集 ...

  6. 一线互联网架构师设计思想解读开源框架!全套教学资料

    前言 这段时间也一直在学习Netty相关知识,因为涉及知识点比较多,也走了不少弯路.目前网上关于Netty学习资料玲琅满目,不知如何下手,其实大家都是一样的,学习方法和技巧都是总结出来的,我们在没有找 ...

  7. 大数据架构师+精英必备技能

    (一)架构师技能树 大数据基础巩固(录播) HDFS分布式文件系统 1.HDFS架构设计 2.HDFS设计思想 3.数据块 4.机架感知 5.容错策略 6.数据本地性策略 7.读写流程分析 8.HDF ...

  8. 成为优秀架构师的必备技能

    扎实的基础知识,空余时间多看一些书,设计模式.算法.数据结构.有时间维护自己的博客,一个优秀的架构师要学会分享自己的技术和知识. 1.熟练使用各种框架,并知道它们实现的原理. 2.jvm虚拟机原理.调 ...

  9. 看看华为、阿里大数据架构师的必备技能!

    嘘,我们只偷偷地告诉你一个人! 这个秘密职业就是 数据架构师 在国内大数据行业大概有以下几种岗位:数据架构师.数据分析师.数据挖掘工程师.数据算法工程师和数据产品经理. 接下来我们介绍第二种岗位 让我 ...

最新文章

  1. 前台特效(3) 编辑表格
  2. FFmpeg视频转码技巧之-crf参数(H.264篇)
  3. C++类对象在内存中的布局
  4. 【渝粤题库】国家开放大学2021春2108刑法学(2)题目
  5. VS2019优化新鲜出炉:C++后端更新汇总
  6. HTML复古游戏官网模板
  7. enableEventValidation错误原因分析以及解决办法
  8. python网站设计中接口的作用_python接口自动化(三)--如何设计接口测试用例(详解)...
  9. html的特点有哪些,HTML特点以及HTML中有哪些标签
  10. [知乎]山东:一枚神奇独一的“三棱锥”
  11. uniapp 展示表格并且前端实现分页
  12. Error response from daemon: conflict: unable to delete acdcfe83bcc5 (must be forced) - image is bein
  13. matlab多重心法,多重心法例.ppt
  14. qpython androidhelper gps_Qpython SL4A获取手机电量和GPS
  15. 数据结构初阶之二叉树——概念篇
  16. 亚马逊英国站产品审核要求英国代理人英代办理英国授权代表英代DOC符合性声明
  17. 两个字符串匹配度算法
  18. ubi 详解 以及jffs2 squash fs ubifs
  19. 遥感中的表观反射率、反射率、反照率等之间的区别与联系
  20. Fast multi-language LSTM-based online handwriting recognition 在线手写识别

热门文章

  1. “四大设计原则”在排版中的应用
  2. 如何加入github开源项目!
  3. php+编辑器+显示html,thinkphp——通过在线编辑器添加的内容在模板里正确显示(只显示内容,而不是html代码)...
  4. MySQL数据库搜题_智慧树知到_MySQL数据库设计与应用_搜题公众号
  5. 开源无收入,全职开源仍是少数,企业开源成热门,开发者正在见证开源历史
  6. 我没有机器学习的学位,却拿到了 DeepMind 研究工程师的 Offer
  7. Rust跨界前端全攻略
  8. 互联网为什么需要“黑客”?
  9. 一文读懂 KMP 算法 | 原力计划
  10. 无代码来了,还要程序员吗?