上一篇学习了SpringBoot的一些基本必学用法,这一篇来学习一下SpringBoot相关配置。
前言
本篇文章的主要内容:
- 配置Https
- 配置拦截器
- 配置页面转向
- 配置资源指向
- 配置favicon.ico
- 配置banner
配置Https
- 生成证书
通过keytool
命令来生成,如果提示命令不存在,需要配置java环境变量,然后根据提示输入秘钥口令和相关信息,最后会得到一个keystore.p12文件,把它复制到项目resources目录下。
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
命令中-alias
设置别名,-storetype
设置证书格式,-keyalg
设置加密算法,-keysize
设置证书大小,-keystore
设置证书文件地址,-validity
设置有效天数。
- 配置application.yml
server:
port: 8443
ssl:
key-store: classpath:keystore.p12
key-store-password: 123456
key-store-type: PKCS12
key-alias: tomcat
enabled: true
修改port为8443,添加ssl里面信息就填我们刚才命令设置的
- 添加ConnectorConfig.java
@Configuration
public class ConnectorConfig {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(getHttpConnector());
return tomcat;
}
private Connector getHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8088);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
}
创建ConnectorConfig.java
配置文件到config目录下并复制以上代码。代码collection.addPattern("/*")
设置所有路径都配置https,如果只想设置/users
下的路径配置https,只需要改/*
为/users/*
即可。
以上就是配置https的相关步骤,很简单吧。
配置拦截器
配置拦截器有很多用途,这里就举一个最常见的例子。我们在浏览网页的时候,如果未登录,就会自动跳转到登录界面,下面我们通过Api接口来简单的实现一下这个功能。
- 添加SessionInterceptor拦截器
@Component("sessionInterceptor")
public class SessionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("SessionInterceptor preHandle");
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute("user") != null) {
return true;
} else {
PrintWriter printWriter = response.getWriter();
printWriter.write("{code: 501, message:\"not login!\"}");
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("SessionInterceptor postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("SessionInterceptor afterCompletion");
}
}
preHandle()
该方法将在请求处理之前进行调用,返回true会执行下一个Interceptor,返回false则不会执行下一个Interceptor也不会执行Controller里的方法,先声明的Interceptor的preHandle方法会先执行。这里去获取session中user的信息,如果存在则不拦截,否则输出501错误。
postHandle()
该方法将在当前请求进行处理之后调用,且preHandle方法返回为true,先声明的Interceptor的postHandle方法会后执行
afterCompletion()
该方法将在请求完成之后调用,同样且需要preHandle方法返回为true,一般用于进行资源清理
- 添加WebMvcConfig
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private SessionInterceptor sessionInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(sessionInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/register", "/user/login", "/error");
}
}
addPathPatterns("/**")
设置拦截所有路径地址。
excludePathPatterns()
设置过滤不需要拦截的路径地址,这里配置了注册、登录和错误地址。
- 添加login接口
MyUserMapper.xml
<select id="login" resultMap="userMap">
select * from user_t
where username = #{userName} and password = #{password}
</select>
MyUserMapper.java, 因为注册接口没有做唯一限制,所有有可能查询多个,这里就用List来接收
List<MyUser> login(@Param("userName") String userName, @Param("password") String password);
MyUserServices.java
public List<MyUser> login(String userName, String password) {
return userMapper.login(userName, password);
}
MyUserController.java
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ResponseResult<MyUser> login(HttpServletRequest request, String userName, String password) {
ResponseResult<MyUser> responseResult;
try {
List<MyUser> myUser = myUserServices.login(userName, password);
if (myUser != null && myUser.size() > 0) {
request.getSession(true).setAttribute("user", myUser.get(0));
responseResult = new ResponseResult<>(200, "login success", myUser.get(0));
} else {
responseResult = new ResponseResult<>(501, "login failure: invalid userName or password", null);
}
} catch (Exception e) {
e.printStackTrace();
responseResult = new ResponseResult<>(501, "login failure: " + e.getMessage(), null);
}
return responseResult;
}
getSession(true)
指的是如果不存在则会创建一个,存在则直接返回。登录成功后通过setAttribute
设置user信息session,之后拦截器就能通过getAttribute("user")
来获取到了。
至此,基本功能就已经实现了,当调用/user/login
登录接口成功后,再去调用其它接口不会返回501提示,否则除"/user/register", "/user/login", "/error"
这几个之外的接口都会提示501未登录提示!
配置页面转向
- 静态页面转向
很多时候我们需要在Controller中写类似下面的这样代码,没有业务逻辑,只有返回一个地址,通过浏览器访问 http://localhost:8088/hello 地址就能转向对应resources下静态页面路径下的hello.html页面了。
@RequestMapping("/hello")
public String test() {
return "hello.html";
}
这样的功能可以在WebMvcConfig
简单的配置实现,添加代码如下:
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/hello").setViewName("hello.html");
}
- 静态页面路径
优先级访问从高到低依次如下:
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
上面classpath指的是与java文件夹同级的resources文件夹
- 动态页面转向
添加依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
添加了thymeleaf之后,通过浏览器访问 http://localhost:8088/hello 地址就会转向对应templates路径下的hello.html页面。同时可以省去后缀名.html
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/hello").setViewName("hello");
}
- 动态页面传值
添加index.html到templates文件夹下, 里面有一个name参数需要从controller中映射
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
<meta charset="UTF-8">
<link th:src="@{bootstrap/css/bootstrap.min.css}" rel="stylesheet">
<link th:src="@{bootstrap/css/bootstrap-theme.min.css}" rel="stylesheet">
<title>Title</title>
</head>
<body>
<script th:src="@{jquery-1.10.2.min.js}" type="text/javascript"></script>
<script th:src="@{bootstrap/js/bootstrap.min.js}" ></script>
Hello <span th:text="${name}"></span>!
</body>
</html>
添加IndexController.java到controller文件夹, 通过Model对象来设置name的属性值
@Controller
public class IndexController {
@RequestMapping("/index")
public String hello(Model model) {
model.addAttribute("name", "Soaic");
return "index";
}
}
最后在浏览器访问 http://localhost:8088/index 地址就能看到Hello Saoic!。
配置资源映射
如果想访问项目中的静态资源,除了把资源放到上面那些静态资源地址目录下,还可以通过配置来设置。只需要在WebMvcConfig
中重写addResourceHandlers
方法,代码如下:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**").addResourceLocations("classpath:/images/");
}
配置后通过地址 http://localhost:8088/images/xxx 就能访问resources/images/目录下的资源了
配置favicon.ico
- 设置favicon的开关
在application.yml中配置
spring:
mvc:
favicon:
enabled: true
- 添加favicon.ico到默认静态资源目录
ico 制作的网上有很多,这里就不多说了。
- 在html文件中添加
<head>
<link rel="shortcut icon" href="/static/favicon.ico" />
</head>
我这里是把favicon.ico放在static目录下了。有些浏览器第三步不用做,只要放进了静态资源目录就能显示显示出来。
配置banner
每次项目启动的时候,控制台会显示一个字符拼接的图形,显示这个图形的配置很简单。
制作一个banner.txt, 网上有很多可以找找,大家可以找找看,然后复制到resources资源根目录下,然后启动项目就能看到了。
_ooOoo_
o8888888o
88" . "88
(| ^_^ |)
O\ = /O
____/`---'\____
.' \\| | `.
/ \\||| : ||| \
/ _||||| -:- |||||- \
| | \\\ - / | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . ___
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
========`-.____`-.___\_____/___.-`____.-'=======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永不宕机 永无BUG
上面是我在网上找的一个,大家可以拿去试试
以上就是本篇文章的全部内容,希望对大家有所帮助,下篇再见!