首页 > 编程语言 >JavaWeb回顾与小结(六)

JavaWeb回顾与小结(六)

时间:2023-05-06 09:36:19浏览次数:72  
标签:--- 令牌 JavaWeb 回顾 depts Filter 登录 拦截 小结

项目实战-新增员工

思路

  • 接收并封装参数,调用service方法保存数据,响应result
    @PostMapping
    @RequestBody
  • 补充实体基础属性,调用mapper接口进行保存数据操作
  • insert into emp(...) values (?,?,?);

文件上传

简介

  • 文件上传,指将本地图片,视频,音频等文件上传到服务器,供其他用户浏览或下载
  • 文件上传在项目中应用非常广泛,我们经常发微博,发微信朋友圈都用到了文件上传功能
  • 前端页面三要素
表单项type="file"
表单提交方式post
表单的enctype属性multipart/form-data
  • 服务端接收文件
    MultipartFile
  • 文件存储方式
  1. 本地存储(无法直接访问,磁盘空间限制,磁盘损坏)
  2. 云存储OSS

本地存储

在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中

在springboot中,文件上传,默认单个文件允许最大大小为1M,如果需要上传大文件,可以进行如下配置

配置单个文件最大上传大小

spring.servlet.multipart.max-file-size=10MB

配置单个请求最大上传大小(一次请求可以上传多个文件)

spring.servlet.multipart.max-request-size=100MB

缺点

  • 容量空间有限
  • 本地失效概率高
  • 服务器宕机数据有丢失风险
  • 无法立刻恢复业务
  • 需要等待维修

阿里云OSS

阿里云对象存储OSS(Object Storage Service),是一款海量,安全,低成本,高可靠的云存储服务.使用OSS可以通过网络随时存储和调用包括文本,图片,音频和视频等在内的各种文件

第三方服务---通用思路

准备工作
参照官方SDK编写入门程序
  • SDK:Software Development Kit的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包),代码示例等,都可以叫做SDK
  • Bucket
    存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间
集成使用

准备工作

注册阿里云--充值--开通对象存储服务(OSS)---创建bucket---获取AccessKey(密钥)---参照官方SDK编写入门程序---案例集成OSS

入门

准备工作---找到官方文档---阅读官方文档---导入依赖---复制示例代码,修改允许---案例集成OSS

集成

  • 引入阿里云上传文件工具类(由官方的示例代码改造而来)
  • 修改UploadController中upload方法,完成上传图片接口开发

修改员工

查询回显

思路

  • 接收路径参数id,调用service方法查询数据,响应result
    @GetMapping
    @PathVariable
  • 调用mapper接口查询数据
  • select * from emp where id=?;

修改员工

思路

  • 接收请求参数并封装,调用service方法执行修改操作,响应
    @PutMapping
    @RequestBody
  • 补充基础数据,调用mapper接口修改数据
  • update emp set username=?,name=?,gender=? ... ,where id = ?;

配置文件

参数配置化和@Value

@Value注解通常用于外部配置的属性注入,具体用法为:@Value("${配置文件中的key}")

@ConfigurationProperties

格式

@Data
@Component
@ConfigurationProperties(prefix="aliyun.oss")
public class AliOSSProperties{
  private String endpoint;
  private String accessKeyId;
  private String accessKeySecret;
  private String bucketName;
}

@ConfigurationProperties与@Value

相同点

都是用来注入外部配置的属性的

不同点
  • @Value注解只能一个个的进行外部属性的注入
  • @ConfigurationPorperties可以批量的将外部的属性配置注入到bean对象的属性中,类中要提供setter方法

yml配置文件

SpringBoot提供了多种属性配置方式

  • application.properties
  • application.yml
  • application.yaml
    优先级:properties>yml>yaml

基本语法

  • 大小写敏感
  • 数值前边必须有空格,作为分隔符
  • 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • "#"表示注释,从这个字符一直到行尾,都会被解析器忽略

yml数据格式

  • 对象/Map集合
user:
  name:zhangsan
  age:18
  passwrod:123456
  • 数组/List/Set集合
hobby:
  -java
  -game
  -sport

登录功能

思路

  • 接收并封装参数,调用service方法进行登录,响应
    @PostMapping
    @RequestBody
  • 调用mapper接口查询用户信息
select * from emp where
username = ? and password = ?;

登录校验

登录标记

  • 用户登录成功之后,每一次请求中,都可以获取到该标记
  • Cookie客户端技术 | Session服务端技术 | JWT令牌

统一拦截

  • 过滤器Fileter
  • 拦截器Interceptor

