文件上传

我们上传文件的时候,假如前后端都在自己手中,通常我们上传文件从我们 自己的电脑中选取文件上传,上传之后的图片存储在自己电脑的磁盘当中,但是当我们上传的文件太大太多的时候,电脑磁盘空间可能会存在不够用的方式,此时可以上传到文件到云端,让云端存储代替磁盘空间的存储,更安全可靠空间容量大

本地上传

 这是一段关于前端文件上传的代码,表单的file域代表选择上传的文件

表单提交方式为post,因为上传的文件比较大所以需要post请求方式

如果我们在表单类型enctype设置为默认值的话,上传文件会提交上传文件的名字,而不会提交上传文件的内容

当我们在idea中进行文件上传的代码编写的内容为

如果我们的形参名字和表单项的名字不相同,需要用requestparam注解指定与表单中的name属性名字保持一致,

然后我们用postman进行接口文件上传的测试,发现文件存储在一个临时目录中,当我们代码运行完毕,文件就会自动删除

而我们要把上传的文件永久的保存到本地磁盘中去,需要调用multipartfile中的api方法

String getOriginalFilename(); //获取原始文件名

void transferTo(File dest); //将接收的文件转存到磁盘文件中

long getSize(); //获取文件的大小,单位:字节

byte[] getBytes();//获取文件内容的字节数组

InputStream getInputStream(); //获取接收到的文件内容的输入流

代码书写如下

此时如果我们已经上传了一个名字为1.jpg的文件a,在上传一个名字为1.jgp的文件b,这时候文件b就会把文件a给覆盖掉,因为二者名字相同,这时候我们用随机出来的uuid 来设置文件名字的随机就可以避免这种情况

代码情况如下  

我们获取到原始文件名之后,用lastindexof方法获取文件类型的最后面的类型后缀,然后截取到该后缀名,比如文件名字为 xxx.txt 用方法截取到 .txt,再用uuid 组成新的随机文件名字

但是当我们上传一个较大的文件的时候,会报错,所以我们可以在springboot的配置中设置文件上传的大小限制

阿里云oss存储

首先我们注册一个阿里云账号,并且登陆进去,然后找到阿里云oss存储,开通oss服务,

创建之后,其他的都不点,只需要点标准存储+公共读

然后在阿里云sdk下载说明中,把阿里云的上传文件流的代码复制到自己创建类中去,

,然后替换好之后就可以在自己的方法中上传文件到阿里云oss了,但是这样如果我们想换 阿里云账号密匙比较麻烦,我们可以自行配置自己的阿里云oss

配置文件 yml/yaml xml properties

但是用value注解注入的话,当我们多个配置需要注入就太麻烦了,所以干脆用spring中的注解

yml propertites 

在我们的springboot的配置文件,默认出现的都是propertites文件,格式一般如下

所以我们用yml文件来进行配置,而yml文件配置的语法为

大小写敏感 

数值前边必须有空格,作为分隔符

使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空 格)

缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

# 表示注释,从这个字符一直到行尾,都会被解析器忽略

yml配置数据格式为

登录逻辑

登录的逻辑就是,接受前端传递的用户名密码,然后再数据库中判断是否有该数据,其中一个不正确,就无法登录,并且提示登录用户错误

,底层的话一般也就是 一个sql的查询语句,查询到就登陆查询不到就不登陆

但是我们发现当我们再网页上登陆的时候,有时候只需要登陆一次就可以让浏览器记住自己用户密码下次自动登录,有的时候需要自己重复输入用户密码才能登陆,这就涉及到了登录校验

登录会话

在用户打开浏览器访问服务器的时候这个会话就建立了,知道有任意一方断开连接此时会话就结束了,在一次会话中可以包含多次请求和响应的

比如:打开了浏览器来访问web服务器上的资源(浏览器不能关闭、服务器不能断开) 

第1次:访问的是登录的接口,完成登录操作

第2次:访问的是部门管理接口,查询所有部门数据

第3次:访问的是员工管理接口,查询员工数据

只要浏览器和服务器都没有关闭,以上3次请求都属于一次会话当中完成的。

需要注意的是:会话是和浏览器关联的,当有三个浏览器客户端和服务器建立了连接时,就会有三个会 话。同一个浏览器在未关闭之前请求了多次服务器,这多次请求是属于同一个会话。比如:1、2、3这 三个请求都是属于同一个会话。当我们关闭浏览器之后,这次会话就结束了。而如果我们是直接把web 服务器关了,那么所有的会话就都结束了。

会话跟踪.

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一 次会话的多次请求间共享数据。

服务器会接收很多的请求,但是服务器是需要识别出这些请求是不是同一个浏览器发出来的。比 如:1和2这两个请求是不是同一个浏览器发出来的,3和5这两个请求不是同一个浏览器发出来 的。如果是同一个浏览器发出来的,就说明是同一个会话。如果是不同的浏览器发出来的,就说明 是不同的会话。而识别多次请求是否来自于同一浏览器的过程,我们就称为会话跟踪。

