1. 什么是token?
Token(令牌)是一段可以标识用户身份、资源权限和有效时间的字符串,通常用于前后端分离的应用中进行身份认证和授权,避免了每次请求都需要携带用户名和密码的不便。在前端界面登录成功后,后端会返回一个Token给用户保存,下次请求时需要将Token带上,以便后端进行认证是否有操作权限。一般Token具有时效性,过期后需要重新登录获取新的Token。
2. layui如何实现登录后的token处理?
layui是一款轻量级的前端UI框架,支持前后端分离的应用开发。Login form是layui中常用的用户登录UI模块,该模块需要提供以下三个参数,其中headers参数用于在头部请求中添加Token信息:
2.1 Layui中的登录接口实现
Layui中实现登录的核心代码如下:
layui.use('form', function() {
var form = layui.form;
form.on('submit(login)', function(data) {
$.ajax({
url: 'http://localhost:8080/user/login',
type: 'POST',
data: data.field,
dataType: 'json',
success: function(res) {
if (res.code == 200) {
var token = res.data.token;
localStorage.setItem('token', token);
window.location.href = 'index.html';
} else {
layer.msg(res.msg);
}
}
});
return false;
});
});
以上代码中,登录成功后获取到后端返回的Token,并将它保存在localStorage中,下次请求时从localStorage取出并添加到请求头中:
var token = localStorage.getItem('token');
$.ajax({
url: 'http://localhost:8080/user/info',
type: 'POST',
headers: {
'Authorization': token
},
dataType: 'json',
success: function(res) {
console.log(res);
}
});
2.2 Token的传递
Token在前后端交互中是通过请求头Authorization字段传递的,Authorization字段的值通常由Token类型和Token值组成,中间用空格分隔。Token类型常用的有Bearer和JWT,前者表示Token是Bearer类型,后者表示Token是JWT类型。JWT(JSON Web Token)是一个开放标准,它可以作为Token传递用户的身份信息,通常包含计算机生成的用户ID、用户角色、过期时间等信息,服务器端可以利用这些信息验证请求的合法性,从而进行相应的业务处理。
前端在发起请求时需要将Token添加到headers中:
var token = localStorage.getItem('token');
$.ajax({
url: 'http://localhost:8080/user/info',
type: 'POST',
headers: {
'Authorization': token
},
dataType: 'json',
success: function(res) {
console.log(res);
}
});
后端在接收到请求时需要从headers中获取Token信息:
@GetMapping("/info")
public String getUserInfo(HttpServletRequest request) {
String token = request.getHeader("Authorization");
// ...
}
2.3 Token的验证和更新
后端在接收前端请求时需要对Token进行验证,这是为了避免Token被篡改或者过期后被利用。后端可以在Token验证成功后,生成一个新的Token,并将它添加到响应头中。前端在接收到响应后,把新的Token保存到localStorage中或者Cookie中,以便下次请求使用。Token的更新机制可以在后端中间件中实现。
下面是后端对Token的验证和更新的示例代码:
public class JwtInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization"); // 从headers中获取Token信息
Claims claims = JwtUtils.parseToken(token); // 解析Token
if (claims == null) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
// 判断Token是否过期,若过期则返回401状态码
if (claims.getExpiration().before(new Date())) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
// 在响应头中添加新的Token
response.setHeader("Authorization", JwtUtils.createToken(claims.getSubject(), claims.getExpiration()));
return true;
}
}
3. layui登录后的token问题解决
在layui中,登录成功后可以通过localStorage保存Token,在每次请求时从localStorage中取出Token,并添加到headers中。但是在跨域请求中,由于浏览器的同源策略限制,不能直接访问其他域名下的localStorage,从而导致Token丢失。
解决方法是使用Cookie存储Token,这样只要浏览器支持Cookie并且Cookie所在的域名和请求的域名一致,就可以正常访问Token。可以在登录成功后生成一个tokenCookie,并把Token存储在其中:
$.ajax({
url: 'http://localhost:8080/user/login',
type: 'POST',
data: data.field,
dataType: 'json',
success: function(res) {
if (res.code == 200) {
var token = res.data.token;
$.cookie('token', token); // 使用jQuery的cookie插件保存Token
window.location.href = 'index.html';
} else {
layer.msg(res.msg);
}
}
});
在后端接收请求时,获取Cookie中的Token,加入到响应头中:
@GetMapping("/info")
public String getUserInfo(HttpServletRequest request, HttpServletResponse response) {
String token = WebUtils.getCookieValue(request, "token"); // 从cookie中获取Token信息
// ...
WebUtils.setCookie(response, "token", newToken); // 在响应头中添加新的Token
}
注意:由于Cookie可以通过浏览器访问,所以需要在Token中加入安全信息,比如签名、密钥等,留意信息泄露问题。
4. 总结
Token是一种用于前后端分离的身份认证和授权的机制,可以避免在每次请求中都携带用户名和密码的不便,从而提升了系统的安全性和易用性。Layui中的登录模块可以通过在请求头中添加Token信息来实现身份认证和授权,在跨域请求中可以使用Cookie来代替localStorage保存Token。
本文介绍了layui登录后Token的问题和解决方法,详细讲解了Token的传递、验证和更新机制,同时还介绍了使用Cookie来替代localStorage保存Token的方法。相信对于layui开发人员有很大的帮助。