Java web学习路径预览
(图源:黑马程序员)
目录
Java web学习路径预览
一、HTML、CSS、JS
1. HTML (HyperText Markup Language): 网页的骨架
2. CSS (Cascading Style Sheets): 网页的皮肤
3. JavaScript (JS): 网页的行为
二、Ajax、Axios
1. Ajax(Asynchronous JavaScript and XML)
2. Axios(基于 Promise 的 HTTP 客户端)
三、Vue、Element
1.Vue.js(Vue)
a、什么是Vue.js?
b、Vue的核心特点:
c、Vue的基本概念
2.Element(Element UI)
a、什么是 Element UI?
b、为什么使用 Element?
四、前端工程化(Vue脚手架)
1、 什么是前端工程化?
2、 前端工程化的核心内容
3、Vue 脚手架(Vue CLI)
a. 什么是 Vue CLI?
b. Vue CLI 的核心功能
五、Maven
1、Maven 在 Java Web 开发中的作用
依赖管理:
项目构建:
项目结构:
Web 应用打包:
2、Maven 在 Java Web 开发中的常用配置
依赖作用域(Dependency Scope):
仓库配置(Repository):
插件配置(Plugin):
六、SpringBoot
1、什么是 Spring Boot?
2、Spring Boot 的核心特性
自动配置(Auto-Configuration):
起步依赖(Starter Dependencies):
内嵌服务器(Embedded Servers):
命令行接口(Spring Boot CLI):
Actuator:
3、Spring Boot 的优势
七、MySQL
1、MySQL简介
2、MySQL的基本概念
八、JDBC、Mybatis
1、JDBC(Java Database Connectivity)
a. 什么是JDBC?
b. 作用和特点
2、MyBatis(半自动化持久层框架)
a. 什么是MyBatis?
b. 主要特点
c. MyBatis的工作流程
3、SQL
a、什么是SQL?
b、SQL的核心概念
c、SQL的主要类型和作用
九、会话跟踪技术(Cookie、Session、令牌技术(JWT))
1、会话跟踪概述
a. 什么是会话跟踪?
b. 为什么要进行会话跟踪?
c. 主要的会话跟踪技术
2、Cookie
a. 什么是Cookie?
b. Cookie的工作原理
c. Cookie的特点
d. Cookie的缺点
f. 使用场景
3、Session
a. 什么是Session?
b. Session的工作原理
c. Session的特点
d. Session的缺点
e. 使用场景
4、令牌技术(Token),以 JWT 为例
a. 什么是令牌(Token)?
b. JWT(JSON Web Token)的原理
c. JWT的工作流程
d. JWT的特点
f. JWT的缺点
g. 使用场景
十、Filter、Interceptor(令牌的统一拦截校验)
1、什么是Filter和Interceptor?
a. 过滤器(Filter)
b. 拦截器(Interceptor)
2、Filter和Interceptor的对比
3、在令牌(Token)校验中的作用
十一、AOP
1、什么是AOP(面向切面编程)?
a. 定义
b. 核心思想
2、为什么需要AOP 在Java Web中?
3、AOP的核心概念
4、AOP的实现方式
a. 代理实现
b. 非代理实现
c. 框架支持
5、在Java Web中的AOP应用场景
一、HTML、CSS、JS
1. HTML (HyperText Markup Language): 网页的骨架
-
定义: HTML 是一种标记语言,用于创建网页的结构和内容。可以把它想象成盖房子时的骨架。
-
作用:
-
定义网页结构: 使用各种标签(tag)来组织网页的各个部分,例如标题、段落、列表、链接、图像等。
-
描述内容: 告诉浏览器网页上应该显示什么内容,例如文本、图片、视频等。
-
创建链接: 使用
<a>
标签创建超链接,将网页连接到其他网页或资源。
-
-
基本语法:
-
HTML 文档由一系列嵌套的标签组成。
-
标签通常成对出现,包含开始标签和结束标签,例如
<p>这是一个段落</p>
。 -
有些标签是自闭合标签,例如
<img src="image.jpg" />
。 -
标签可以拥有属性,用于提供关于元素的额外信息,例如
<a href="https://www.example.com">链接</a>
。
-
2. CSS (Cascading Style Sheets): 网页的皮肤
-
定义: CSS 是一种样式表语言,用于控制网页的视觉外观和布局。可以把它想象成房子的装修。
-
作用:
-
控制颜色、字体、大小、间距等: 定义网页元素的样式,使其更美观。
-
控制布局: 控制网页元素的排列方式和位置,使其更易于阅读和导航。
-
实现响应式设计: 根据不同设备(例如电脑、手机、平板电脑)的屏幕尺寸调整网页的布局和样式。
-
-
基本语法:
-
CSS 规则由选择器和声明块组成。
-
选择器用于选择要应用样式的 HTML 元素。
-
声明块包含一个或多个声明,每个声明由属性和值组成,例如
color: blue;
。
-
-
三种引入方式:
-
内联样式: 直接在 HTML 标签中使用
style
属性,例如<p style="color: red;">这是一个红色段落</p>
。 (不推荐,不利于维护) -
内部样式表: 在 HTML 文档的
<head>
标签中使用<style>
标签,例如<style>p { color: blue; }</style>
。 (适用于小型项目) -
外部样式表: 将 CSS 规则保存在单独的
.css
文件中,然后在 HTML 文档中使用<link>
标签引入,例如<link rel="stylesheet" href="style.css">
。 (推荐,便于维护和复用)
-
-
常用选择器:
-
元素选择器: 选择所有指定的 HTML 元素,例如
p { ... }
选择所有段落。 -
类选择器: 选择具有指定 class 属性的 HTML 元素,例如
.highlight { ... }
选择所有 class 为 "highlight" 的元素。 -
ID 选择器: 选择具有指定 id 属性的 HTML 元素,例如
#header { ... }
选择 id 为 "header" 的元素。(一个页面只能有一个id) -
属性选择器: 选择具有指定属性的 HTML 元素,例如
a[href] { ... }
选择所有具有 href 属性的链接。 -
后代选择器: 选择指定元素的后代元素,例如
div p { ... }
选择所有在 div 元素内的段落。 -
子元素选择器: 选择指定元素的直接子元素,例如
div > p { ... }
选择所有作为 div 元素直接子元素的段落。
-
3. JavaScript (JS): 网页的行为
-
定义: JavaScript 是一种脚本语言,用于为网页添加交互性和动态效果。可以把它想象成房子里的电器和智能设备。
-
作用:
-
处理用户交互: 响应用户的点击、鼠标移动、键盘输入等事件。
-
修改网页内容: 动态地更新网页的内容,例如显示新的文本、图片、数据等。
-
操作网页样式: 动态地改变网页的样式,例如改变颜色、大小、位置等。
-
与服务器通信: 通过 AJAX 技术与服务器进行数据交互,例如获取数据、提交表单等。
-
创建动画和游戏: 使用 JavaScript 可以创建各种动画和游戏。
-
-
基本语法:
-
JavaScript 是一种解释型语言,不需要编译即可运行。
-
JavaScript 代码可以嵌入到 HTML 文档中,也可以保存在单独的
.js
文件中。 -
JavaScript 使用变量、函数、对象等概念来组织代码。
-
-
引入方式:
-
内部脚本: 在 HTML 文档的
<head>
或<body>
标签中使用<script>
标签,例如<script>alert("Hello, world!");</script>
-
外部脚本: 将 JavaScript 代码保存在单独的
.js
文件中,然后在 HTML 文档中使用<script>
标签引入,例如<script src="script.js"></script>
。 (推荐)
-
-
常用功能:
-
DOM 操作: 通过 JavaScript 可以访问和修改 HTML 文档的结构(Document Object Model)。
-
事件处理: 可以监听和响应各种 HTML 事件,例如
click
、mouseover
、submit
等。 -
AJAX: 可以使用 AJAX 技术与服务器进行异步数据交互。
-
动画: 可以使用 JavaScript 创建各种动画效果。
-
二、Ajax、Axios
1. Ajax(Asynchronous JavaScript and XML)
定义:
Ajax 是一组在网页中实现异步通信的技术(不是一种单一技术)。它允许网页在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。
核心思想:
-
使用 JavaScript 来向服务器发起请求(GET、POST等)
-
服务器处理请求并返回数据(通常是 JSON、XML 或纯文本)
-
JavaScript 接收数据后,动态更新网页部分内容
实现方式:
最常用的方法是通过浏览器内置的 XMLHttpRequest
对象,或者使用现代浏览器中的 fetch
API(虽然 fetch
不是传统的 Ajax,但很类似)。
特点:
-
兼容所有主流浏览器
-
需要更多的代码管理请求和响应
-
灵活但略复杂
2. Axios(基于 Promise 的 HTTP 客户端)
定义:
Axios 是一个基于 Promise 的 JavaScript HTTP 客户端库,可以用来简化 Ajax 请求的过程。它支持浏览器和 Node.js 环境。
为什么推荐使用 Axios:
-
API 简洁、易用
-
具有自动转换 JSON 数据的功能
-
支持请求和响应拦截器
-
支持请求取消
-
更好地处理错误和超时控制
-
支持老旧浏览器(通过 polyfill)
优点:
-
API 简洁易懂
-
内部封装了很多底层细节
-
支持请求拦截和响应拦截,方便统一处理请求参数和返回数据
-
自动处理 JSON 转换
-
支持取消请求、超时控制等高级功能
特性 | Ajax ( | Axios |
易用性 | 相对较复杂,需要手动处理 Promise 或回调 | 简洁、易用的 API,基于 Promise |
支持情况 | 所有现代浏览器,但少一些高级功能 | 支持所有主流浏览器和环境,功能更丰富 |
内部处理 | 需要自己处理数据转换(如 JSON.parse) | 自动转换 JSON,处理方便 |
拦截器 | 需要自己实现回调函数 | 支持请求/响应拦截器 |
取消请求 | 需要自己实现(例如使用 AbortController) | 原生支持请求取消 |
代码量 | 稍多一些(尤其是 XMLHttpRequest) | 简洁很多 |
三、Vue、Element
1.Vue.js(Vue)
a、什么是Vue.js?
Vue.js,简称Vue,是一个渐进式的JavaScript框架,用于构建用户界面和单页面应用(SPA)。由尤雨溪(Evan You)于2014年开发,经过不断优化,已成为最受欢迎的前端框架之一。
b、Vue的核心特点:
-
渐进式框架:可以逐步采用,比如从引入库开始使用其数据绑定和组件系统,然后逐步扩展到复杂的应用。
-
响应式数据绑定:Vue 通过数据变化自动更新视图,无需手动操作 DOM。
-
组件化开发:把界面拆分成可复用的组件,提升开发效率和维护性。
-
简洁的模板语法:使用 HTML 风格的模板语法,便于理解和书写。
-
虚拟DOM:借助虚拟DOM实现高效的页面渲染。
-
丰富的生态系统:如 Vue Router(路由管理)、Vuex(状态管理)、Vue CLI(脚手架工具)等。
c、Vue的基本概念
-
实例(Vue Instance):每个 Vue 应用都是通过
new Vue()
创建的实例。 -
模板(Template):定义 HTML 结构,支持数据绑定。
-
数据(Data):存放页面中需要动态变化的内容。
-
指令(Directives):特殊的属性,用来绑定数据或绑定事件(如
v-if
,v-for
,v-model
等)。 -
组件(Components):封装可复用的UI块。
2.Element(Element UI)
a、什么是 Element UI?
Element 是一款基于 Vue 2.x 的桌面端UI组件库,提供丰富、多样的UI组件,方便开发者快速搭建美观的后台管理界面。
-
由饿了么(Eleme)团队开发
-
提供按钮、表格、弹框、导航、表单等常用组件
-
设计风格简洁现代,易用且企业级
b、为什么使用 Element?
-
快速构建界面:众多预设好样式和功能的组件
-
组件丰富:支持大部分后台常用界面元素
-
易于扩展和定制:可以实现个性化风格
-
与 Vue 结合紧密,开发体验良好
技术/工具 | 作用 | 说明 |
Vue.js | 构建响应式、组件化的前端用户界面 | 轻量、易学、官方生态完善,适合单页面应用开发 |
Element UI | 基于 Vue 的UI组件库,提供丰富的界面组件 | 架构企业后台界面,快速搭建漂亮、功能齐全的后台管理系统 |
四、前端工程化(Vue脚手架)
1、 什么是前端工程化?
前端工程化是指利用软件工程的原则和方法,结合前端开发的特点,构建高效、可维护和可扩展的前端应用的过程。它解决的是传统 Web 开发中存在的问题:
-
代码组织混乱
-
依赖管理困难
-
构建部署繁琐
-
缺乏自动化测试
2、 前端工程化的核心内容
-
模块化(Modules):将代码分割成小的、独立的模块,便于复用和维护。
-
组件化(Components):将 UI 拆分成独立的、可复用的组件,提高开发效率。
-
规范化(Standards):统一代码风格、提交规范,提高团队协作效率。
-
自动化(Automation):自动化构建、测试、部署,减少人工干预和出错。
-
性能优化(Performance Optimization):从代码层面、构建层面、部署层面进行优化,提高应用加载速度和用户体验。
3、Vue 脚手架(Vue CLI)
a. 什么是 Vue CLI?
Vue CLI (Command Line Interface) 是一个官方提供的 Vue.js 项目脚手架,用于快速搭建 Vue 项目。它集成了 Webpack、Babel、ESLint 等工具,提供了一套完整的项目开发流程。
b. Vue CLI 的核心功能
-
项目初始化:快速创建 Vue 项目,包含预配置好的开发环境。
-
插件机制:通过插件扩展项目功能,如添加 Vue Router、Vuex、TypeScript 支持等。
-
图形化界面:提供图形化管理界面,方便项目配置和依赖管理。
-
热重载(Hot Reloading):在代码修改时,自动刷新页面,提高开发效率。
-
构建优化:自动优化代码,如代码压缩、代码分割、tree shaking 等,提高应用性能。
五、Maven
1、Maven 在 Java Web 开发中的作用
在 Java Web 开发中,Maven 扮演着至关重要的角色,主要体现在以下几个方面:
-
依赖管理:
-
Java Web 项目通常依赖大量的第三方库(如 Spring、Hibernate、Servlet API 等)。
-
Maven 可以方便地声明这些依赖,自动从中央仓库或私有仓库下载所需的 JAR 包,并管理依赖的版本冲突。
-
避免了手动下载和管理 JAR 包的繁琐过程,大大简化了依赖管理。
-
-
项目构建:
-
Maven 提供了一套标准的项目构建流程,包括编译、测试、打包、部署等阶段。
-
通过简单的命令,可以自动化完成这些构建任务,无需手动编写构建脚本。
-
保证了构建的一致性和可重复性。
-
-
项目结构:
-
Maven 约定了一套标准的项目目录结构,便于统一管理项目资源。
-
例如,源代码放在
src/main/java
目录下,测试代码放在src/test/java
目录下,Web 资源放在src/main/webapp
目录下。 -
这种规范化的结构有助于团队协作和项目维护。
-
-
Web 应用打包:
-
Maven 可以将 Java Web 项目打包成 WAR (Web Application Archive) 文件,便于部署到 Web 服务器(如 Tomcat、Jetty)。
-
WAR 文件包含了 Web 应用的所有资源,如 Servlet、JSP、HTML、CSS、JavaScript 等。
-
2、Maven 在 Java Web 开发中的常用配置
-
依赖作用域(Dependency Scope):
依赖作用域用于指定依赖的有效范围。常用的作用域有:
-
compile
:默认作用域,表示编译、测试、运行都有效。 -
test
:只在测试时有效。 -
provided
:编译和测试有效,运行时由容器提供(如 Servlet API)。 -
runtime
:编译时无效,运行时有效(如 JDBC 驱动)。
-
-
仓库配置(Repository):
-
Maven 默认从中央仓库下载依赖。
-
可以配置远程仓库,从其他仓库下载依赖。
-
-
插件配置(Plugin):
-
Maven 插件用于执行各种构建任务。
-
可以配置插件的版本、参数等。
-
六、SpringBoot
1、什么是 Spring Boot?
Spring Boot 是一个基于 Spring 框架的快速开发应用框架,它简化了 Spring 应用的初始搭建和开发过程。Spring Boot 采用约定大于配置的理念,通过自动配置、内嵌服务器等方式,使得开发者可以更加专注于业务逻辑的开发,而无需过多关注繁琐的配置。
2、Spring Boot 的核心特性
-
自动配置(Auto-Configuration):
-
Spring Boot 能够根据项目中的依赖,自动配置 Spring 应用所需的各种组件。
-
开发者无需手动配置大量的 Bean,只需引入相应的依赖即可。
-
自动配置基于
@EnableAutoConfiguration
注解实现。
-
-
起步依赖(Starter Dependencies):
-
Spring Boot 提供了一系列的起步依赖,简化了项目依赖的管理。
-
起步依赖本质上是一组相关的依赖的集合,可以一键引入常用的依赖组合。
-
例如,
spring-boot-starter-web
包含了开发 Web 应用所需的常用依赖,如 Spring MVC、Tomcat 等。
-
-
内嵌服务器(Embedded Servers):
-
Spring Boot 可以将应用打包成可执行的 JAR 文件,并内嵌 Tomcat、Jetty 等 Web 服务器。
-
开发者无需手动安装和配置 Web 服务器,可以直接运行 JAR 文件启动应用。
-
-
命令行接口(Spring Boot CLI):
-
Spring Boot CLI (Command Line Interface) 是一个命令行工具,可以快速创建 Spring Boot 项目、运行 Groovy 脚本等。
-
可以使用
spring
命令来创建项目、运行应用。
-
-
Actuator:
a.Spring Boot Actuator 提供了一系列的端点(Endpoints),用于监控和管理 Spring Boot 应用。
b.可以通过 Actuator 端点查看应用的健康状况、配置信息、指标数据等。
3、Spring Boot 的优势
简化配置:Spring Boot 采用约定大于配置的理念,大大简化了 Spring 应用的配置。
快速开发:Spring Boot 提供了自动配置、起步依赖等特性,可以快速搭建 Spring 应用。
易于部署:Spring Boot 可以将应用打包成可执行的 JAR 文件,方便部署到各种环境。
监控管理:Spring Boot Actuator 提供了丰富的端点,用于监控和管理 Spring Boot 应用。
七、MySQL
1、MySQL简介
MySQL是一款开源的关系型数据库管理系统(RDBMS),由Oracle公司维护。它以其高性能、易用性和广泛应用在Web开发中而著称,是Java Web开发中最常用的数据库之一。
主要特点:
-
支持SQL标准
-
高性能和高可靠性
-
支持事务管理
-
丰富的存储引擎(InnoDB、MyISAM等)
-
可以与多种编程语言集成(Java、PHP、Python等)
2、MySQL的基本概念
-
数据库(Database):存放一组相关联的数据集合(类似一个文件夹)
-
表(Table):数据库中的数据存储单位,类似Excel中的表格
-
行(Row):表中的一条完整记录
-
列(Column):表中的一个字段,定义数据的属性
-
主键(Primary Key):唯一标识一条记录
-
外键(Foreign Key):关联其他表的主键,实现数据关联
八、JDBC、Mybatis
1、JDBC(Java Database Connectivity)
a. 什么是JDBC?
JDBC(Java Database Connectivity)是Java提供的统一数据库访问接口标准。它允许Java程序连接各种关系型数据库(如MySQL、Oracle、SQL Server等),执行SQL语句并处理结果。
b. 作用和特点
-
作用:实现Java程序与数据库之间的通信
-
特点:
-
依赖数据库的JDBC驱动
-
提供标准的API
-
支持连接管理、执行SQL、检索结果
-
需要手动编写SQL、处理ResultSet、管理事务等
-
2、MyBatis(半自动化持久层框架)
a. 什么是MyBatis?
MyBatis 是一个优秀的数据持久层(ORM)框架,避免繁琐的JDBC编码,通过映射文件(XML或注解)将SQL语句和Java对象关联起来,让开发者更加专注于SQL的书写和逻辑实现。
b. 主要特点
-
SQL映射:开发者自己编写模板化的SQL语句
-
轻量级:没有复杂的对象关系映射(相比Hibernate),更灵活
-
支持动态SQL:通过XML或注解支持复杂条件,避免硬编码
-
与Spring等框架兼容性好
-
良好的扩展性和可维护性
c. MyBatis的工作流程
-
定义Java实体类(POJO)
-
编写映射文件(XML配置),定义SQL语句和映射关系
-
创建SqlSession,通过映射接口调用SQL执行
-
获取结果映射为Java对象
特性 | JDBC | MyBatis |
简介 | Java原生数据库API | 半自动ORM框架,封装JDBC操作 |
SQL编写方式 | 由开发者手动编写SQL | SQL由开发者自己写在XML或注解中 |
易用性 | 低,繁琐,需手动管理连接和资源 | 高,封装JDBC细节,减少重复代码 |
灵活性 | 高,完全控制SQL和执行流程 | 灵活,支持动态SQL,便于维护 |
配置复杂度 | 低,但开发效率低 | 需要配置映射文件和MyBatis配置,略复杂 |
性能 | 高,但开发效率低 | 取决于SQL写法和配置,使用预编译,性能不错 |
3、SQL
a、什么是SQL?
SQL(Structured Query Language)是一种用于管理关系型数据库的标准化查询语言。它被设计用来操作和管理存储在关系数据库中的数据,包括数据的查询、插入、更新、删除以及数据库结构的定义和管理。
特点:
-
声明式语言:描述“做什么”而非“怎么做”
-
标准化:由ANSI(美国国家标准协会)制定,被广泛支持
-
用途广泛:适用于各种关系型数据库系统,如MySQL、PostgreSQL、Oracle、SQL Server等
b、SQL的核心概念
(1). 数据库(Database)
存放一组相关数据的集合。
(2). 表(Table)
关系数据库中的基本存储单位,类似一个二维表格。
(3). 行(Row)
表中的一条记录。
(4). 列(Column)
表中的字段,定义数据类型和属性。
(5). 主键(Primary Key)
唯一标识一条记录。
(6). 外键(Foreign Key)
用于关联其他表的主键,实现表间关系。
c、SQL的主要类型和作用
类型 | 作用 | 例子 |
---|---|---|
数据定义语言(DDL) | 定义数据库结构(创建、修改、删除) | CREATE、ALTER、DROP |
数据操作语言(DML) | 操作数据(插入、更新、删除、查询) | INSERT、UPDATE、DELETE、SELECT |
数据控制语言(DCL) | 控制访问权限和事务管理 | GRANT、REVOKE、COMMIT、ROLLBACK |
数据查询语言(DQL) | 查询数据 | SELECT |
九、会话跟踪技术(Cookie、Session、令牌技术(JWT))
1、会话跟踪概述
a. 什么是会话跟踪?
会话跟踪指的是在 Web 应用程序中,服务器能够识别并维护用户的一系列请求(一个“会话”)。HTTP 协议是无状态的,这意味着每次请求都是独立的。因此,我们需要一些技术来识别用户的身份,并在多次请求之间记住用户的状态信息,例如登录状态、购物车内容等。
b. 为什么要进行会话跟踪?
-
用户身份验证:判断用户是否已登录。
-
状态保持:保持用户的个性化设置、购物车信息等。
-
用户行为分析:跟踪用户在网站上的行为。
c. 主要的会话跟踪技术
-
Cookie
-
Session
-
令牌(Token):例如 JWT(JSON Web Token)
2、Cookie
a. 什么是Cookie?
Cookie 是一种存储在用户浏览器上的小型文本文件。当用户访问某个网站时,服务器可以设置 Cookie,并将其发送给浏览器保存。之后,用户每次向该网站发送请求时,浏览器会自动将该 Cookie 附加到请求头中,以便服务器识别用户。
b. Cookie的工作原理
-
服务器通过 HTTP 响应头 Set-Cookie 设置 Cookie。
-
浏览器接收到 Set-Cookie 后,将 Cookie 保存在本地。
-
下次浏览器向相同域名发送请求时,会自动将 Cookie 通过 HTTP 请求头 Cookie 发送给服务器。
c. Cookie的特点
-
存储在客户端:因此大小和数量受到限制
-
简单易用:在服务器端和客户端都有现成的API
-
明文存储:安全性较差,易被篡改和窃取
-
可以设置过期时间:决定 Cookie 的生命周期
d. Cookie的缺点
-
安全性问题:易被窃取和篡改(可以通过HTTPS和HttpOnly属性提高安全性)
-
大小限制:通常限制在4KB左右
-
数量限制:每个域名下的 Cookie 数量有限制
-
隐私问题:可能被用于用户跟踪
f. 使用场景
-
记住用户登录状态(不推荐,安全性差)
-
存储用户的个性化设置
-
简单的会话跟踪
3、Session
a. 什么是Session?
Session 是一种将会话数据存储在服务器端的技术。当用户首次访问网站时,服务器会创建一个 Session 对象,并为该 Session 分配一个唯一的 Session ID。然后,服务器会将该 Session ID 通过 Cookie 发送给浏览器保存。之后,用户每次向服务器发送请求时,浏览器会自动将 Session ID 通过 Cookie 发送给服务器,以便服务器查找对应的 Session 对象,从而识别用户。
b. Session的工作原理
-
用户首次访问时,服务器创建 Session 对象,并生成 Session ID。
-
服务器将 Session ID 通过 Set-Cookie 发送到客户端浏览器。
-
浏览器保存 Session ID Cookie。
-
之后,浏览器每次发送请求时,都将 Session ID Cookie 附带在请求头中。
-
服务器接收到 Session ID 后,查找对应的 Session 对象。
c. Session的特点
-
数据存储在服务器端:更安全,存储容量更大
-
依赖Cookie:需要使用 Cookie 存储 Session ID
-
更安全:敏感信息存储在服务器端
-
可以设置超时时间:Session 在一段时间不活动后会自动失效
-
服务器资源消耗:每个Session会占用服务器的存储空间
d. Session的缺点
-
依赖Cookie:如果客户端禁用了 Cookie ,Session 将无法正常工作(可以使用 URL 重写解决)
-
服务器压力:每个 Session 都会占用服务器的存储空间
-
分布式 Session 问题:在分布式系统中,需要解决 Session 共享和同步的问题(例如使用 Redis 或 Memcached 存储 Session)
-
Session 过期问题:长时间不活动的 Session 会过期
e. 使用场景
-
用户登录状态管理
-
存储用户的购物车信息
-
存储用户的其他会话数据
4、令牌技术(Token),以 JWT 为例
a. 什么是令牌(Token)?
令牌是一种用于身份验证和授权的字符串。与 Session 不同,令牌不需要服务器存储状态信息。当用户登录成功后,服务器会颁发一个令牌给客户端。之后,客户端每次请求都需要携带该令牌,服务器通过验证令牌的有效性来确定用户的身份。
b. JWT(JSON Web Token)的原理
JWT (JSON Web Token) 是一种常见的令牌格式。它是一个自包含的 JSON 对象,包含了用户的身份信息和权限信息。JWT 通过数字签名进行保护,可以防止篡改。JWT 的结构如下:
Header.Payload.Signature
-
Header:包含令牌类型和签名算法。
-
Payload:包含用户的身份信息(例如用户ID、用户名)和一些自定义声明。
-
Signature:通过 Header 中指定的签名算法对 Header 和 Payload 进行签名,防止篡改。
c. JWT的工作流程
-
用户登录成功后,服务器创建 JWT,并将其发送给客户端。
-
客户端将 JWT 保存在本地(例如 localStorage 或 Cookie)。
-
之后,客户端每次发送请求时,都将 JWT 附带在请求头中(通常是 Authorization 头部)。
-
服务器接收到 JWT 后,验证其有效性(例如验证签名、检查过期时间)。
-
如果 JWT 有效,则认为用户已登录,并根据 JWT 中的信息进行授权。
d. JWT的特点
-
无状态:服务器不需要存储 Session 信息,减轻服务器压力
-
自包含:JWT 包含了用户的身份信息和权限信息
-
可扩展:可以自定义 Payload 中的信息
-
跨域支持:JWT 可以用于跨域身份验证
-
安全性:依赖于签名算法的强度,需要妥善保管密钥
f. JWT的缺点
-
安全性问题:
-
如果密钥泄露,所有 JWT 都可能被伪造
-
JWT 不适合存储敏感信息(因为 Payload 是可解码的)
-
签名算法强度需要足够高
-
-
令牌撤销问题:
-
一旦 JWT 被颁发,就无法主动撤销(除非在服务器端维护一个黑名单)
-
通常需要设置较短的过期时间(例如几分钟或几小时)
-
g. 使用场景
-
API 身份验证:适用于 RESTful API 的身份验证
-
单点登录(SSO):多个应用程序共享同一身份验证服务
-
微服务架构:服务之间的安全通信
特性 | Cookie | Session | JWT |
---|---|---|---|
存储位置 | 客户端 | 服务器端 | 客户端 |
安全性 | 较差 | 较高 | 较高(依赖于签名算法强度) |
依赖性 | 无 | 依赖 Cookie | 无 |
状态 | 无状态 | 有状态 | 无状态 |
适用场景 | 存储少量非敏感信息,简单会话跟踪 | 用户登录,存储会话数据 | API 身份验证,单点登录 |
缺点 | 安全性差,大小和数量限制 | 依赖 Cookie,服务器压力,分布式 Session 问题 | 密钥管理,令牌撤销问题 |
十、Filter、Interceptor(令牌的统一拦截校验)
1、什么是Filter和Interceptor?
a. 过滤器(Filter)
-
Java EE规范定义的,属于Servlet规范的一部分。
-
作用:对请求和响应进行预处理或后处理。
-
特点:运行在Servlet容器中,责任范围广泛;可配置在web.xml中或使用注解。
-
常用于:统一字符编码设置、安全校验(如token验证)、日志记录、请求统计等。
示意图:
Client -> Filter -> Servlet/Controller -> Filter -> Response
b. 拦截器(Interceptor)
-
常见于Spring MVC框架,是框架级别提供的机制。
-
作用:在请求到达Controller之前(或之后)进行拦截和处理。
-
特点:更紧密集成于框架内,提供更强大、更灵活的请求拦截能力。
示意图:
Client -> Interceptor -> Controller -> Interceptor -> Response
2、Filter和Interceptor的对比
方面 | Filter | Interceptor |
---|---|---|
位置 | 在Servlet层 | 在Spring MVC框架中的请求处理流程中 |
实现方式 | 实现 | 实现 |
配置方式 | web.xml配置或注解 | Spring配置类或注解 |
作用范围 | Web应用中全局或特定路径请求 | Spring MVC中的Controller请求 |
灵活性 | 较低,功能比较单一 | 更灵活,支持请求参数、模型绑定等操作 |
3、在令牌(Token)校验中的作用
通常,令牌校验(如JWT)要求:
-
每个请求都携带有效的令牌(通常在请求头Authorization中)
-
服务器验证令牌的有效性和合法性
-
无效或缺失的令牌拒绝访问(返回401 Unauthorized)
为了统一管理这一机制,你可以在Filter或Interceptor中实现:
-
解析请求的Token
-
验证Token的有效性
-
根据验证结果决定放行或拦截
优势:
-
代码集中,避免多处写验证逻辑
-
易于维护和扩展
-
有条件实现自动刷新Token、日志记录等功能
十一、AOP
1、什么是AOP(面向切面编程)?
a. 定义
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它通过将横切关注点(Cross-cutting Concerns)从业务逻辑中抽离出来,封装成“切面(Aspect)”,实现业务代码的模块化,提高代码的可维护性、复用性和清晰度。
b. 核心思想
-
将横切关注点(如日志、多事务、安全、性能监控、权限验证等)单独抽离出来,不散布在所有业务逻辑代码中。
-
使用切面(Aspect)定义这些横切点(Join Points)上需要执行的代码(Advice)。
-
通过配置切点(Pointcuts)确定在哪些连接点(Join Points)切入Advice。
2、为什么需要AOP 在Java Web中?
-
分离关注点:把日志记录、权限验证、事务管理等横切逻辑与业务逻辑解耦,让代码更清晰。
-
统一管理:集中管理如日志、事务等的切面,改动一次即可应用到所有相关代码。
-
增强功能:无需修改现有代码,也能动态增强功能。
-
优化开发效率:减少重复代码,保持业务逻辑纯粹。
3、AOP的核心概念
概念 | 说明 |
---|---|
切面(Aspect) | 定义横切关注点的模块,包含Advice和Pointcut,类似于“通知”或“增强”。 |
连接点(Join Point) | 在程序执行过程中可以插入切面的点,比如方法调用、异常抛出等。 |
切点(Pointcut) | 指定在哪些连接点上应用切面(或Advice),定义匹配表达式。 |
通知(Advice) | 具体在切点处执行的代码,比如前置通知、后置通知、环绕通知、异常通知等。 |
目标对象(Target Object) | 被增强的对象或类,切面会在目标对象上应用。 |
增强(Aspect) | 通常由切面(Aspect)和Advice组成,定义了切入点和增强逻辑。 |
4、AOP的实现方式
a. 代理实现
-
JDK 动态代理:只对实现了接口的类进行代理,性能开销较低
-
CGLIB字节码生成:对没有接口的类进行代理(Spring默认使用此方式)
b. 非代理实现
-
直接在代码中嵌入切面逻辑(较少使用,违背了AOP思想)
c. 框架支持
-
Spring AOP:基于代理,支持声明式AOP,配置简便
-
AspectJ:强大的AOP框架,支持编译时织入(LTW)、加载时织入(LWT)和运行时织入(RTW)
5、在Java Web中的AOP应用场景
-
日志记录:请求日志、方法调用日志
-
权限校验:校验用户是否有权限访问某资源
-
性能监控:统计方法执行时间
-
事务管理:保证业务操作的原子性
-
异常处理:统一异常捕获和处理
-
请求统计:记录请求次数、来源等信息