Java Web应用开发项目教程(Spring Boot+MyBatis)课件全套 项目1-7 Hello World入门 -AI辅助开发新闻发布系统_第1页
Java Web应用开发项目教程(Spring Boot+MyBatis)课件全套 项目1-7 Hello World入门 -AI辅助开发新闻发布系统_第2页
Java Web应用开发项目教程(Spring Boot+MyBatis)课件全套 项目1-7 Hello World入门 -AI辅助开发新闻发布系统_第3页
Java Web应用开发项目教程(Spring Boot+MyBatis)课件全套 项目1-7 Hello World入门 -AI辅助开发新闻发布系统_第4页
Java Web应用开发项目教程(Spring Boot+MyBatis)课件全套 项目1-7 Hello World入门 -AI辅助开发新闻发布系统_第5页
已阅读5页,还剩181页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

HelloWorld入门项目1目录01开发环境搭建02HelloWorld接口实现1.1JavaWeb应用开发项目教程(SpringBoot+Mybatis)开发环境搭建任务1.1开发环境搭建-课程作用本课程以Java为核心,重点讲解如何根据业务逻辑从数据库中查询数据,并为网页、App、小程序等前端平台构建规范的数据接口。例如:登录后实现个人数据的展示,是本课程中具有代表性的教学案例。本课程先修课程为HTML5与数据库,后续课程为App开发、小程序开发及综合实训,是一门就业面广、实践性强的核心课程。任务1.1开发环境搭建-开发工具开发工具包:JDK21开发工具:IDEA2024.1数据库:MySQL8接口测试工具:Apifox/java/technologies/downloads/idea/download/?section=windows/downloads/windows/installer/8.0.html/任务1.1开发环境搭建

1.JDK环境变量配置环境变量包括JAVA_HOME和Path两部分。JAVA_HOME指定JDK的安装路径。Path指定Java开发工具包(JDK)中可执行文件的路径。2.JDK环境配置验证打开CMD命令提示符,输入java-version命令,查看是否能正确显示JDK的版本信息。如果能正确显示,说明JDK环境配置成功。1.2JavaWeb应用开发项目教程(SpringBoot+Mybatis)HelloWorld接口实现任务1.2HelloWorld接口实现-新建项目任务1.2HelloWorld接口实现-新建项目任务1.2HelloWorld接口实现-新建包任务1.2HelloWorld接口实现-新建类任务1.2HelloWorld接口实现-HelloWorldController类@RestController@RequestMapping("/api")publicclassHelloWorldControllor{@RequestMapping("/HelloWorld")publicStringHelloWorld(){System.out.println("HelloWorld");return"HelloWorld!";}}任务1.2HelloWorld接口实现-导包任务1.2HelloWorld接口实现-项目运行任务1.2HelloWorld接口实现-接口测试请求方式接口地址返回值HelloWorld入门项目1用户管理实现项目2目录01初视RESTfulAPI设计规范02增删改查基本接口03SpringBoot分层分析04Mybatis入门2.1JavaWeb应用开发项目教程(SpringBoot+Mybatis)初识RESTfulAPI设计规范‌RESTfulAPI设计中的动词和宾语遵循“动词+宾语”的结构。比如:GET/articles这个命令,GET是动词,/articles是宾语。1.动词动词通常就是五种HTTP方法,根据HTTP规范,一律大写。GET:获取;POST:添加;PUT:修改;PATCH:部分修改;DELETE:删除。任务2.1

RESTfulAPI设计规范

2.宾语宾语就是API的URL,是HTTP动词作用的对象,书写规范如下:(1)不用大写字母,所有单词使用英文且小写;(2)连字符用中杠“-”而不用下杠“_”;(3)使用“/”表示层级关系,URL的层级不要过深,并且越靠前的层级越稳定;(4)结尾不要包含正斜杠分隔符“/”;(5)URL中不出现动词,用请求方式表示动作;(6)不要使用文件扩展名。任务2.1

RESTfulAPI设计规范

