分布式会话拦截器

一、创建拦截器

public class UserTokenInterceptor implements HandlerInterceptor {
	//封装的操作redis的类
	@Autowired
	private RedisOperator redisOperator;
    /***
     * 调用controller之前拦截请求
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    	//前端请求header中携带userId和userToken
    	String userId = request.getHeader("headerUserId");
    	String userToken = request.getHeader("headerUserToken");
    	if(StringUtils.isNotBlank(userId)&&StringUtils.isNotBlank(userToken)){
    		//根据userId获取redis中用户的token
    		String redisToken = redisOperator.get("redis_user_token"+":"+userId);
    		if(StringUtils.isBlank(redisToken)){
    			returnErrorResponse(response,ApiResult.retFail("登录信息失效,请重新登录!"));
    			return false;
    		}else{
    			if(!redisToken.equals(userToken)){
    				returnErrorResponse(response,ApiResult.retFail("账号在异地登录,请重新登录!"));
    				return false;
    			}
    		}
    	}else{
    		returnErrorResponse(response,ApiResult.retFail("登录信息失效,请重新登录!"));
    		return false;
    	}
    	return true;
    }

	 /***
     * 重写返回响应
     * @param request
     * @param result
     */
	public void return ErrorResponse(HttpServletResponse response,ApiResult result){
		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();
		} catch(IOException e){
			e.printStackTrace();
		} finally{
			try{
				if( out != null){
					out.close();
				}
			} catch(IOException e){
				e.printStackTrace();
			}
		}
		
	}

    /***
     * 请求controller之后,渲染视图之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /***
     * 请求controller之后,渲染视图之后
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

二、注册拦截器

WebMvcConfig.java

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    
    @Bean
    public UserTokenInterceptor userTokenInterceptor(){
        return new UserTokenInterceptor();
    }

    /***
     * 注册拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userTokenInterceptor()).addPathPatterns("");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿S先森丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值