SpringBoot笔记
目录
1.yaml配置
server:
port: 8081
servlet:
context-path: /rain #tomact写的项目地址
---
server:
port:8082
spring:
profiles: dev #部署
---
server:
port:8083
spring:
profiles: test #调试
#关闭模板引擎缓存
spring:
thymeleaf:
cache: false
#配置国际化文件位置
messages:
basename: i18n\login
#数据库配置
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/stutext?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource #druida连接池
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
2.静态资源位置
web配置类 WebMvcAutoConfiguration
http://localhost:8081/1.js
resources > static > public
3.Thymeleaf
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING;
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";
private boolean checkTemplate = true;
private boolean checkTemplateLocation = true;
private String prefix = "classpath:/templates/";
private String suffix = ".html";
private String mode = "HTML";
使用:
@Controller // 返回视图 RestController 返回数据
public class HelloSpringBootControllet {
@GetMapping("/hello")
public String hello(Model model){
model.addAttribute("mage","<h1>你好</h1>");
return "index";
}
}
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head></head>
<body>
<div th:text="${mage}"></div>
<div th:utext="${mage}"></div> //编译
</body>
</html>
th:href="@{/index.html(l='zn_CN')} // 超链接+参数
<input type="checkbox" value="remember-me"> [[#{login.remember}]]
<h1 th:text="#{login.tip}">sign</h1>
<form class="form-signin" th:action="@{/user/login}" method="post"> //表单提交
4.lombok
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
@Data
@AllArgsConstructor //所有的构造方法
@NoArgsConstructor //无参构造方法
public class Department {
private Integer id;
private String depatmentName;
}
5.SpringMVC
XML配置
package com.rain.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//实现接口,重写方法
@Configuration
public class MvcConfig implements WebMvcConfigurer {
//视图跳转
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("/dashboard.html").setViewName("dashboard");
}
}
后台国际化
编写文件

实现接口,重写方法
//国际化解析器
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
String name = httpServletRequest.getParameter("l");
Locale locale = Locale.getDefault(); //如果没有就是用默认的
if (!StringUtils.isEmpty(name)) {
String[] s = name.split("_");
//国家地区
locale = new Locale(s[0], s[1]);
}
return locale;
}
装配
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
return new MyLocaleResolver();
}
拦截器
package com.rain.config;
public class LoginHeadler implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object loginname = request.getSession().getAttribute("loginname");
if (1 != 1) {
request.getRequestDispatcher("index.html").forward(request,response);
return false;
} else {
return true;
}
}
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHeadler()).
addPathPatterns("/**"). //拦截全部
excludePathPatterns("/"); //放行
}
整合mybatis + druid
- 加依赖
<!--mybatis整合-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
- yaml配置
#数据库配置
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/stutext?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource #druida连接池
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
#整合mybatis
mybatis:
type-aliases-package: com.rain.domain #重命名实体类,直接名字即可
mapper-locations: classpath:mybatis/mapper/*.xml
3.编写mapper接口
@Mapper //映射
@Repository //dao层注解
public interface CourseMapper {
List<Course> queryList();
}
//映射也可以去扫描
@MapperScan("com.rain.ampper")
@SpringBootApplication //标注这个类是springboot的应用
public class DemoTextApplication {
public static void main(String[] args) {
SpringApplication.run(DemoTextApplication.class, args);
}
}
4.编写xml

6.SpringSecurity
1.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.config配置

package com.rain.config;
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//授权
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll() //首页所有人都可以访问
.antMatchers("/level1/**").hasRole("vip1") //功能页对应权限才能访问
.antMatchers("/level2/**").hasRole("vip2")
.antMatchers("/level3/**").hasRole("vip3");
//没有权限就直接去登录界面
http.formLogin();
//注销,成功回到主页
http.logout().logoutSuccessUrl("/");
//开启记住我 cookie保存两周
http.rememberMe().rememberMeParameter("name");//name是标签的name属性
}
//认证
//存在密码编码
//加密 passwordEncoder
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("rain").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2")
.and()
.withUser("root").password(new BCryptPasswordEncoder().encode("123")).roles("vip1", "vip2", "vip3");
}
}
7.shiro
1.依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.7.1</version>
</dependency>
2.自定义UserRealm
package com.rain.config;
//自定义UserRealm
public class UserRealm extends AuthorizingRealm {
@Autowired
UserServicesImpl services;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection Collection) {
System.out.println("+++++++++++++执行了授权");
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//获得当前对象
Subject subject = SecurityUtils.getSubject();
User user = (User) subject.getPrincipal();
info.addStringPermission(user.getState());//属性应该存到数据库
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("+++++++++++++执行了认证");
//获取当前用户
UsernamePasswordToken token1 = (UsernamePasswordToken) token;
User user = services.queryUserByname(token1.getUsername());
if (user == null){
return null;//这里返回null表示name错
} //第一个参数存入,上面授权才能拿到
return new SimpleAuthenticationInfo(user,user.getPassword(),"");
//最后返回比对密码,密码错误返回null表示密码错误,正确去授权
}
}
3.ShiroConfig
package com.rain.config;
@Configuration //告诉springboot这是一个配置类,配置文件
public class ShiroConfig {
@Bean(name = "shiroFilterFactoryBean")
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加shiro过滤器
/*
anon : 无需认证就可以访问
authc : 必须认证才能访问
user : 必须拥有 记住我功能才能实现
perms : 拥有对某个资源权限才能访问
role : 拥有某个角色权限才能访问
*/
Map<String, String> filterMap = new LinkedHashMap<>();
//filterMap.put("/add", "authc"); //权限 支持*
filterMap.put("/add","perms[user:add]");
filterMap.put("/updata","perms[user:updata]");
bean.setFilterChainDefinitionMap(filterMap);
//设置登录的请求
bean.setLoginUrl("/tologin");
//设置未授权页面
bean.setUnauthorizedUrl("/1.html");
return bean;
}
//DefaultWebSecurityManager
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联UserRealm
securityManager.setRealm(userRealm);
return securityManager;
}
//给容器中添加组件,以方法名作为组件id,返回类型就是组件类型,返回的值就是组件在容器中的实例
//创建Reaml对象,需要自定义类
@Bean//name默认是方法名,也可以自定义
public UserRealm userRealm() {
return new UserRealm();
}
}
4.登录请求处理