RESTful风格中的请求返回值一般包含如下字段:{ code:

Integer,//返回状态码 message:

String,//返回信息描述 data:

Object//返回数据}在Java中,Object是一种泛型类型,可以表示任意类型的对象。任务2.1

RESTfulAPI设计规范-返回值返回失败的响应JSON格式:{"code":401,"message":"用户没有权限","data":null}任务2.1

RESTfulAPI设计规范-返回值返回成功的响应JSON格式:{ "code":200, "message":"操作成功", "data":[{ "userName":"黄钟", "age":31}]}在HTTP协议中,状态码被广泛用于描述请求和响应的各种状态。1.200OK-[GET]:服务器成功返回客户端请求的数据;2.201CREATED-[POST/PUT/PATCH]:客户端添加或修改数据成功;3.202Accepted-[*]:服务器已经接受了客户端的请求,但尚未完成处理;4.204NOCONTENT-[DELETE]:服务器成功处理了请求,但没有返回任何内容;任务2.1

RESTfulAPI设计规范-HTTP状态码5.400INVALIDREQUEST-[POST/PUT/PATCH]:客户端发送的请求有误,服务器无法理解;6.401Unauthorized-[*]:客户端没有身份认证或身份认证无效;7.403Forbidden-[*]客户端没有足够的权限去访问请求的资源;8.404NOTFOUND-[*]:客户端请求的资源在服务器上不存在;9.500INTERNALSERVERERROR-[*]:服务器程序错误。任务2.1

RESTfulAPI设计规范-HTTP状态码请求参数是传递给服务器的数据,用于传递额外信息,常见的请求参数类型如下:1.路径参数(PathParameters)通常以{}的形式出现在URL中,如/users/{id},其中id就是一个路径参数。@GetMapping("/users/{userId}")publicReturnT<User>getUserByUrl(@PathVariable(value="userId")Integerid){System.out.println("获取主键userId="+id+"的用户数据。");returnReturnT.Success(users().get(id));}使用@PathVariable注解将路径参数绑定到方法参数上。任务2.1

RESTfulAPI设计规范-路径传参2.查询参数(QueryParameters)通常作为URL的一部分,以?开始,以key=value的形式出现,多个参数之间使用&连接,例如/users?id=1&name=John。@GetMapping("/user")publicReturnT<User>getUser(@RequestParam("userId")Integerid){System.out.println("获取主键userId="+id+"的用户数据。");returnReturnT.Success(users().get(id));}使用@RequestParam注解将查询参数绑定到方法参数上。任务2.1

RESTfulAPI设计规范-路径传参3.请求体参数(BodyParameters)是通过HTTP请求体中发送的数据,通常用于传递复杂结构的数据,如JSON、XML等。@PostMapping("/user")publicReturnT<User>insertUser(@RequestBodyUseruser){returnReturnT.Success(user);}使用@RequestBody注解将请求体数据绑定到方法参数上。任务2.1

RESTfulAPI设计规范-路径传参为了返回统一的数据格式,需要封装一个工具类,用来定义code(状态码)、message(提示信息)、data(返回数据)三个对象,返回给前端。新建utils包,包下新建ReturnCode.java和ReturnT.java文件。ReturnCode.java文件用于定义状态码,定义成功和失败两种状态码。ReturnT.java文件用于定义返回统一的数据。任务2.1

RESTfulAPI设计规范-工具类使用@GetMapping注解实现获取所有用户数据接口:@GetMapping("/users/list")//默认端口8080publicReturnT<List<User>>selectAllUsers(){System.out.println("获取所有用户数据。");returnReturnT.Success(users());}测试获取所有用户数据接口:GET:8080/api/users/list8080是IDEA默认使用端口。任务2.1初识RESTfulAPI设计规范-获取数据

2.2JavaWeb应用开发项目教程(SpringBoot+Mybatis)增删改查基本接口新建数据库mydata,新建用户表tb_user,并添加记录。任务2.1增删改查基本接口-新建库表

1.使用IDEA打开教材配套的demo案例,注意,demo下面可能会再包含demo文件夹。任务2.1增删改查基本接口-打开项目2.刷新Maven,自动导入依赖。1.获取所有用户数据GET:8082/api/users/list2.获取分页用户数据GET:8082/api/users/pageQuery参数pageNum:3pageSize:2 3.获取查询用户数据GET:8082/api/users/searchQuery参数condition:passwordcontent:2任务2.2增删改查基本接口-测试接口

4.获取用户记录总数GET:8082/api/users/count5.获取地址栏参数值的用户数据GET:8082/api/users/56.获取Query参数值的用户数据GET:8082/api/userQuery参数userId:157.添加用户数据POST:8082/api/userJSON参数{"userName":"henry","password":"Abc123!@","userAvatar":"../img/default.png"}任务2.2增删改查基本接口-测试接口

8.删除地址栏参数值的用户数据DELETE:8082/api/users/319.删除Query参数值的用户数据DELETE:8082/api/userQuery参数userId:3210.修改用户所有数据PUT:8082/api/userJSON参数{"id":2,"userName":"user","password":"Abc123!@","userAvatar":"

","createDate":"

"}任务2.2增删改查基本接口-测试接口

11.修改用户部分数据PATCH:8082/api/userJSON参数{"id":1,"userName":"","password":"","userAvatar":"../img/default2.png","createDate":"

"}2.3JavaWeb应用开发项目教程(SpringBoot+Mybatis)SpringBoot分层分析SpringBoot项目一般包含以下四层:controller层、service层、mapper层、entity层。1.代码的编写顺序eneity实体层→Mapper.xml定义SQL语句→mapper数据持久层→serviceImpl逻辑实现层→service业务接口层→controller控制层→html、js前端。2.代码的执行顺序html、js前端→controller控制层→service业务接口层→serviceImpl逻辑实现层→mapper数据持久层。一般而言,代码编写顺序通常自底向上,代码执行顺序通常自顶向下。任务2.3

SpringBoot分层分析1.主函数主函数main()是程序的入口点,位于DemoApplication.java文件中,通过调用SpringApplication.run()方法,初始化Spring环境和应用上下文。2.pop.xml文件Maven项目的核心配置文件,它以XML格式编写。该文件的主要作用是定义项目的结构、依赖关系和构建过程。3.application.yml文件用于配置数据连接、系统属性、环境变量、命令参数等信息。任务2.3

SpringBoot分层分析server:

port:8082spring:datasource:username:rootpassword:rooturl:jdbc:mysql://localhost:3306/mydata?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTCdriver-class-name:com.mysql.cj.jdbc.Drivermybatis:mapper-locations:classpath:mapping/*Mapping.xml#放在resources的mapping文件夹中type-aliases-package:com.example.demo.entity任务2.3

SpringBoot分层分析-application.yml服务器端口号,默认端口号是8080MySQL的用户名和密码,如密码为数字,需要加上双引号,如"1234"MySQL端口号数据库名mapper接口层需要在扩展名为*Mapping.xml的文件中寻找对应的方法在MyBatis的XML映射文件中,就可以直接使用类的简单名称(而非全限定名)来引用这些类。4.entity实体层存放实体类,一般一张数据库表对应一个实体类,表字段和类属性基本保持一致。Getter、Setter方法,实现以字符串形式返回对象的方法。5.pop.xml文件定义SQL语句和映射关系。XML文件通常与mapper层的Java接口一起使用。XML文件存在于resources下的mapping文件夹下。6.mapper层数据持久层,也被称为dao层,用于与数据库交互。通过mapper层向数据库发送SQL语句,并将结果通过接口传给service层,对数据库进行操作。mapper接口中的方法名与XML映射文件中SQL语句的id一致,并且保持返回类型一致。任务2.3

SpringBoot分层分析7.service层数据服务层,主要负责业务逻辑的处理,包括接口层service和接口实现层serviceImpl。serviceImpl是service接口的实现类,负责具体的业务逻辑实现。封装service层的业务逻辑有利于业务逻辑的独立性和重复利用性。8.controller层控制层,负责前后端交互,接受前端请求,调用service层,接收service层返回的数据,最后返回具体的页面和数据到客户端。controller层是不允许直接操作数据库的,不能在controller里暴露service的业务逻辑,而应该直接转发service的业务处理结果。service层聚焦于业务逻辑的处理,参数检验最好放在controller层做。任务2.3

SpringBoot分层分析2.4JavaWeb应用开发项目教程(SpringBoot+Mybatis)Mybatis基本语法<selectid="findCatPopularity"resultType="com.example.demo.entity.Cat">SELECT*FROMcatWHEREname=#{name}</select>id为自定义SQL语句的唯一标识,建议采用驼峰命名法,给mapper接口调用。resultType指的是每一行查询结果的Java类型,而不是整个结果集的类型。任务2.4Mybatis基本语法<insertid="insertAuthor">INSERTINTOAuthor(id,username,password,email,bio)VALUES(#{id},#{username},#{password},#{email},#{bio})</insert><updateid="updateAuthor"parameterType="Author">UPDATEAuthorSETusername=#{username},password=#{password},email=#{email},bio=#{bio}WHEREid=#{id}</update>任务2.4Mybatis基本语法<deleteid="deleteAuthor">DELETEFROMAuthorWHEREid=#{id}</delete><deleteid="deleteMore">DELETEFROMt_userWHEREidIN(${ids})</delete>任务2.4Mybatis基本语法用户管理实现项目2书籍管理实现项目3目录01类、方法注释和热部署02断点调试和单步调试03单元测试和集成测试04书籍增删改查接口3.1JavaWeb应用开发项目教程(SpringBoot+Mybatis)类、方法注释和热部署IDEA选择File→Settings→Editor→FileandCodeTemplates→Files→Class设置类注释模板。任务3.1

类、方法注释和热部署-类注释模板IDEA选择File→Settings→Editor→LiveTemplates→+→选择TemplateGroup自定义模板组。选择MyGroup→+→选择LiveTemplate自定义方法模板。任务3.1

类、方法注释和热部署-方法注释模板1.pop.xml文件的<dependencies>节点内添加支持热部署功能依赖相应的<dependency>子节点。2.IDEA选择File→Settings→Build→Complier→Buildprojectautomatically,启用自动编译功能。任务3.1

类、方法注释和热部署-热部署3.IDEA选择File→Settings→AdvancedSettings→Allowauto-make...勾选来启动热部署功能。任务3.1

类、方法注释和热部署-热部署3.2JavaWeb应用开发项目教程(SpringBoot+Mybatis)断点调试和单步调试任务3.2断点调试和单步调试-断点调试‌1.断点调试‌是一种在程序调试过程中使用的技术,其核心概念是在源代码中设置特定的“断点”,当程序执行到这些断点时,会暂停执行,允许开发者检查当前的程序状态,包括变量的值、调用栈等信息,从而帮助定位和解决程序中的错误。任务3.2断点测试和单步测试2.‌单步调试‌是指在程序开发过程中,通过逐步执行程序代码,逐行跟踪程序的执行流程,以便找到程序中的错误。单步调试允许开发者观察每一行代码的执行情况,查看变量的值,从而定位和修复程序中的逻辑错误或运行时错误‌。3.3JavaWeb应用开发项目教程(SpringBoot+Mybatis)单元测试和集成测试任务3.1单元测试和集成测试1.单元测试(unittesting),是指对软件中的最小可测试单元进行检查和验证。主要目标是:1)验证代码和设计相符合;2)跟踪需求和设计的实现;3)发现设计和需求中存在的缺陷;4)发现在编码过程中引发的错误。2.集成测试是对模块、子系统或系统的集合进行的测试,通常是在单元测试之后进行。它可以模拟Spring的应用环境,方便进行web层、service层、mapper层等的测试。实现步骤如下:1)创建一个测试类,继承自SpringTest的测试框架;2)在测试类中,使用@SpringBootTest注解来启动SpringBoot应用;3)在测试类中,定义一个或多个测试方法,每个方法对应一个测试场景;4)在测试方法中,使用MockMvc等框架来模拟HTTP请求,并检查响应结果是否正确。任务3.1单元测试和集成测试@DisplayName("JUnit5单元测试")@ExtendWith(MockitoExtension.class)classUserControllerTest{@InjectMocksUserServiceImpluserServiceImpl;@DisplayName("测试输出")@Testpublicvoidtest(){System.out.println("小李=====");}@DisplayName("测试UserServiceImpl中的fact()方法")@TestpublicvoidtestFact(){assertEquals(2,userServiceImpl.fact(1));assertEquals(5,userServiceImpl.fact(3));}}@SpringBootTest//1、表明当前单元测试是运行在SpringBoot环境中的classUserMapperTest{//2、注入测试对象@AutowiredprivateUserMapperuserMapper;@TestvoidselectByPrimaryKey(){//3、添加单元测试的业务代码Useruser=userMapper.selectByPrimaryKey(1);System.out.println(user);}}3.4JavaWeb应用开发项目教程(SpringBoot+Mybatis)书籍增删改查接口按照“MySQL建表→eneity→mapper.xml→mapper.java→serviceImpl→service→controller→Apifox测试”的步骤进行代码的“复制→粘贴→修改→测试”操作,得到新的接口。任务3.4

