利用uuid生成token 在表单中加入随机产生的token 在服务器端建立拦截器验证token
时间: 2023-05-02 13:05:37 浏览: 61
这是一个询问如何在表单中随机生成token,并在服务器端建立拦截器验证token的问题。可以使用Python中的uuid库来生成随机token,具体的实现方法需要视具体的应用场景而定。在服务器端构建拦截器时,需要先判断token的请求来源和token的有效期限等条件,再进行验证和处理。
相关问题
redis实现token校验
在使用Redis实现token校验时,可以根据用户的使用情况动态调整token的过期时间。在生成token的同时,将创建token的时间戳存储在Redis中。每次请求被拦截器拦截并通过token验证成功后,将当前时间与存储在Redis中的token生成时间进行比较。如果当前时间距离创建时间快要到达设置的Redis过期时间,就重新设置token的过期时间,延长过期时间。如果用户在设置的Redis过期时间内没有进行任何操作(没有发请求),则token会在Redis中过期。具体的代码实现可以在Controller层生成token信息并存入Redis中,同时与用户登录态建立联系。生成token时,可以使用UUID生成唯一的token,并将token和用户登录态存入Redis中。设置token的过期时间,例如1小时。最后,将token返回给客户端。在拦截器中,通过获取客户端传过来的Authorization字段,尝试从Redis中获取对应的用户名。如果可以获取到用户名,则说明token正确;反之,说明token错误,返回鉴权失败。这样就实现了基于Redis的token校验。\[1\]\[2\]\[3\]
#### 引用[.reference_title]
- *1* *2* *3* [基于SpringBoot和Redis实现Token权限认证 & 基于redis实现token验证用户是否登陆](https://blog.csdn.net/weixin_38088772/article/details/111319039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
配置拦截器拦截用户登录保存用户信息到Redis中 并且用户退出登录时从Redis中清除
在Spring Boot中配置拦截器可以通过实现HandlerInterceptor接口来实现,具体步骤如下:
1. 创建一个拦截器类,实现HandlerInterceptor接口,并实现其三个方法preHandle、postHandle和afterCompletion。
```java
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理之前进行拦截处理
String token = request.getHeader("Authorization");
if (StringUtils.isBlank(token)) {
throw new RuntimeException("未登录");
}
// 从Redis中获取用户信息
Object userInfo = redisTemplate.opsForValue().get(token);
if (userInfo == null) {
throw new RuntimeException("登录已失效,请重新登录");
}
// 将用户信息存放到request中,方便后续处理
request.setAttribute("userInfo", userInfo);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求处理之后进行拦截处理
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 请求处理完成后进行拦截处理
}
}
```
2. 在Spring Boot配置类中注册拦截器
```java
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册拦截器
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/login", "/logout"); // 排除登录和退出登录请求
}
}
```
3. 在用户登录成功后将用户信息保存到Redis中,并将token作为响应头返回给客户端
```java
@PostMapping("/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
HttpServletResponse response) {
// 校验用户名和密码
// ......
// 生成token
String token = UUID.randomUUID().toString();
// 将用户信息存放到Redis中
redisTemplate.opsForValue().set(token, userInfo, 30, TimeUnit.MINUTES);
// 将token作为响应头返回给客户端
response.setHeader("Authorization", token);
return "登录成功";
}
```
4. 在用户退出登录时从Redis中清除用户信息
```java
@PostMapping("/logout")
public String logout(HttpServletRequest request) {
// 从request中获取用户信息
Object userInfo = request.getAttribute("userInfo");
if (userInfo == null) {
return "未登录";
}
// 从Redis中清除用户信息
redisTemplate.delete(token);
return "退出登录成功";
}
```