在 Web 应用的开发中,登录 token 的合理生成、存储、拦截处理以及相关配置是保障系统安全性和用户体验的重要环节。下面将详细介绍这一完整流程。
一、登录 Token 的生成
每次登录时,token 的生成遵循以下三个步骤:
- 首先,创建一个新的
HashMap
用于存储相关数据。 - 接着,生成一个随机的 UUID(Universally Unique Identifier,通用唯一标识符),并使用
-
进行隔开,以增加其唯一性和复杂性。 - 最后,将生成的 UUID 以及一些用户信息放入
map
中,然后通过JwtUtils.createToken
方法生成jwtToken
。
二、登录 Token 的存储
生成的 token 会被存储在前端。前端在获取到请求结果中的 jwtToken
后,通过 localStorage.setItem("token")
将其保存起来。
在 request.js
文件中,会进行进一步的处理。在请求发送之前,通过以下代码将 token 放入请求头中:
service.interceptors.request.use(
config => {
if(localStorage.getItem("token")) {
config.headers.token = localStorage.getItem("token");
}
return config;
},
这样,每次请求操作都会携带这个 token,作为证明用户身份的“钥匙”。
三、登录 Token 的拦截处理
以下是拦截器的代码实现:
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 处理预检
if(request.getMethod().equals(HttpMethod.OPTIONS.name())) {
response.setStatus(HttpStatus.NO_CONTENT.value());
return true;
}
String token = request.getHeader("token");
if(token == null || "".equals(token)) {
throw new BussinessException(ResultCode.ERROR_TOKEN);
}
// 解析token,能拿到令牌中载荷部分的数据
Claims claims = JwtUtils.parseToken(token);
String uuid = (String) claims.get("uuid");
String username = (String) claims.get("username");
log.info("uuid: " + uuid);
log.info("username: " + username);
// redis中通过uuid获取当前用户是否存在,如果存在,而且时间没过期,放行。
// 如果存在,时间还剩五分钟,续期。
// 如果不存在,redis中保存的信息过期了。需要重新登录。
return true;
}
}
四、配置类
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Autowired
private LoginInterceptor loginInterceptor;
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**"); // 配置拦截器拦截的路径
}
}
通过以上的机制,我们实现了登录 token 从生成、存储到拦截处理的完整流程,以及相应的配置,有效地保障了系统的安全性和稳定性,为用户提供了可靠的服务。