MySQL数据库常用数据源:
spring:
datasource:
username: root
password: root
#?serverTimezone=UTC解决时区的报错
url: jdbc:mysql://localhost:3306/book?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
#Spring Boot 默认是不注入这些属性值的,需要自己绑定
#druid 数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
mvc:
static-path-pattern: /**
web:
resources:
static-locations: [ 'classpath:/static/' ]
MyBatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace =绑定接口-->
<mapper namespace="com.book.mapper.UserMapper">
<!-- 这里的id为方法名 resultTYpe为返回的类型 parameterType参数类型-->
<select id="SelectAll" resultType="com.book.pojo.User">
select * from user_info;
</select>
<!-- 查询admin密码 -->
<select id="ByAdmin" resultType="string" parameterType="string">
select pwd from admin where name=#{name}
</select>
</mapper>
Swagger:
依赖:
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
config常用配置:
package com.hu.SpringBoot01.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration //说明这是一个配置类
@EnableSwagger2//该注解开启Swagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
//添加head参数配置start
ParameterBuilder tokenPar = new ParameterBuilder();
List<Parameter> pars = new ArrayList<>();
tokenPar.name("Authorization").description("令牌")//请求头,测试token时可以用到
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false)
.build();
pars.add(tokenPar.build());
return new Docket(DocumentationType.SWAGGER_2)
.groupName("webApi")
.apiInfo(webApiInfo())
.select()
//扫描的路径包,会将包下的所有被@Api标记类的所有方法作为api
.apis(RequestHandlerSelectors.basePackage("com.hu.SpringBoot01.controller"))
.paths(PathSelectors.any())//所有接口
.build()
.globalOperationParameters(pars);
}
private ApiInfo webApiInfo() {
return new ApiInfoBuilder()
//标题
.title("lzl的swagger案例Demo")
//描述
.description("用于讲解关于swagger的基本配置使用以及注解")
//许可
.license("lzl 2021/06/13")
//许可链接
.licenseUrl("https://blog.csdn.net/qq_26103133?spm=1001.2101.3001.5343")
//服务条款网址
.termsOfServiceUrl("www.spring.io")
//版本
.version("1.0")
//维护人信息
.contact(new Contact("陆宇轩","www.lzl.com","287547683@qq.com"))
.build();
}
}
常用注解:
名称 使用 描述
@Api controller类上 对请求类的说明
@ApiIgnore controller类上 隐藏类swagger不会显示
@ApiModel 实体类上 说明实体类的用途
@ApiModelProperty 实体类参数上 说明实体类属性的的含议
@JsonIgnore 实体类参数上 隐藏该实体类属性
@ApiOperation 方法上 方法的说明
@ApiImplicitParams 方法上组合使用 方法的参数的说明
@ApiImplicitParam 方法上 用于指定单个参数的说
@ApiResponses 方法上组合使用 方法返回值状态码的说明
@ApiResponse 方法上 指定单个返回值状态码的说明
@ApiParam 方法参数上 单个方法参数
SpringBoot3x以上用SpringDoc
为什么使用SpringDoc呢?
因为集成SpringFox只支持SpringBoot2.x,而基于Swagger的SpringDoc的社区现在十分活跃,版本不断更新。SpringFox自从2020年7月14号之后就不更新了。
SpringDoc也是Spring官方推荐的API。
相关xml依赖
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.0.2</version>
</dependency>
<!-- 官方建议是springdoc替代springfox-->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
配置文件
springdoc:
swagger-ui:
path: /swagger-ui.html
本地类
package com.example.Config;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI springShopOpenAPI() {
return new OpenAPI()
.info(new Info().title("失物招领系统")
.description("失物招领系统API文档")
.version("v1")
.license(new License().name("Apache 2.0").url("http://springdoc.org")))
.externalDocs(new ExternalDocumentation()
.description("外部文档")
.url("https://gitee.com/Easonluandchen"));
}
}
常用注解:
@Tag(name = "用户管理")
@Operation(summary = "用户信息获取")
shoir:
依赖:
dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.5.3</version>
</dependency>
用法:
config:
package com.config;
import com.Service.ShiroService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
/**
* 自定义Realm继承AuthorizingRealm
* */
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//授权
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//设置权限
info.addStringPermission("李四:toLogin");
return null;
}
@Autowired
public ShiroService service;
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken Token) throws AuthenticationException {
//认证
String principal = (String)Token.getPrincipal();
String password = service.Login(principal).getPassword();
return new SimpleAuthenticationInfo(
""
, password
, "");
}
}
package com.config;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ShiroConfig {
@Bean
public Subject GetSubject(@Qualifier("securityManager")DefaultSecurityManager defaultWebSecurityManager){
//设置安全管理器
SecurityUtils.setSecurityManager(defaultWebSecurityManager);
Subject subject = SecurityUtils.getSubject();
return subject;
}
//DefaultWebSecurityManager
@Bean(name="securityManager")
public DefaultSecurityManager getDefaultSecurityManager(@Qualifier("MyRealm") MyRealm myRealm){
DefaultSecurityManager securityManager = new DefaultSecurityManager();
//关联UserRealm
securityManager.setRealm(myRealm);
return securityManager;
}
//创建realm对象 ,需要自定义
@Bean
public MyRealm MyRealm(){
return new MyRealm();
}
}
用法:登录功能
package com.controller;
import com.config.ShiroConfig;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class ShiroController {
@Autowired
private ShiroConfig shiroConfig;
@RequestMapping("/toLogin")
public String Login(Model model,@RequestParam("name")String name,
@RequestParam("password")String password){
System.out.println(name+"+++++++"+password);
Subject subject = SecurityUtils.getSubject();
//登录认证
UsernamePasswordToken token = new UsernamePasswordToken(name,password);
try {
//如账号不存在或密码错误等等,需要根据不同的异常类型来判断用户的登录状态,并给予友好的信息提示
//调用login后,Shiro就会自动执行自定义的Realm中的认证方法
subject.login(token);
return "Test";
} catch (UnknownAccountException e) {
//表示用户的账号错误,这个异常是在后台抛出
System.out.println("---------------账号不存在");
model.addAttribute("errorMessage","账号不存在");
return "Login";
}catch (LockedAccountException e){
//表示用户的账号被锁定,这个异常是在后台抛出
System.out.println("===============账号被锁定");
model.addAttribute("errorMessage","账号被冻结");
return "Login";
}catch (IncorrectCredentialsException e){
//表示用户的密码错误,这个异常是shiro在认证密码时抛出
System.out.println("***************密码不匹配");
model.addAttribute("errorMessage","密码错误");
return "login";
}
}
}
Redis:
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
yaml:
spring:
redis:
# 地址
host: 192.168.200.140
# 端口,默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password: 123456
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
Config:
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
private final StringRedisTemplate template;
public MyBean(StringRedisTemplate template) {
this.template = template;
}
// ...
public Boolean someMethod() {
return this.template.hasKey("spring");
}
}