书籍增删改查接口任务3.4

书籍增删改查接口接口名称请求接口地址参数获取所有书籍数据GET:8082/api/books/list

获取分页书籍数据GET:8082/api/books/pageQuery参数pageNum:2pageSize:2获取查询书籍数据GET:8082/api/books/searchQuery参数condition:book_namecontent:红获取书籍记录总数GET:8082/api/books/count

获取地址栏参数值为3的书籍数据GET:8082/api/books/3

获取Query参数值为2的书籍数据GET:8082/api/bookQuery参数bookId:2添加书籍数据POST:8082/api/bookJSON参数{"bookName":"本草纲目","bookAuthor":"李时珍","bookPrice":39.99}任务3.4

书籍增删改查接口接口名称请求接口地址参数删除地址栏参数值为7的书籍数据DELETE:8082/api/books/7

删除Query参数值为6的书籍数据DELETE:8082/api/bookQuery参数bookId:6修改书籍所有数据PUT:8082/api/bookJSON参数{"id":5,"bookName":"本草纲目","bookAuthor":"李时珍","bookPrice":39.99}修改书籍部分数据PATCH:8082/api/bookJSON参数{"id":5,"bookName":"本草纲目2","bookAuthor":"","bookPrice":59.99}书籍管理实现项目3登录模块实现项目4目录01登录接口02盐值加密03拦截器和过滤器04Token和Redis的基本使用05登录接口全流程4.1JavaWeb应用开发项目教程(SpringBoot+Mybatis)登录接口@ServicepublicclassUserServiceImplimplementsUserService{@ResourceprivateUserMapperuserMapper;publicReturnT<User>login(StringuserName,Stringpassword){try{

Useruser=userMapper.login(userName,password);List<User>listUser=userMapper.checkUserName(userName);if(listUser.isEmpty()){returnReturnT.Failed("账号不存在。");}elseif(user!=null){returnReturnT.Success(user);}else{returnReturnT.Failed("密码不正确。");}}catch(Exceptione){returnReturnT.Failed(e.getMessage());}}}任务4.1登录接口publicclassReturnRandom{publicstaticStringgetCheckCode(){Stringbase="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";intsize=base.length();Randomr=newRandom();StringBuffersb=newStringBuffer();for(inti=1;i<=4;i++){//产生0到size-1的随机值intindex=r.nextInt(size);//在base字符串中获取下标为index的字符charc=base.charAt(index);//将c放入到StringBuffer中去sb.append(c);}returnsb.toString();}}先检查用户名是否存在,再检查用户名和密码是否正确4.2JavaWeb应用开发项目教程(SpringBoot+Mybatis)盐值加密1.信息加密信息加密是指将信息转化为任何第三方都无法读懂,只有发送方和接收方能看懂的信息。2.BCrypt加密BCrypt是一个基于Blowfish加密算法的密码哈希函数,专门用于安全地存储密码。BCrypt生成的哈希值不是一个简单的二进制串,而是一个自包含的、格式化的字符串,它包含了所有需要验证未来密码的必要信息。任务4.2盐值加密3.盐值加密盐值加密是一种增强密码安全性的方法,通过添加随机盐值来生成独特的哈希值。盐是一个随机生成的字符串或数字,与原始密码结合在一起进行哈希运算。由于盐是随机生成的,即使两个用户使用相同的密码,他们的哈希值也会不同。因此,即使黑客获取到了存储的哈希值,没有相应的盐值也无法解密出原始密码。任务4.2盐值加密BCrypt算法的特点:1.自动加盐:BCrypt会自动生成并管理盐值,不需要手动处理。2.抗彩虹表攻击:每个密码都有唯一的盐值,即使相同密码也会生成不同的哈希值。3.可调节的计算成本:可以通过参数控制哈希计算的复杂度,抵御暴力破解。4.内置验证机制:matches()方法会自动提取存储的哈希值中的盐值进行验证。任务4.2盐值加密4.3JavaWeb应用开发项目教程(SpringBoot+Mybatis)拦截器和过滤器拦截器是Spring框架提供的核心功能之一,主要用来拦截请求,并对请求进行处理。在实际开发中,我们可以使用拦截器来实现一些常见的功能,比如权限校验、日志记录、参数校验等。任务4.3拦截器和过滤器-拦截器publicclassMyInterceptorimplementsHandlerInterceptor{

publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println("拦截器MyInterceptor>1、请求之前调用,也就是controller方法调用之前。");returntrue;}

publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableModelAndViewmodelAndView)throwsException{System.out.println("拦截器MyInterceptor>2、请求之后调用,在视图渲染之前,也就是controller方法调用之后");}

publicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableExceptionex)throwsException{System.out.println("拦截器MyInterceptor>3、请求结束之后被调用,主要用于清理工作。");}

}WebConfig.java文件,实现WebMvcConfigurer接口的配置类(使用了@Configuration注解的类),重写addInterceptors()方法,并在该方法中调用registry.addInterceptor()方法将自定义的拦截器注册到容器中。addPathPatterns()方法用于指定拦截路径,例如拦截路径为/**,表示拦截所有请求,包括对静态资源的请求。excludePathPatterns()方法用于排除拦截路径,即指定不需要拦截的请求。任务4.3拦截器和过滤器-拦截器@ConfigurationpublicclassMyMvcConfigimplementsWebMvcConfigurer{……@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){("注册拦截器");registry.addInterceptor(newLoginInterceptor()).addPathPatterns("/**")//拦截所有请求,包括静态资源文件.excludePathPatterns("/","/login","/index.html","/user/login","/css/**","/images/**","/js/**","/fonts/**");//放行登录页,登录操作,静态资源}}过滤器是一种用于Web应用程序的组件,作用是对请求和响应进行处理和转换。它主要用于拦截和处理HTTP请求,对请求进行预处理和过滤,然后将请求传递给下一个过滤器或处理程序。任务4.3拦截器和过滤器-过滤器publicclassMyFilterimplementsFilter{@Override//初始化方法,只调用一次publicvoidinit(FilterConfigfilterConfig)throwsServletException{System.out.println("init初始化方法执行了");}

@Override//拦截到请求之后调用,调用多次publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{System.out.println("doFilter拦截到了请求...放行前逻辑");//放行chain.doFilter(request,response);}

@Override//销毁方法,只调用一次publicvoiddestroy(){System.out.println("destroy销毁方法执行了");}}‌doFilter()方法可以实现定义过滤逻辑,实现权限控制、日志记录、数据转换等功能‌。‌1.拦截请求‌:在请求到达Servlet或响应返回客户端之前,Filter会拦截这些请求。开发者可以在doFilter方法中添加自定义的逻辑,如权限检查、日志记录等‌。‌2.处理响应‌:在服务器的响应发送回客户端之前,Filter可以处理这些响应,例如压缩响应内容、添加安全头等‌。‌3.过滤器链‌:多个Filter按配置顺序形成链式处理,请求依次通过每个Filter,响应则反向传递。这种机制确保了请求和响应的处理顺序和逻辑的灵活性‌。任务4.3拦截器和过滤器-过滤器@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)servletRequest;HttpServletResponseresponse=(HttpServletResponse)servletResponse;StringrequestURI=request.getRequestURI();//判断当前请求的URL是否在白名单中if(whiteList.contains(requestURI)){//如果在白名单中,则直接放行filterChain.doFilter(servletRequest,servletResponse);}else{//如果不在白名单中,则进行相应的处理,例如重定向到其他页面或返回错误信息}}4.4JavaWeb应用开发项目教程(SpringBoot+Mybatis)Token和Redis的基本使用1.基本定义Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌。当第一次登录成功后,服务器生成一个Token,同时将Token发送给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。2.工作流程(1)客户端使用用户名和密码请求登录;(2)服务端收到请求,验证用户名和密码;(3)验证成功后,服务端会签发一个Token,再把这个Token返回给客户端;(4)客户端收到Token后可以把它存储起来,比如放到Cookie中;(5)客户端每次向服务端请求资源时需要携带服务端签发的Token,可以在Cookie或者Header中携带;(6)服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求数据。任务4.4

Token和Redis的基本使用Redis英文全称是RemoteDictionaryServer(远程字典服务),是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。常用方法如下。1.redisTemplate.hasKey(key)判断是否有key所对应的值,有则返回true,没有则返回false2.redisTemplate.opsForValue().get(key)取出key值所对应的值3.redisTemplate.delete(key)删除单个key值任务4.4

Token和Redis的基本使用4.设置过期时间publicBooleanexpire(Stringkey,longtimeout,TimeUnitunit){returnredisTemplate.expire(key,timeout,unit);}publicBooleanexpireAt(Stringkey,Datedate){returnredisTemplate.expireAt(key,date);}5.设置当前的key以及value值redisTemplate.opsForValue().set(key,value)6.设置当前的key以及value值并且设置过期时间redisTemplate.opsForValue().set(key,value,timeout,unit)任务4.4

Token和Redis的基本使用任务4.4

Token和Redis的基本使用-可视化连接界面任务4.4

Token和Redis的基本使用-存在数据和不存在数据4.5JavaWeb应用开发项目教程(SpringBoot+Mybatis)登录接口全流程1.用户登录用户登录成功,服务器会生成Token令牌,存储在服务器的Redis中并将其发送给客户端。2.客户端请求客户端在后续的请求中,将Token令牌携带在请求的Header中。3.服务器验证服务器在接收到请求后,会从请求的Header中获取Token令牌,和服务器Redis中的Token进行校验。4.授权访问在验证通过后,服务器会根据Token令牌中的用户数据,在过滤器中进行相应的授权操作,判断用户是否有权限访问请求的资源。如果授权通过,服务器会处理请求并返回相应的数据;如果授权不通过,则返回相应的错误信息。任务4.5登录接口全流程新建新闻表tb_news,并添加记录。本任务涉及user表和tb_news表。任务4.5登录接口全流程拦截器白名单为:/api/login、/api/logout、/api/register过滤器白名单为:/api/login、/api/logout、/api/registerpublicObjectlogin(StringuserName,Stringpassword){try{Useruser=userMapper.login(userName,password);List<User>listUser=userMapper.checkUserName(userName);if(listUser.isEmpty()){returnReturnT.Failed("账号不存在。");}elseif(user!=null){Stringtoken=createToken(user.getId());

Map<String,Object>map=newHashMap<>();map.put("code",200);map.put("msg","操作成功");map.put("token",token);returnmap;}else{returnReturnT.Failed("密码不正确。");}}catch(Exceptione){returnReturnT.Failed(e.getMessage());}}任务4.5登录接口全流程-UserServiceImpl.java文件中登录方法login()要返回Token值,所以将返回值类型定义为Object类型定义Object参数,并赋值//删除newsId的数据,需要判断newsId是否属于userIdpublicReturnT<News>deleteNews(StringnewsId,Stringtoken){try{intuserId=parseInt(redisClient.get(token));if(newsMapper.selectUserIdByNewsId(parseInt(newsId))==userId){newsMapper.deleteNews(parseInt(newsId));returnReturnT.Success();}returnReturnT.Failed("您没有权限");}catch(Exceptione){returnReturnT.Failed(e.getMessage());}}任务4.5登录接口全流程-NewsServiceImpl.java文件中登录方法deleteNews()被删除的新闻属于哪个用户登录用户@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{System.out.println("========do过滤器========");HttpServletRequestrequest=(HttpServletRequest)servletRequest;HttpServletResponseresponse=(HttpServletResponse)servletResponse;StringrequestURI=request.getRequestURI();if(whiteList.contains(requestURI)){filterChain.doFilter(servletRequest,servletResponse);}else{

Stringtoken=request.getHeader("token");System.out.println("token="+token);//据前端传递的Token,获取数据库中存储的用户ID,如果能获取到,则校验通过,否则提示用户Token已过期,需要用户重新登录等等。//redisClient.get(token)如果Token为空,会报错if(StringUtils.isNotEmpty(token)&&StringUtils.isNotEmpty(redisClient.get(token)))filterChain.doFilter(servletRequest,servletResponse);elseSystem.out.println("========走过滤器提示登录========");}}任务4.5登录接口全流程-MyFilter.java文件中的方法doFilter()访问接口如果是白名单,就放行。如果不是,要判断是否登录获取前端传递来的Token如果没有Token或者Token和Redis中的不一致,就要提示登录1.获取该用户的新闻测试效果图任务4.5登录接口全流程2.删除数据没有权限测试效果图登录模块实现项目4个人博客系统项目5目录01日志打印02自增ID和UUID03跨表显示数据04多表查询05事务回滚06用户、角色和权限5.1JavaWeb应用开发项目教程(SpringBoot+Mybatis)日志打印1.记录用户登录日志,方便分析用户是正常登录还是恶意破解用户;2.记录系统的操作日志,方便数据恢复和定位操作人;3.记录程序的执行时间,方便为以后优化程序提供数据支持。任务5.1

日志打印-日志作用SLF4J将日志分为TRACE、DEBUG、INFO、WARN、ERROR五个级别,每个级别对应记录不同的日志,适用于不同的使用场景。1.TRACE:最低级别的日志记录,用于追踪程序的详细执行路径和调试信息。2.DEBUG:用于记录调试信息,例如变量的值、方法的执行情况等。3.INFO:用于记录程序的正常运行信息,例如应用程序启动、关键操作完成等。4.WARN:用于记录警告信息,表示程序可能存在潜在的问题或异常情况。5.ERROR:最高级别的日志记录,用于记录错误信息和异常情况。任务5.1

日志打印-日志分类1.打印时间:日志事件发生的日期和时间。2.日志级别:日志事件的严重程度,如DEBUG、INFO、WARN、ERROR等。3.线程ID:产生日志事件的线程ID号。4.线程名称:产生日志事件的线程名。5.执行的类名:产生日志事件的日志类名或用户定义的日志标识。6.日志消息:开发者自定义的日志信息。任务5.1

日志打印-日志信息IDEA→File→Settings→Plugins,安装Lombok插件。任务5.1

日志打印-安装Lombok插件application.yml代码:logging:file:

name:mylog.log

path:E:/SpringBoot/level:root:error#全局日志级别com.example.demo.controller.LogTestController:infocom.example.demo.controller.LogController:trace任务5.1

日志打印-代码实现LogController.java代码:@Slf4j@RestController@RequestMapping("/api")publicclassLogController{@RequestMapping("/log")publicvoidprintLog(){log.trace("Iamtrace");log.debug("Iamdebug");("Iaminfo");log.warn("Iamwarn");log.error("Iamerror");}}指定日志文件的路径与名字指定日志文件的路径任务5.1

日志打印-测试结果1.使用生成mylog.log日志文件2.使用logging.file.path生成spring.log日志文件5.2JavaWeb应用开发项目教程(SpringBoot+Mybatis)自增ID和UUID自增ID是指数据库自增长的字段,在插入时自动生成,从1开始连续增加。自增ID的优缺点如下:优点:有序的增加、查询速度快、写入效率高、节省磁盘的空间、易读、性能好。缺点:仅适用于单个数据库中的数据,无法实现跨数据库或跨系统的唯一标识,因而难以分布式存储;同时,当出现频繁的插入或删除操作时,自增ID也会出现性能问题。任务5.2

自增ID和UUID-自增IDUUID是指UniversallyUniqueIdentifier,翻译为中文是通用唯一识别码,UUID的目的是让分布式系统中的所有元素都能有唯一的识别信息。UUID是由一组32位数的16进制数字所构成,以连字号分隔的五组来显示,形式为8-4-4-4-12,总共有36个字符(即32个英数字母和4个连字号)。例如:123e4567-e89b-12d3-a456-426655440000UUID的优缺点如下:优点:唯一性非常好,可以避免出现ID冲突的情况,一般用于跨系统的数据交换,或者当需要主键值在本地产生而又需要保证唯一性,较适用于分布式系统,同时对性能要求不高。缺点:数据量大的时候会消耗性能、生成位数较长。任务5.2

自增ID和UUID-UUIDMyBatis实现自增ID有两种方法1.自增主键,使用useGeneratedKeys+keyProperty组合的方式MyBatis中SQL语句如下:<insertid="insert"parameterType="user"useGeneratedKeys="true"keyProperty="id">INSERTINTOuserinfo(user_name,user_tel)VALUES(#{userName},#{tel})</insert>‌useGeneratedKeys="true"表示使用JDBC的getGeneratedKeys()方法获取数据库生成的主键值。keyProperty="id"表示将生成的主键值自动回填到插入数据对应的对象属性中,以便在后续的业务逻辑中使用,而不需要再次查询数据库。在INSERT语句中,不需要显式地插入id,只需要插入其他字段即可。任务5.2

自增ID和UUID-自增ID实现方法2.使用MyBatis的selectKey元素MyBatis中SQL语句如下:<insertid="insert"parameterType="user"><selectKeykeyProperty="id"order="AFTER"resultType="java.lang.Integer">SELECTLAST_INSERT_ID()</selectKey>INSERTINTOuserinfo(user_name,user_tel)VALUES(#{userName},#{tel})</insert>‌SELECTLAST_INSERT_ID()方法用于获取最后插入记录的自增主键值‌。order="AFTER"表示在插入操作完成后获取主键。在INSERT语句中,不需要显式地插入id,只需要插入其他字段即可。任务5.2

自增ID和UUID-自增ID实现方法MyBatis实现UUID<insertid="insert"parameterType="stu"><selectKeykeyProperty="id"order="BEFORE"resultType="java.lang.string">SELECTUUID()</selectKey>INSERTINTOstu(id,name,sex)VALUES(#{id},#{name},#{sex})</insert>UUID()是MySQL的内置函数,用于生成一个唯一的UUID值。SELECTUUID()用于生成一个新的UUID,返回到keyProperty指定id中。任务5.2

自增ID和UUID-UUID实现方法5.3JavaWeb应用开发项目教程(SpringBoot+Mybatis)跨表显示数据<resultMapid="BaseResultMap"type="ArticleClass"><resultcolumn="article_class_id"jdbcType="INTEGER"property="articleClassId"/><resultcolumn="article_class_name"jdbcType="VARCHAR"property="articleClassName"/><!--自定义的字段--><resultcolumn="article_num"jdbcType="VARCHAR"property="articleNum"/></resultMap><selectid="selectArticleNum"resultMap="BaseResultMap">SELECTarticle_class_id,article_class_name,(SELECTCOUNT(*)FROMtb_articleWHEREtb_article.article_class_id=tb_article_class.article_class_id)ASarticle_numFROMtb_article_class;</select>任务5.3

跨表显示数据-ArticleClassMapping.xml文件5.4JavaWeb应用开发项目教程(SpringBoot+Mybatis)多表查询tb_team(球队)、tb_coach(教练)、tb_player(球员)、tb_match(比赛)。1.一对一关系tb_team和tb_coach是一对一关系,建立新类TeamCoach,其成员对象为:TeamCoach类成员对象=Team类成员对象+Coach对象。MyBatis数据结构映射为:<!--配置关联实体类TeamCoach--><resultMapid="BaseResultMap"type="TeamCoach"><!--用于配置tb_team表字段与Team类属性之间的映射关系。--><!--一对一映射--><associationproperty="Coach"javaType="Coach"><!--用于配置tb_coach表字段与Coach类属性之间的映射关系。--></association></resultMap>任务5.4

多表查询2.一对多关系tb_team和tb_player是一对多关系,建立新类TeamPlayer,其成员对象为:TeamPlayer类成员对象=Team类成员对象+List<Player对象>。MyBatis数据结构映射为:<!--配置关联实体类TeamPlayer--><resultMapid="BaseResultMap"type="TeamPlayer"><!--用于配置tb_team表字段与Team类属性之间的映射关系。--><!--一对多映射--><collectionproperty="playerList"ofType="Player"><!--用于配置tb_player表字段与Player类属性之间的映射关系。--></collection></resultMap>任务5.4

多表查询3.多对多关系tb_player和tb_match是一对多关系(1)建立新类PlayerMatch,其成员对象为:PlayerMatch类成员对象=Player类成员对象+List<Match对象>。MyBatis数据结构映射为:<!--配置关联实体类PlayerMatch--><resultMapid="BaseResultMap"type="PlayerMatch"><!--用于配置tb_player表字段与Player类属性之间的映射关系。--><!--一对多映射--><collectionproperty="matchList"ofType="Match"><!--用于配置tb_match表字段与Match类属性之间的映射关系。--></collection></resultMap>任务5.4

多表查询(2)建立新类MatchPlayer,其成员对象为:MatchP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论