热部署

  • 热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用
  • SpringBoot热部署就是在项目正在运行的时候修改代码, 却不需要重新启动项目

配置热部署

  • pom文件中导入 spring-boot-devtools 依赖:
1
2
3
4
5
6
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
  • 继续在pom.xml中添加插件
1
2
3
4
5
6
7
8
9
10
11
12
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
  • 设置application.properties
1
2
#配置项目热部署
spring.devtools.restart.enabled=true
  • 在idea中设置自动编译:

  • 按住ctrl+shift+alt+ / ,出现如下图所示界面,点击Registry(注册)…,如下图:

  • 点击进入后,勾选compiler.automake.allow.when.app.running后关闭即可

登录功能

控制器

  • 首先写一个控制器
1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
public class LoginController {
@RequestMapping("/user/login")
public String login(String username, String password, Model model){
// 具体业务
if(username.equals("admin") && password.equals("12345")){
return "dashboard";
}else{
model.addAttribute("msg","用户名或者密码错误");
return "index";
}
}
}
  • 修改前端代码
1
2
3
4
5
6
<form class="form-signin" th:action="@{/user/login}" method="post">
<!--省略-->
<!--如果msg为空则不显示-->
<p style="color:red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>
<!--省略-->
</form>
  • 访问后发现成功跳转,但地址栏却没有变化

地址映射

  • 我们可以取一个假的地址别名,其不是真正的页面而只是一个请求而已
  • 在我们config下创建的SpringMVC扩展类里添加地址映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//扩展springmvc
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
@Override
public void addViewControllers(ViewControllerRegistry registry){
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
//相当于给dashboard起别名
registry.addViewController("/main.html").setViewName("dashboard");
}
}
  • 控制器中修改为重定向
1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
public class LoginController {
@RequestMapping("/user/login")
public String login(String username, String password, Model model){
// 具体业务
if(username.equals("admin") && password.equals("12345")){
return "redirect:/main.html";
}else{
model.addAttribute("msg","用户名或者密码错误");
return "index";
}
}
}
  • 再次访问就会映射到main.html

登录拦截

  • 但是未登录状态下访问http://localhost:8080/main.html照样能进入,这是不合理的,需要配置拦截器
  • config包下新建一个拦截器类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 登录成功之后,应该有用户的Session
Object loginUser = request.getSession().getAttribute("loginUser");
if(loginUser == null){ //未登录
request.setAttribute("msg","没有权限,请先登录");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else{
return true;
}
}
}
  • config下的SpringMVC扩展中进行设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//扩展springmvc
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
@Override
public void addViewControllers(ViewControllerRegistry registry){
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
//相当于给dashboard起别名
registry.addViewController("/main.html").setViewName("dashboard");
}
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login","static/**");
}
}
  • 需要在控制器处理时,添加用户Session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Controller
public class LoginController {
@RequestMapping("/user/login")
public String login(String username, String password, Model model, HttpSession session){
// 具体业务
if(username.equals("admin") && password.equals("12345")){
session.setAttribute("loginUser",username);
return "redirect:/main.html";
}else{
model.addAttribute("msg","用户名或者密码错误");
return "index";
}
}
}
  • 登陆后用户名显示
1
<a>[[${session.loginUser}]]</a>