(二十三)登录功能及打包
说明
上节课原计划是把登录也说了的,由于时间不够了,就把登录拿到这节课说,然后把之前遗留的小问题处理一下,最后再说说打包的功能
异步修改
我们之前做的异步实际是没有生效的,因为我们需要spring
帮我们把这个类代理出来才行,我们在同一个类中就没有任作用,因为没有经过spring
的代理
我们将两个发邮件的方法复制到MailHelper
中或将@Async
的注解加到sendMail
方法就可以啦
在Application
上加上@EnableAsync
注解
登录功能
我们的后台是不希望被除了我们之外的其他人访问到的,所以我们需要对后台所有的请求进行登录拦截,对于在没有登录的前提下所有操作都跳转到登录页
- 我们先定义登录页面的路由并修改页面表单
- 我们再写登录接口,如果用户名与密码都与我们配置的用户名密码相等我们就认为登录成功将登录成功的状态存在
Session
中,反之则返回登录页面且给其报用户名或密码错误
的信息,密码加密我们可以直接用Spring
的DigestUtils.md5DigestAsHex
方法
@PostMapping("/login")
public String login(String username, String password, Model model, HttpSession session) {
String pass = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));
if (StringUtils.equals(username, webSite.getUsername()) && StringUtils.equals(pass, webSite.getPassword())) {
session.setAttribute(WebSite.LOGIN_SIGN, true);
return "redirect:/admin/";
} else {
model.addAttribute("errorMsg", "用户名密码错误");
return "admin/login";
}
}
@GetMapping("/logout")
public String logout(HttpSession session) {
session.removeAttribute(WebSite.LOGIN_SIGN);
return "admin/login";
}
@GetMapping("/login.html")
public String login() {
return "admin/login";
}
- 在页面回显错误信息
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="stylesheet" href="/static/plugin/font-awesome/css/font-awesome.min.css">
<!-- 自定义css文件 -->
<link rel="stylesheet" href="/static/admin/css/login.css">
<style>
.lw-error-msg {
color: coral;
text-align: center;
}
</style>
</head>
<body>
<div class="lw-login-page">
<div class="lw-login-box">
<div class="lw-left">
<h1>欢迎登录</h1>
<p>冷文学习者-管理后台</p>
</div>
<div class="lw-right">
<div class="lw-error-msg" th:text="${errorMsg}" th:if="${errorMsg != null}"></div>
<form th:action="@{/admin/login}" method="post">
<div class="lw-input">
<input name="username" type="text" placeholder="用户名">
</div>
<div class="lw-input">
<input name="password" readonly onfocus="this.removeAttribute('readonly')" type="password" placeholder="密码">
</div>
<div class="lw-input">
<button type="submit">登录后台</button>
</div>
</form>
<p>Copyright © www.kevinlu98.cn All Rights Reserved.
<br>
冷文学习者版权所有</p>
</div>
</div>
</div>
</body>
</html>
- 定义一个拦截器实现
HandlerInterceptor
接口并覆写preHandle
的方法,当Session
中没有登录信息时我们直接转发到登录页面并给出请登录后再进行操作的提示
package cn.kevinlu98.intercepto;
import cn.kevinlu98.common.WebSite;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Objects;
/**
* Author: Mr丶冷文
* Date: 2022/10/16 11:07
* Email: kevinlu98@qq.com
* Description:
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Boolean sign = (Boolean) session.getAttribute(WebSite.LOGIN_SIGN);
if (Objects.nonNull(sign) && sign) {
// 已登录
return true;
} else {
request.setAttribute("errorMsg", "请登录后进行操作");
request.getRequestDispatcher("/admin/login.html").forward(request, response);
return false;
}
}
}
- 定义一个退出登录的路由,操作为清空
Session
中的登录信息 - 在
WebConfig
中的addInterceptors
方法中启用拦截器,用addPathPatterns
配置拦截的路由,用excludePathPatterns
配置排除被拦截路由中的那些路由
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/login")
.excludePathPatterns("/admin/login.html")
.excludePathPatterns("/admin/logout");
}
打包和运行
因为我们站点很多信息都存在于application.yml
的配置文件中,我们打完包之后application.yml
都会打进jar
包中,如果我们想更改一下站点信息,我们还需要去改application.yml
并重新打包,这样的话就难免有些不太友好,我们这里可以在启动时手动指定加载外部的yml
文件
- 我们可以打完包手动将项目的
application.yml
复制到外部 - 我们可以利用打包插件自动将
application.yml
文件复制到外部
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*.properties</include>
<include>*.yml</include>
<include>*/*.properties</include>
<include>*/*.yml</include>
</includes>
</resource>
</resources>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
- 启动时使用
--spring.config.local=xxx.yml
来启动我们的项目
向星辰 游客 2022-10-24 08:19 回复
很好