让我们来详细讲解一下“SSM 使用 Token 校验登录的实现”。
通过 Token 进行登录认证机制是常见的 Web 应用程序的身份认证机制之一。Token 是在身份验证后服务器返回的字符串,通常用于在客户端和服务器之间共享身份验证状态。以下是实现 SSM 使用 Token 校验登录的攻略:
1.概述
Token 认证机制主要分为以下几个流程:
- 用户通过表单提交用户名和密码进行登录;
- 服务器验证并生成 Token;
- 将 Token 存储到数据库或缓存中,之后每次用户进行操作时通过 Token 进行验证;
- 用户退出登录时清除对应 Token。
实现这个流程需要以下技术框架:
- SpringBoot:简化 Spring 应用程序的创建和开发;
- SpringSecurity:用于安全方面的功能,使用 Token 认证机制;
- MyBatis:用于持久层操作;
- MySQL:用于存储 Token。
2.建立用户登录
首先,我们需要建立用户登录功能,并将用户的信息保存到数据库中。
在后端代码中,我们应该提供一个接口来供前端界面调用。
以后端接口 /login
为例,代码如下:
@PostMapping(value = "/login")
public String login(@RequestParam final String username, @RequestParam final String password) {
final User user = userService.getUserByName(username);
if (user == null) {
return "用户不存在";
}
if (!password.equals(user.getPassword())) {
return "密码错误";
}
final String token = CreateToken.createToken(user);
TokenUtil.storeToken(token, user);
return token;
}
在这个代码片段中,我们通过用户提交的用户名和密码从数据库中查询用户信息,如果查询到用户信息,则生成一个 Token,并将 Token 和用户信息存储起来。最后,我们返回给前端 Token。
3.验证 Token
我们需要编写一个验证 Token 的拦截器,用于从接口中提取 Token,并将其和存储在服务器中的 Token 进行比较。
以 /secure/
接口为例,实现代码如下:
@Configuration
public class SecurityConfig extends WebMvcConfigurerAdapter {
@Autowired
private TokenInterceptor tokenInterceptor;
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(tokenInterceptor);
}
}
public class TokenInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService;
@Override
public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object o) throws Exception {
final String requestToken = request.getHeader("token");
final User user = TokenUtil.getUser(requestToken);
if (user != null) {
final String localToken = TokenUtil.getToken(user);
if (localToken != null && localToken.equals(requestToken)) {
return true;
}
}
response.setContentType("application/json;charset=utf-8");
try (final PrintWriter writer = response.getWriter()) {
final ResultDto resultDto = new ResultDto();
resultDto.setCode(ResultCodeEnum.TOKEN_ERROR.getCode());
resultDto.setMessage(ResultCodeEnum.TOKEN_ERROR.getMessage());
final ObjectMapper objectMapper = new ObjectMapper();
final String json = objectMapper.writeValueAsString(resultDto);
writer.write(json);
writer.flush();
}
return false;
}
}
在这个代码片段中,我们重写了 HandlerInterceptor 类,并在其中调用了验证 Token 的方法。具体来说,从请求中提取了所包含的 Token,根据 Token 在服务器中查询与之对应的用户信息,将用户信息和本地存储中的 Token 进行比较。如果 Token 正确,则返回 true;否则,返回错误代码和错误信息。
4.清除 Token
最后,我们需要提供一个接口,用于清除用户的 Token,实现代码如下:
@GetMapping(value = "/logout")
public String logout(@RequestParam final String token) {
TokenUtil.deleteToken(token);
return "退出成功";
}
在这个代码片段中,我们只需根据提供的 Token 找到并移除本地存储中的 Token 即可。
5.示例
下面给出两个示例,并说明它们的实现过程。
示例 1
前端代码:
function login() {
const username = document.getElementById("username").value;
const password = document.getElementById("password").value;
const xhr = new XMLHttpRequest();
xhr.open('POST', '/login', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
const token = xhr.responseText;
sessionStorage.setItem("token", token);
window.location.href = "/index";
}
};
const params = {"username": username, "password": password};
xhr.send(JSON.stringify(params));
}
后端代码:
@PostMapping(value = "/login")
public String login(@RequestBody final String jsonParam) {
try {
final JSONObject jsonObject = JSONObject.parseObject(jsonParam);
final String username = jsonObject.getString("username");
final String password = jsonObject.getString("password");
final User user = userService.getUserByName(username);
if (user == null) {
return "用户不存在";
}
if (!password.equals(user.getPassword())) {
return "密码错误";
}
final String token = CreateToken.createToken(user);
TokenUtil.storeToken(token, user);
return token;
} catch (Exception ex) {
return "登录失败";
}
}
在前端代码中,我们定义了一个函数,在用户单击“登录”按钮时被调用。这个函数获取用户输入的用户名和密码,并通过 AJAX 向服务器发送 POST 请求。在 HTTP 头中包含了 "Content-Type" 为 "application/x-www-form-urlencoded",并将参数转换为 JSON 字符串发送到服务器。在服务器端,我们接收到 JSON 请求,解析其内容并查询与之对应的用户信息。如果用户名和密码均正确,则生成一个 Token,并存储 Token 和用户信息。最后,我们将 Token 返回给前端界面。
示例 2
前端代码:
$(function () {
$.ajax({
url: "/secure/user",
type: "GET",
async: false,
beforeSend: function (request) {
request.setRequestHeader("token", sessionStorage.getItem("token"));
},
success: function (response) {
if (response.code === "OK") {
$("#user").text(response.data.username);
} else {
$("#user").text("未登录");
}
},
error: function () {
$("#user").text("未登录");
}
});
})
后端代码:
@GetMapping(value = "/user")
public ResultDto user(final HttpServletRequest request) {
final String requestToken = request.getHeader("token");
final User user = TokenUtil.getUser(requestToken);
return ResultDto.success(user);
}
在前端代码中,我们使用 AJAX 发送带有 Token 的 GET 请求到 "/secure/user" 接口。在 HTTP 头中包含了 "token" 为 sessionStorage 中获取到的 Token。在服务器端,我们通过获取请求头中包含的 Token 进行身份校验,如果通过身份认证,则返回一个包含了当前用户信息的 JSON 对象。
6.总结
以上就是实现 SSM 使用 Token 校验登录的完整攻略,通过实现 Token 认证机制,我们可以保证用户信息和登录状态的安全性,并能够使用 Token 在客户端和服务器之间共享身份验证状态。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ssm 使用token校验登录的实现 - Python技术站