SpringBoot&Vue

昨日回顾 Base64 1、它是干什么的? 它可以进行编码和解码 2、能解决项目中的啥问题? 往网络上传递一个二进制文件怎么办?(图片,视频) 把一个二进制文件编码一个特殊的字符串,然后进行传递。 传输二进制—》传输字符串。 服务收到特殊字符串进行解码就能得到一个二进制。 3、他不是一个加密工具,它是一个编码解密工具 加密算法 hash,MD5,Bcrpty。 自带盐值,防止暴力破解。 四个框架都干了什么事情 ThreadLocale 1、客户端携带token发送请求 2、被拦截器拦截后开始校验token,如果token有误直接抛出异常。 3、token校验成功,从token字符串中解析出userToken对象,然后保存到THreadLocale中. 4、拦截器做放行 5、到了controller或service后,可以直接从THreadLocal中获取userToken。 6、解决安全问题还需要再controller执行之后把THreadLocal中的数据删除。 ThreadLocale是保存在当前线程里面, 一个请求发送过去,对于服务端而言就是一个线程。每个线程都有一个THreadLocal,所以他们是线程安全的。 ResponseBodyAdves 对controller返回的内容实现统一的包装(R) RBAC权限管理系统 基于角色来控制权限的。 用户,角色,权限。 1、先找到用户的角色 2、再找到角色对应的权限,从而也就得到了用户的权限 3、权限判断的时候干的事情是 ​ a、当前用户拥有哪些权限。 –》手里有几把药匙 ​ b、访问这个接口需要那个权限。—》开门需要那把药匙 今日内容 画图 权限的认证 之前做的是token的认证,只要token是正确的就可以正常访问接口。 现在还要做权限,用户有了该接口的权限才能访问接口。 要做权限的认证,必须要在接口之前来完成了。在接口之前干点的事情的技术有那些? 拦截器,AOP。 使用AOP+自定义注解来实现权限的校验。 自定义注解 package com.qf.application.core.aop.annotation; import java.lang.annotation.*; // 这三个注解就是原注解,任何一个注解上面都会有这三个注解 @Target({ElementType.METHOD}) // 表示该注解只能加载方法上面 // *.java --->*.class --->运行 @Retention(RetentionPolicy.RUNTIME) // 该注解的作用域 @Documented // 生成JavaDoc public @interface Permission { } @GetMapping("/map") @Permission() public Map<String, Object> testMap() { Map<String, Object> map = new HashMap<>(); map....

Oct 26, 2023 · 2 min · 橘子树谅

SpringBoot(3)