@RequestMapping("/login")
public String login(String username, String password, Model model) {
//获取shiro工具
Subject subject = SecurityUtils.getSubject();
//封装用户登录信息
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);//执行登录方法,没有异常就说明登陆成功
} catch (UnknownAccountException e) {
model.addAttribute("msg", "用户名错误");
return "/login";
} catch (IncorrectCredentialsException e) {
model.addAttribute("msg", "密码错误");
return "/login";
}
return "/index";
}
5.shiro和springsecurity
在隐藏没有权限的页面时,需要加入整合依赖,装配和在html标签里面写属性
8.Swagger
1.依赖
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!-- 引入swagger-bootstrap-ui包 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.8.3</version>
</dependency>
2.配置
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
@Profile("dev")
public Docket creatRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(b) //配置是否启用Swagger,如果是false,在浏览器将无法访问
.select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
.apis(RequestHandlerSelectors.basePackage("com.rain.swagger.controller"))
// 配置如何通过path过滤,即这里只扫描请求以/hello开头的接口
.paths(PathSelectors.ant("/hello/**"))
.build();
}
//配置信息
private ApiInfo apiInfo() {
Contact DEFAULT_CONTACT = new Contact("rain", "", "");
return new ApiInfo("Api Documentation",
"Api Documentation",
"1.0",
"urn:tos",
DEFAULT_CONTACT,
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList());
}
}
3.访问地址
http://localhost:8080/swagger-ui/index.html //传统界面
http://localhost:8080/doc.html //bootstartui界面
4.配置分组
@Bean
public Docket docket1(){
return new Docket(DocumentationType.SWAGGER_2).groupName("group1");
}
@Bean
public Docket docket2(){
return new Docket(DocumentationType.SWAGGER_2).groupName("group2");
}
@Bean
public Docket docket3(){
return new Docket(DocumentationType.SWAGGER_2).groupName("group3");
}
5.注释
@RestController
@Api(tags = "你好Controllet")
public class HelloControllet {
@ApiOperation(value = "方法描述", tags = "重新分组", notes = "提示内容")
@GetMapping("/hello") //是否必须注释
public String hello(@ApiParam(name="phone",value="用户手机号",required=true)String phone) {
return "hello";
}
}
//登录模型
@ApiModel
public class LoginVo {
@ApiModelProperty("电话号码")
private String mobile;
@ApiModelProperty("密码")
private String password;
}
9.任务
1.异步任务
@SpringBootApplication
@EnableAsync //开启异步注解任务 Enable是开启什么权限
public class TaskApplication {
public static void main(String[] args) {
SpringApplication.run(TaskApplication.class, args);
}
}
@Service
public class AsyncServices {
@Async //方法添加注解 异步
public void loding() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理");
}
2.发送邮箱
1.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.配置文件
spring.mail.username=24736743@qq.com
spring.mail.password=你的qq授权码
spring.mail.host=smtp.qq.com
# qq需要配置ssl
spring.mail.properties.mail.smtp.ssl.enable=true
3.调用
@Autowired
JavaMailSenderImpl mailSender;
@Test
public void contextLoads() {
//邮件设置1:一个简单的邮件
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("通知-明天来狂神这听课");
message.setText("今晚7:30开会");
message.setTo("24736743@qq.com");
message.setFrom("24736743@qq.com");
mailSender.send(message);
}
@Test
public void contextLoads2() throws MessagingException {
//邮件设置2:一个复杂的邮件
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setSubject("通知-明天来狂神这听课");
helper.setText("<b style='color:red'>今天 7:30来开会</b>",true);
//发送附件
helper.addAttachment("1.jpg",new File(""));
helper.addAttachment("2.jpg",new File(""));
helper.setTo("24736743@qq.com");
helper.setFrom("24736743@qq.com");
mailSender.send(mimeMessage);
}
3.定时任务
TaskExecutor 任务执行器
TaskScheduler 任务调度器
@EnableScheduling //开启定时任务
Cron表达式
//cron
@Scheduled(cron = "0 * * * * 0-7")
public void hello() {
System.out.println("hello.....");
}


浙公网安备 33010602011771号