博客信息

小程序实战之微信端拦截器介绍

发布时间:『 2019-09-27 04:09』  博客类别:第三方  阅读(812)

这篇博客主要介绍如何利用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......


关键字:     springboot       redis  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有