这篇博客主要介绍如何利用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晓码阁 版权所有