昨日回顾 拦截器 只需要记住,在SpringBoot中如何配置一个拦截器。 1、拦截器的作用(项目中有没有用到过拦截器,用它来解决什么问题)? 在调用接口之前被触发。在调用接口之后被触发。 tokne校验,权限校验,登录拦截 全局异常管理器 只需要记住,在SpringBoot中如何配置一个全局异常管理器。 它的作用什么?项目中用它来解决什么问题? 把项目中遇到的异常可以全部的抛出,到全局异常管理器来统一的处理。 资源相关的资源需要就地解决,不能抛出。 全局异常管理器是如何处理异常的? 先做异常的判断,判断它是系统异常还是业务异常,如果是系统异常记录错误的日志,然后给用户响应系统正在维护,请稍后再试。 如果是业务异常就直接把异常信息抛给用户就可以了。 restful风格 资源定位(url),资源的操作(method)。 查询:get 添加:post 修改:Put 删除:DLETEE 接受和响应的数据都是JSON格式。 优势在于风格非常的简洁,可读性更高。 Session登录的原理 1、为什么会有Cookie和Session的处理? 因为HTTP是无状态的。 2、Session的底层是通过Cookie来实现的。 3、在集群的情况下Seesion等会出现无法共享的问题。 JWT JSON Web Token 它可以帮助我们生成一个Token,而且这个token可以有过期时间,可以揉入一些数据进去,最终生成一个字符串。 JWT石油三部分组成,头,载荷,签名。 之前的Session是如何校验的? 登录成功后再服务端创建一个Session,每个Session会有一个JSESSIONID,session是保存在服务端的,然后把JSESSIONid给客户端,下次访问的时候在Cookie中携带,在服务端就可以获取到JESSIONid然后和服务端自己保存的做一个比对。如果是正确就说明合法的,如果不正确就说明这个被改过没有登录。 JWT可以自校验,它是怎么做到的? 认证成功后使用JWT生成一个token,给token中揉入了一些用户的数据,直接把tokne返回给客户端了,服务端没有保存。客户端下次请求的时候在氢气头中携带token,服务端获取到token后,因为服务端没有保存token,此时它是如何校验的token合法性的? JWT生成token的过程? 1、先把头通过base64编码,得到一个字符串 2、再把载荷通过base64编码,得到一个字符串 3、使用用户签名把把头和载荷(base64后的字符串)进行一个签名,得到一个字符串。 header.payload.签名 如何自校验的? 校验的时候需要传递token字符串。 1、解析出头部 2、解析出载荷 3、使用用户签名把把头和载荷(base64后的字符串)进行一个签名,得到一个字符串。 header.payload.签名 今日内容 画图 https://www.processon.com/view/link/6538d35ffc67b11c9006d1e8 base64编码 package com.qf.application; import org.junit.jupiter.api.Test; import org.springframework.util.Base64Utils; import org.springframework.util.FileCopyUtils; import java.io.File; import java.io.FileOutputStream; import java.util.Base64; public class Base64Test { // 解码 private static Base64....

Oct 25, 2023 · 3 min · 橘子树谅

SpringBoot(2)

