这篇博客主要介绍如何利用redis这项缓存技术,去做用户令牌token校验;系统中很多操作只有登录后才能操作;
实现思路如下:
之前登录时顺便把用户登录随机字符串放到了redis中,作为用户登录令牌了,相关代码如下;
RegistLoginController.java
public UsersVO setUserRedisSessionToken(Users userModel) {
String uniqueToken = UUID.randomUUID().toString();
redis.set(USER_REDIS_SESSION + ":" + userModel.getId(), uniqueToken, 1000 * 60 * 30);
UsersVO userVO = new UsersVO();
BeanUtils.copyProperties(userModel, userVO);
userVO.setUserToken(uniqueToken);
return userVO;
}拦截器拦截主逻辑如下
MiniInterceptor.java
package com.javaxl.controller.interceptor;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.javaxl.utils.JSONResult;
import com.javaxl.utils.JsonUtils;
import com.javaxl.utils.RedisOperator;
public class MiniInterceptor implements HandlerInterceptor {
@Autowired
public RedisOperator redis;
public static final String USER_REDIS_SESSION = "user-redis-session";
/**
* 拦截请求,在controller调用之前
* 视频详情、个人主页、上传作品选择BGM的时候需要判断该用户是否登录过
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2) throws Exception {
String userId = request.getHeader("headerUserId");
// 执行对应操作携带过来的令牌
String userToken = request.getHeader("headerUserToken");
// 判断是否登录过
if (StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(userToken)) {
// 通过用户ID到redis中获取到曾经保存过的用户登入令牌
String uniqueToken = redis.get(USER_REDIS_SESSION + ":" + userId);
// redis中的保存的令牌已经失效
if (StringUtils.isEmpty(uniqueToken) && StringUtils.isBlank(uniqueToken)) {
System.out.println("请登录...");
returnErrorResponse(response, new JSONResult().errorTokenMsg("请登录..."));
return false;
} else {
// 执行操作携带的令牌与redis中保存的令牌不一致
if (!uniqueToken.equals(userToken)) {
System.out.println("账号被挤出...");
returnErrorResponse(response, new JSONResult().errorTokenMsg("账号被挤出..."));
return false;
}
}
} else {
System.out.println("请登录...");
returnErrorResponse(response, new JSONResult().errorTokenMsg("请登录..."));
return false;
}
/**
* 返回 false:请求被拦截,返回
* 返回 true :请求OK,可以继续执行,放行
*/
return true;
}
public void returnErrorResponse(HttpServletResponse response, JSONResult result)
throws IOException, UnsupportedEncodingException {
OutputStream out=null;
try{
response.setCharacterEncoding("utf-8");
response.setContentType("text/json");
out = response.getOutputStream();
out.write(JsonUtils.objectToJson(result).getBytes("utf-8"));
out.flush();
} finally{
if(out!=null){
out.close();
}
}
}
/**
* 请求controller之后,渲染视图之前
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
}
/**
* 请求controller之后,视图渲染之后
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
}
Springboot一启动就让拦截器开始生效
WebMvcConfig.java
package com.javaxl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.javaxl.controller.interceptor.MiniInterceptor;
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 可以让http://192.168.43.37:8081/login这样的url被微信端调用
registry.addResourceHandler("/**")
// http://192.168.43.37:8081/swagger-ui.html依然能够被访问
.addResourceLocations("classpath:/META-INF/resources/")
// 添加file:C:/javaxl_videos_dev/与http://192.168.43.37:8081/的虚拟文件映射
.addResourceLocations("file:C:/javaxl_videos_dev/");
}
@Bean
public MiniInterceptor miniInterceptor() {
return new MiniInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(miniInterceptor()).addPathPatterns("/user/**")
.addPathPatterns("/video/upload", "/video/uploadCover",
"/video/userLike", "/video/userUnLike",
"/video/saveComment")
.addPathPatterns("/bgm/**")
.excludePathPatterns("/user/queryPublisher");
super.addInterceptors(registry);
}
}
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有