server.servlet.session.timeout=30m
|
session 失效时间,m 表示分钟,如果不写单位,默认是秒 s
|
|
server.servlet.context-path=/
|
项目名称,不配置时默认为/。配置后,访问时需加上前缀
|
|
server.tomcat.uri-encoding=utf-8
|
Tomcat 请求编码格式
|
|
server.tomcat.max-threads=500
|
Tomcat 最大线程数
|
|
server.tomcat.basedir=/home/tmp
|
Tomcat 运行日志和临时文件的目录,如不配置,默认使用系统的临时目录
|
HTTPS 配置
配置名 解释
| | |
| — | — |
|
server.ssl.key-store=xxx
|
秘钥文件名
|
|
server.ssl.key-alias=xxx
|
秘钥别名
|
|
server.ssl.key-store-password=123456
|
秘钥密码
|
想要详细了解如何配置 HTTPS
,可以参考这篇文章 Spring Boot 使用SSL-HTTPS
@ConfigurationProperties
这个注解可以放在类上或者 @Bean
注解所在方法上,这样 SpringBoot
就能够从配置文件中,读取特定前缀的配置,将属性值注入到对应的属性。
使用例子:
@Configuration
@ConfigurationProperties(prefix = “spring.datasource”)
public class DruidConfigBean {
private Integer initialSize;
private Integer minIdle;
private Integer maxActive;
private List customs;
…
}
application.properties
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.customs=test1,test2,test3
其中,如果对象是列表结构,可以在配置文件中使用 , 逗号进行分割,然后注入到相应的属性中。
Profile
使用该属性,可以快速切换配置文件,在 SpringBoot
默认约定中,不同环境下配置文件名称规则为 application-{profile}.propertie
,profile
占位符表示当前环境的名称。
1、配置 application.properties
spring.profiles.active=dev
2、在代码中配置 在启动类的 main
方法上添加 setAdditionalProfiles("{profile}")
;
SpringApplicationBuilder builder = new SpringApplicationBuilder(SpringBootLearnApplication.class);
builder.application().setAdditionalProfiles(“prod”);
builder.run(args);
3、启动参数配置
java -jar demo.jar --spring.active.profile=dev
@ControllerAdvice 用来处理全局数据
@ControllerAdvice
是 @Controller
的增强版。主要用来处理全局数据,一般搭配 @ExceptionHandler
、@ModelAttribute
以及 @InitBinder
使用。
@ExceptionHandler 错误处理
/**
* 加强版控制器,拦截自定义的异常处理
*/
@ControllerAdvice
public class CustomExceptionHandler {
// 指定全局拦截的异常类型,统一处理
@ExceptionHandler(MaxUploadSizeExceededException.class)
public void uploadException(MaxUploadSizeExceededException e, HttpServletResponse response) throws IOException {
response.setContentType(“text/html;charset=utf-8”);
PrintWriter out = response.getWriter();
out.write(“上传文件大小超出限制”);
out.flush();
out.close();
}
}
@ModelAttribute 视图属性
@ControllerAdvice
public class CustomModelAttribute {
//
@ModelAttribute(value = “info”)
public Map<String, String> userInfo() throws IOException {
Map<String, String> map = new HashMap<>();
map.put(“test”, “testInfo”);
return map;
}
}
@GetMapping(“/hello”)
public String hello(Model model) {
Map<String, Object> map = model.asMap();
Map<String, String> infoMap = (Map<String, String>) map.get(“info”);
return infoMap.get(“test”);
}
-
key : @ModelAttribute
注解中的value
属性 -
使用场景:任何请求
controller
类,通过方法参数中的Model
都可以获取value
对应的属性 -
关注公众号Java后端编程,回复 Java 获取最新学习资料 。
CORS 支持,跨域资源共享
CORS(Cross-Origin Resource Sharing)
,跨域资源共享技术,目的是为了解决前端的跨域请求。
“
引用:当一个资源从与该资源本身所在服务器不同的域或端口请求一个资源时,资源会发起一个跨域HTTP请求
”
详细可以参考这篇文章-springboot系列文章之实现跨域请求(CORS),这里只是记录一下如何使用:
例如在我的前后端分离 demo
中,如果没有通过 Nginx
转发,那么将会提示如下信息:
“
Access to fetch at ‘http://localhost:8888/login‘ from origin ‘http://localhost:3000‘ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: The value of the ‘Access-Control-Allow-Credentials’ header in the response is ‘’ which must be ‘true’ when the request’s credentials mode is ‘include’
”
为了解决这个问题,在前端不修改的情况下,需要后端加上如下两行代码:
// 第一行,支持的域
@CrossOrigin(origins = “http://localhost:3000”)
@RequestMapping(value = “/login”, method = RequestMethod.GET)
@ResponseBody
public String login(HttpServletResponse response) {
// 第二行,响应体添加头信息(这一行是解决上面的提示)
response.setHeader(“Access-Control-Allow-Credentials”, “true”);
return HttpRequestUtils.login();
}
注册 MVC 拦截器
在 MVC
模块中,也提供了类似 AOP
切面管理的扩展,能够拥有更加精细的拦截处理能力。
核心在于该接口:HandlerInterceptor
,使用方式如下:
/**
* 自定义 MVC 拦截器
*/
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在 controller 方法之前调用
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在 controller 方法之后调用
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在 postHandle 方法之后调用
}
}
注册代码:
/**
* 全局控制的 mvc 配置
*/
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
// 表示拦截的 URL
.addPathPatterns(“/**”)
// 表示需要排除的路径
.excludePathPatterns(“/hello”);
}
}
拦截器执行顺序:preHandle
-> controller
-> postHandle
-> afterCompletion
,同时需要注意的是,只有 preHandle
方法返回 true
,后面的方法才会继续执行。
开启 AOP 切面控制
切面注入是老生常谈的技术,之前学习 Spring
时也有了解,可以参考我之前写过的文章参考一下:
Spring自定义注解实现AOP
Spring 源码学习(八) AOP 使用和实现原理
在 SpringBoot
中,使用起来更加简便,只需要加入该依赖,使用方法与上面一样。
org.springframework.boot
spring-boot-starter-aop
整合 Mybatis 和 Druid
SpringBoot
整合数据库操作,目前主流使用的是 Druid
连接池和 Mybatis
持久层,同样的,starter
提供了简洁的整合方案
项目结构如下:
一、添加 mybatis 和 druid 依赖
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
com.alibaba
druid-spring-boot-starter
1.1.18
二、配置数据库和连接池参数
# 数据库配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=12345678
# druid 配置
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=20
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-wait=60000
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
spring.datasource.druid.max-open-prepared-statements=20
spring.datasource.druid.validation-query=SELECT 1
spring.datasource.druid.validation-query-timeout=30000
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.test-on-return=false
spring.datasource.druid.test-while-idle=false
#spring.datasource.druid.time-between-eviction-runs-millis=
#spring.datasource.druid.min-evictable-idle-time-millis=
#spring.datasource.druid.max-evictable-idle-time-millis=10000
# Druid stat filter config
spring.datasource.druid.filters=stat,wall
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
# session 监控
spring.datasource.druid.web-stat-filter.session-stat-enable=true
spring.datasource.druid.web-stat-filter.session-stat-max-count=10
spring.datasource.druid.web-stat-filter.principal-session-name=admin
spring.datasource.druid.web-stat-filter.principal-cookie-name=admin
spring.datasource.druid.web-stat-filter.profile-enable=true
# stat 监控
spring.datasource.druid.web-stat-filter.exclusions=.js,.gif,.jpg,.bmp,.png,.css,.ico,/druid/
spring.datasource.druid.filter.stat.db-type=mysql
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=1000
spring.datasource.druid.filter.stat.merge-sql=true
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=mysql
spring.datasource.druid.filter.wall.config.delete-allow=true
spring.datasource.druid.filter.wall.config.drop-table-allow=false
# Druid manage page config
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
#spring.datasource.druid.stat-view-servlet.allow=
#spring.datasource.druid.stat-view-servlet.deny=
spring.datasource.druid.aop-patterns=cn.sevenyuan.demo.*
三、其他 mybatis 配置
本地工程,将 xml
文件放入 resources
资源文件夹下,所以需要加入以下配置,让应用进行识别:
src/main/resources
**/*
…
通过上面的配置,我本地开启了三个页面的监控:SQL
、 URL
和 Sprint
监控,如下图:
通过上面的配置,SpringBoot 很方便的就整合了 Druid 和 mybatis,同时根据在 properties
文件中配置的参数,开启了 Druid
的监控。
但我根据上面的配置,始终开启不了 session
监控,所以如果需要配置 session
监控或者调整参数具体配置,可以查看官方网站
整合 Redis
我用过 Redis
和 NoSQL
,但最熟悉和常用的,还是 Redis
,所以这里记录一下如何整合
一、引用 Redis 依赖
org.springframework.boot
spring-boot-starter-data-redis
lettuce-core
io.lettuce
redis.clients
jedis
二、参数配置
# redis 配置
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.max-wait=-1ms
spring.redis.jedis.pool.min-idle=0
三、代码使用
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping(“/testRedis”)
public Book getForRedis() {
ValueOperations<String, String> ops1 = stringRedisTemplate.opsForValue();
ops1.set(“name”, “Go 语言实战”);
String name = ops1.get(“name”);
System.out.println(name);
ValueOperations ops2 = redisTemplate.opsForValue();
Book book = (Book) ops2.get(“b1”);
if (book == null) {
book = new Book(“Go 语言实战”, 2, “none name”, BigDecimal.ONE);
ops2.set(“b1”, book);
}
return book;
}
这里只是简单记录引用和使用方式,更多功能可以看这里:
发送 HTML 样式的邮件
之前也使用过,所以可以参考这篇文章:
一、引入依赖
org.springframework.boot
spring-boot-starter-mail
org.springframework.boot
spring-boot-starter-thymeleaf
二、配置邮箱的参数
spring.mail.host=smtp.qq.com
spring.mail.port=465
spring.mail.username=xxxxxxxx
spring.mail.password=xxxxxxxx
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.debug=true
如果使用的是 QQ
邮箱,需要在邮箱的设置中获取授权码,填入上面的 password
中
三、写模板和发送内容
MailServiceImpl.java
@Autowired
private JavaMailSender javaMailSender;
@Override
public void sendHtmlMail(String from, String to, String subject, String content) {
try {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
javaMailSender.send(message);
} catch (MessagingException e) {
System.out.println(“发送邮件失败”);
log.error(“发送邮件失败”, e);
}
}
mailtemplate.html
test.java
@Autowired
private MailService mailService;
@Autowired
private TemplateEngine templateEngine;
@Test
public void sendThymeleafMail() {
Context context = new Context();
context.setVariable(“subject”, “图书清册”);
List books = Lists.newArrayList();
books.add(new Book(“Go 语言基础”, 1, “nonename”, BigDecimal.TEN));
books.add(new Book(“Go 语言实战”, 2, “nonename”, BigDecimal.TEN));
books.add(new Book(“Go 语言进阶”, 3, “nonename”, BigDecimal.TEN));
context.setVariable(“books”, books);
String mail = templateEngine.process(“mailtemplate.html”, context);
mailService.sendHtmlMail(“xxxx@qq.com”, “xxxxxxxx@qq.com”, “图书清册”, mail);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。
这些面试题相对应的技术点:
- JVM
- MySQL
- Mybatis
- MongoDB
- Redis
- Spring
- Spring boot
- Spring cloud
- Kafka
- RabbitMQ
- Nginx
- …
大类就是:
- Java基础
- 数据结构与算法
- 并发编程
- 数据库
- 设计模式
- 微服务
- 消息中间件
动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-FftrFEKX-1711893028578)]
[外链图片转存中…(img-jTTCzJds-1711893028578)]
[外链图片转存中…(img-iVJ1eOc4-1711893028579)]
[外链图片转存中…(img-XI06wMnp-1711893028579)]
[外链图片转存中…(img-ZFlvCBRj-1711893028580)]
[外链图片转存中…(img-Vz7lGjtW-1711893028580)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-HOVMFjof-1711893028580)]
最后
分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。
这些面试题相对应的技术点:
- JVM
- MySQL
- Mybatis
- MongoDB
- Redis
- Spring
- Spring boot
- Spring cloud
- Kafka
- RabbitMQ
- Nginx
- …
大类就是:
- Java基础
- 数据结构与算法
- 并发编程
- 数据库
- 设计模式
- 微服务
- 消息中间件
[外链图片转存中…(img-SkLS3MzY-1711893028581)]
[外链图片转存中…(img-cKhZzTBs-1711893028581)]
[外链图片转存中…(img-hr7nrdsq-1711893028581)]
[外链图片转存中…(img-RWbGJHu8-1711893028582)]
[外链图片转存中…(img-gihxytLj-1711893028582)]
[外链图片转存中…(img-ghmAARQl-1711893028582)]
[外链图片转存中…(img-tsrSd64R-1711893028583)]
[外链图片转存中…(img-8vQJhoUF-1711893028583)]
[外链图片转存中…(img-eKfNKtFo-1711893028583)]