昨日回顾 Git客户端 小乌龟可以通过鼠标的方式操作git。 SpringBoot Spring:Bean的创建 SpringMVC:它是对Servlet的一个封装,对Web的支持。 SpringBoot:Spring提供用来快速构建Spring应用程序的。 1、概念 快速构建Spring应用程序的,解决SSM配置文件过多的问题, 简化配置,提高开发效率,自动装配 2、怎么简化配置了?怎么提高开发效率? 从导入依赖来讲只需要导入一个spring-boot-straetr-xxxx或者xxxx-boot-starter依赖,其他的依赖都会传递过来。 从配置信息上来讲,所有的配置你不配,多会有一套默认的配置。 自动装配:项目启动会去扫描依赖,就会做这个依赖相关的注入。 内置的tomcat,可以直接使用。 3、SPringBoot工程结构 它也是基于maven俩构建的 Boot常用注解 1、@Value:读取配置文件的信息 2、@Configuration:专门用来修饰配置类 3、@SpringBootApplication:表示主启动类 4、@ConfigurationProperties:批量的读取配置文件,赋值到具体的对象中 5、@Bean:把方法的返回值放到IOC容器里面 6、@ComponentScan:配置包扫描 7、@MappScanner:扫描Mapper接口的 Boot配置文件 applicaiton.properties,键值对的 applicaiton.yml,它有严格的格式要求,属性和属性之间使用冒号,属性名和属性值之间要有空格。 MP MP是MyBatis的一个插件,它只是在MyBatis之上做了增强,不做改变。 MP的好处就可以自动的完成一些操作,全部靠ORM来完成,通过注解的方式来完成ORM。 1、通用的CRUD接口 2、查询条件 3、分页插件 4、主键生成策略 今日内容 拦截器 拦截器是SpringMVC中的组件,它是用来拦截所有的请求。 1、定义拦截器 package com.qf.application.interceptor; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class UserInterceptor implements HandlerInterceptor { // controller调用之前执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System....

Oct 24, 2023 · 2 min · 橘子树谅

SpringBoot(1)

自我介绍 达老师,我负责后面阶段的内容。 我的素材全部是放在gitee上面。 视频是放在阿里云网盘的。 git客户端 之前我们操作git都是使用命令来完成的。 现在图形化界面的工具,它也可以操作git,它可以通过鼠标点击的方式来操作git,这是它的优点,可以提高效率。 这个工具叫做小乌龟。 1、先把这个两个包安装包保存到本地 2、然后先安装小乌龟 3、小乌龟安装成功了以后再去安装汉化包 如果已经配置了中午还是显示的是英文,尝试把电脑重启下。 本地的仓库初始化 随便加点内容 资料地址 gitee:https://gitee.com/dashixin.com/java2305 视频地址 https://www.aliyundrive.com/s/zMEdz7p7TVe 今日内容 画图 https://www.processon.com/view/link/6535d0f8d657a234397f8ea6 SpringBoot概念 1、提高了开发的效率 2、简化了配置 3、约定大于配置。 编码《配置《约定俗成 共享我的本地仓库 1、下载到本地 2、解压 3、把里面的所有的文件全部复制到你自己的本地仓库 4、在maven的配置文件中设置一下本地仓库刚才下载的那个就可以了。 标准的springboot工程 1、包名和类名中都包含了项目的名称 *.cmd;*.git;*.hprof;*.iml;*.md;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.hg;.idea;.mvn;.svn;CVS;__pycache__;_svn;mvnw;vssver.scc;vssver2.scc; 优化POM.xml 我把不需要的东西全部删了 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 集成了SpringBoot的父工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- 当前项目的信息--> <groupId>com.qf</groupId> <artifactId>day01-boot-01-hello</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 设置JDK的版本--> <properties> <java.version>1.8</java.version> </properties> <!...

Oct 23, 2023 · 4 min · 橘子树谅

日志与定时任务

日志与定时任务 一、权限管理 拦截器方式 自定义拦截器,判断是否得到凭证,没有,则拦截 //自定义拦截器类 public class MyHandler implements HandlerInterceptor { @Override //拦截器的拦截处理的handler public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object o = request.getSession().getAttribute("username"); if(o==null){ //没有登录凭证,则到达登录页面 response.sendRedirect("/login.html"); return false; } return true; } } 在mvc容器中配置拦截路径 <mvc:interceptors> <!-- 配置拦截路径 --> <mvc:interceptor> <mvc:mapping path="/customer/**"/> <mvc:mapping path="/app/**"/> <bean class="com.qf.handler.MyHandler"></bean> </mvc:interceptor> </mvc:interceptors> 登录用户模块的表设计 create table user( id int primary key auto_increment, username varchar(20), password varchar(20) ); insert into user(username,password) values('zs','123'); insert into user(username,password) values('ls','444'); 再创建controller,service,dao...

Oct 20, 2023 · 5 min · 橘子树谅

开放管理平台2

开放管理平台02 一、客户模块 批量删除 需要将动态的数据表显示每条的复选框,需要加入属性: {type: 'checkbox', fixed: 'left'} 前端选中匹配删除选项,发ajax请求到后端 layer.confirm('真的批量删除么', function(index) { //获取选中对象 var checkStatus = table.checkStatus("custom"); var data = checkStatus.data; //获取选中记录(容器) //循环变量data,然后取出每条记录的id var params = ""; $.each(data, function (i, obj) { params += "&ids=" + obj.id; //批量参数,后台使用数组获取参数 }) //发ajax请求 $.ajax({ type: "post", //批量删除为post请求 url: "/customer/batdel", data: params, success: function (res) { alert("批量删除:" + res); table.reload("custom"); //重新加载table } }) layer.close(index); //删除弹出窗口 }) 批量删除的动态SQL <delete id="deleteIds"> delete from customer where id in <foreach collection="array" item="id" open="(" close=")" separator=","> #{id} </foreach> </delete> 搜索 搜索的表单控件需要放置动态数据表最前面...

Oct 19, 2023 · 2 min · 橘子树谅