会话技术

会话

用户打开浏览器,访问web服务器资源,会话建立,直到有一方断开连接,会话结束.在一次会话中包含多次请求和响应

会话跟踪

服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据

方案

cookie客户端技术
优点

http协议中支持的技术

缺点
  • 移动端app无法使用cookie
  • 不安全,用户可以自己禁用cookie
  • cookie不能跨域
    跨域区分三个维度:协议,IP/域名,端口
session服务端技术
优点

存储在服务端,安全

缺点
  • 服务器集群环境下无法直接使用session
  • cookie的缺点
JWT令牌技术
优点
  • 支持pc端,移动端
  • 解决集群环境下的认证问题
  • 减轻服务器存储压力
缺点

需要自己实现

JWT令牌

简介

全称

JSON Web Token(https://jwt.io/)其本质是一个字符串

定义了一种简洁的,自包含的格式,用于在通信双方以json数据格式安全的传输信息,由于数字签名的存在,这些信息是可靠的

组成
第一部分

Header(头),记录令牌类型,签名算法等

第二部分

Payload(有效载荷),携带一些自定义信息,默认信息等

第三部分

Signature(签名),防止Token被篡改,确保安全性,将header,payload连接成字符串,并加入指定密钥,通过指定签名算法计算而来

场景

登录认证
  • 登录成功后,生成令牌
  • 后续每个请求,都要携带jwt令牌,系统在每次请求处理之前,先校验令牌,通过后再处理
注意事项
  • jwt校验时使用的签名密钥,必须和生成jwt令牌时使用的密钥是配套的
  • 如果jwt令牌解析校验时报错,则说明jwt令牌被篡改或失效了,令牌非法
生成令牌
步骤
  1. 引入jwt令牌操作工具类
  2. 登录完成后,调用工具类生成jwt令牌,并返回

过滤器Filter

概述

  • Filter过滤器,是JavaWeb三大组件(servlet,filter,listener)之一
  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能
  • 过滤器一般完成一些通用的操作,比如登录校验,统一编码处理,敏感字符处理等

快速入门

  • 定义Filter:定义一个类,实现Filter接口,并重写其所有方法
  • 配置Filter:Filter类上加@WebFilter注解,配置拦截的路径,引导类上加@ServletComponentScan开启Servlet组件支持

Filter详解

执行流程
  1. 放行前逻辑---放行---放行后逻辑
  2. 放行后访问对应资源,资源访问完成后,会回到Filter中
    如果回到Filter中,会执行放行后逻辑
拦截路径
格式
@WebFilter(urlPatterns="/*")
public class demo implements Filter{}
常用配置
  • 拦截具体资源
    /login
    只有访问/login路径时,才会被拦截

  • 目录拦截
    /emps/*
    访问/emps下的所有资源,都会被拦截

  • 拦截所有
    /*
    访问所有资源,都会被拦截

过滤器链
介绍

一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链

顺序

注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序

登录校验
  • 登录请求被拦截到后不需要校验令牌
  • 有令牌且校验通过(合法),才放行拦截到的请求,否则都返回未登录错误结果
  • 流程
  1. 获取请求url
  2. 判断请求url是否包含login,如果包含,说明是登录操作,放行
  3. 获取请求头中的令牌(token)
  4. 判断令牌是否存在,如果不存在,返回错误结果(未登录)
  5. 解析token,如果解析失败,返回错误结果(未登录)
  6. 放行

拦截器Interceptor

概述

概念

是一种动态拦截方法调用的机制,类似于过滤器,spring框架中提供的,用来动态拦截控制器方法的执行

作用

拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码

快速入门

  • 定义拦截器,实现HandlerInterceptor接口,并重写其所有方法
  • 让启动类实现WebMvcConfigurer接口,注册拦截器

拦截路径

格式
@Override
public void addInterceptors(Interc eptorRegistry registry)
  registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
}
常用路径

/*
一级路径
能匹配/depts,/emps,/login,不能匹配/depts/1
/**
任意级路径
能匹配/depts,/depts/1,/depts/1/2
/depts/*
/depts下的一级路径
能匹配/depts/1,不能匹配/depts/1/2,/depts
/depts/**
/depts下的任意级路径
能匹配/depts,/depts/1,/depts/1/2,不能匹配/emps/1

执行流程

Filter与Interceptor区别
接口规范不同

过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口

拦截范围不同

过滤器Filter会拦截所有的资源,而Interceptor只会拦截spring环境中的资源

登录校验步骤

  1. 获取请求url
  2. 判断请求url是否包含login,如果包含,说明是登录操作,放行
  3. 获取请求头中的令牌(token)
  4. 判断令牌是否存在,如果不存在,返回错误结果(未登录)
  5. 解析token,如果解析失败,返回错误结果(未登录)
  6. 放行

异常处理

处理方式

  • 在Controller的方法中进行try...catch处理
  • 全局异常处理器
    @RestControllerAdvice = @ControllerAdvice(表示该类是一个异常处理类)+@ResponseBody(响应数据)

两个注解

  • @RestControllerAdvice:写在类上,表示该类是一个异常处理类
  • @ExceptionHandler:写在方法上,指定该方法要处理的异常类型

标签:---,令牌,JavaWeb,回顾,depts,Filter,登录,拦截,小结
From: https://www.cnblogs.com/kyrie-66/p/17353130.html

相关文章

  • javaweb性能优化-----总结
    高吞吐量关键指标:1、并发访问量2、在线数量3、数量查询所占比重此三点的直接体现:1、数据状态保存2、登陆状态信息保存3、频繁的数据连接和存储查询策略优化:1、减少一次数据读取的条目可以较大改善和减轻服务器对CPU和内存的压力2、减少一次数据读取的条目可以检查网络传输的压力,减......
  • 开源+实时+数据即服务的架构——唐建法受邀出席2023数据技术嘉年华【干货回顾】
    点击报名假设原料是一个产品公司的SaaS业务系统、一套CRM、一套工单系统、一个内部人事系统,和内部研发管理系统;现在给到你40min的时间,能做出怎样的数据菜肴?如果这里的厨师是Tapdata,那么答案可以是一个实时业务经营看板,也可以是一个运营自动化的流程。如此高效的秘诀是什......
  • 面向开发人员的chatgpt提示工程-自用回顾note
    关键原则1.编写清晰具体的指令1.1使用限定符区分prompt和文本Pastedimage202304301237291.2结构化输出Pastedimage202304301238391.3要求模型检查是否满足条件Pastedimage202304301239181.4小批量提示Pastedimage202304301249142.给模型时间来思考2.1......
  • OpenAI API keys 的申请和测试小结
    申请准备工作,申请OpenAIAPIkeys首先需要准备三件套:1.VPN(登录Google和OpenAI)2.GoogleGmail邮箱账号3.国外手机(接收验证码,可用接码平台代替) 接下来,开启申请OpenAIAPIkeys之旅。 首先,开启VPN全局代理模式,同时将代理服务器的地址改为香港以外的国家,这样避免......
  • JavaWeb复习笔记
    MysqlsqlDDLDMLDQL约束设计多表查询内连接外连接子查询事务......
  • 上周热点回顾(4.24-4.30)
    热点随笔:· 服务器出现了一个新软件,一帮大佬吵起来了! (轩辕之风)· 【故障公告】被放出的Bing爬虫,又被爬宕机的园子 (博客园团队)· [MAUI]模仿网易云音乐黑胶唱片的交互实现 (林晓lx)· VueHub:我用ChatGPT开发的第一个项目,送给所有Vue爱好者 (DOM哥)· .NETWeb......
  • [iOS]GCD小结
    BriefIntroduction  GCD,全称GrandCentralDispath,是苹果开发的一种支持并行操作的机制。它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务。  GCD中的FIFO队列称为dispatchqueue,它可以保证先进来的任务先得到执行(但不保证一定先执行结束)。 ......
  • JavaWeb回顾与小结(五)
    Mybatis基础操作环境准备工作准备数据库表创建一个新的springboot工程,选择引入对应的起步依赖(mybatis,mysql驱动,lombok)application.properties中引入数据库连接信息创建对应的实体类Emp(实体类属性采用驼峰命名)准备Mapper接口EmpMapper根据主键删除SQL语句delete......
  • JavaWeb回顾与小结(四)
    数据库操作-DQLDQL英文全称是DataQueryLanguage(数据查询语言),用来查询数据库表中的记录基本查询条件查询where分组查询groupby排序查询orderby分页查询limit基本查询语法查询多个字段select字段1,字段2,字段3from表名;查询所有字段(通配符)select*from......
  • javaweb用户登录界面
    实验名称用户登录界面成绩评定所用仪器材料eclipsetomcatwin11实验目的或要求1.实验目的使用JSP实现用户登录验证。2.实验内容通过创建一个用户登录的页面,让用户输入正确的用户名、密码,并进行校验,若用户名和密码输入正确,则弹出您好,你的名字首字母,否则弹出用户名或密码错误,请重新输......