为什么要共享数据呢? 由于HTTP是无状态协议,在后面请求中怎么拿到前一次请求生成的数据呢?此时就需要在一次会 话的多次请求之间进行数据共享

会话跟踪技术 有

1. cookie 

2 session 

3 jwt令牌技术 

1 由于不安全,不能跨域

 2不安全 不能跨域 服务器集群环境下无法使用,移动端无法使用

所以主流都使用jwt令牌技术

jwt令牌

jwt令牌本质就是一个字符串, 当我们用户第一次访问服务器的时候,也就是开启会话的1时候,我们登录账号,登录成功之后会在服务器产生一个jwt令牌,响应给浏览器存储在cokie或者其他存储空间中,接下来在后续的每一次的每一次请求都需要把令牌带到服务端进行校验,如果令牌有效就说明用户已经登陆,令牌无效说明用户未登录,我们在多次请求中共享数据就可以把共享的数据存储在令牌当中就可以

jwt如果把原设计的json格式变成字符串的呢 

其实在生成JWT令牌时,会对JSON格式的数据进行一次编码:进行base64编码 Base64:是一种基于64个可打印的字符来表示二进制数据的编码方式。既然能编码,那也就意味 着也能解码。所使用的64个字符分别是A到Z、a到z、 0- 9,一个加号,一个斜杠,加起来就是 64个字符。任何数据经过base64编码之后,最终就会通过这64个字符来表示。当然还有一个符 号,那就是等号。等号它是一个补位的符号 需要注意的是Base64是编码方式,而不是加密方式。

下面如何进行jwt令牌的生成呢 

首先引入jwt依赖

生成jwt令牌

令牌测试

过滤器filter

Filter表示过滤器,是 JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能 使用了过滤器之后,要想访问web服务器上的资源,必须先经过滤器,过滤器处理完毕之后, 才可以访问对应的资源

webfilter中的值 

拦截器

在拦截器当中,我们通常也是做一些通用性的操作,比如:我们可以通过拦截器来拦截前端发起的请 求,将登录校验的逻辑全部编写在拦截器当中。在校验的过程当中,如发现用户登录了(携带JWT令牌且 是合法令牌),就可以直接放行,去访问spring当中的资源。如果校验时发现并没有登录或是非法令 牌,就可以直接给前端响应未登录的错误信息。

1. 定义拦截器 2. 注册配置拦截器

当过滤器和拦截器同时存在的时候他是一个链式循环的访问形式

异常处理

为了解决异常,我们需要定义一个全局异常处理类

我们该怎么样定义全局异常处理器? 定义全局异常处理器非常简单,就是定义一个类,在类上加上一个注解 @RestControllerAdvice,加上这个注解就代表我们定义了一个全局异常处理器。 在全局异常处理器当中,需要定义一个方法来捕获异常,在这个方法上需要加上注解 @ExceptionHandler。通过@ExceptionHandler注解当中的value属性来指定我们要捕获的 是哪一类型的异常

@RestControllerAdvice //表示当前类为全局异常处理器

@ExceptionHandler //指定可以捕获哪种类型的异常进行处理

springboot事务管理

在mysql中存在着事务,我们可以用begin end开启关闭事务,在springboot中只需要用一个注解就可以开启事务

@Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交 事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。 

@Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功 能可能会包含多个数据访问的操作。在业务层来控制事务,我们就可以将多个数据访问操作控制在 一个事务范围内。

但是注意的是 当我们程序报出异常之后会执行事务回滚,但是默认情况下 事务回滚只针对runtime运行时的异常进行回滚,其他异常不回滚,我们想要全部回滚,则需要@Transactional(rollbackFor=Exception.class)

结论: 在Spring的事务管理中,默认只有运行时异常 RuntimeException才会回滚。 如果还需要回滚指定类型的异常,可以通过rollbackFor属性来指定。

在除了rollbackfor属性还有一个progagation来控制事务的传播行为

假如  两个事务方法,一个A方法,一个B方法。在这两个方法上都添加了@Transactional注解,就代 表这两个方法都具有事务,而在A方法当中又去调用了B方法。

所谓事务的传播行为,指的就是在A方法运行的时候,首先会开启一个事务,在A方法当中又调用了B方 法, B方法自身也具有事务,那么B方法在运行的时候,到底是加入到A方法的事务当中来,还是B方法 在运行的时候新建一个事务?这个就涉及到了事务的传播行为。

对于这些传播行为 我们只需要关注前面两个就可以,第一个required 就是  

a b两个方法都有事务注解,在a中调用b方法,当我们使用默认的required时候,b方法就会加入到a事务中运行当出现异常的时候两个方法都会进行事务回滚,而 required——new  则会 为b方法重新开启一个事务进行运行,出现异常的时候,b方法不会进行事务回滚

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