SpringBoot拦截器的实现

一、编写拦截器:

1、首先需要确定拦截器的位置,拦截器拦截当前目录以及所有子目录(递归)。

package com.test.interceptor;

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.WebMvcConfigurerAdapter;

@Configuration
public class Interceptor extends WebMvcConfigurerAdapter {
	//拦截器类,用来拦截/interceptorService/regionalLevel接口
	@Bean
	public LoginPermissionInterceptor getLoginInterceptor() {
		return new LoginPermissionInterceptor();
	}
    //拦截器类,用来拦截除了/interceptorService/regionalLevel接口的所有接口
	@Bean
	public RequestPermissionInterceptor getRequestInterceptor() {
		return new RequestPermissionInterceptor();
	}
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 拦截器的路径 addPathPatterns("/**")配置拦截路径,其中/**表示当前目录以及所有子目录(递归),/*
		registry.addInterceptor(getLoginInterceptor()).addPathPatterns("/interceptorService/regionalLevel");
		//拦截器的路径 addPathPatterns("/**"),excludePathPatterns("/interceptorService/regionalLevel")除了这个接口
		registry.addInterceptor(getRequestInterceptor()).addPathPatterns("/**")
				.excludePathPatterns("/interceptorService/regionalLevel");
		// super.addInterceptors(registry);
	}
}

2、获取Header中的信息,进行具体处理。

package com.test.interceptor;

import java.util.Calendar;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.test.interceptor.service.IInterceptorService;

@Component
public class LoginPermissionInterceptor implements HandlerInterceptor {
	Logger logger = LoggerFactory.getLogger(LoginPermissionInterceptor.class);
	@Autowired
	private IInterceptorService interceptorService;
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
		// 添加要返回的非业务字段
		response.addHeader("requestTime", String.valueOf(Calendar.getInstance().getTimeInMillis()));
		System.out.println("进入登录拦截器-----------");
		// 获取parentRegion
		String token = request.getHeader("token");
		//判断是否有空格,null等
		if(!StringUtils.isNotBlank(token)) {
			//返回401
			response.setStatus(HttpStatus.UNAUTHORIZED.value());
			return false;
		}
		System.out.println("登录拦截器获取到Header中参数:" + token);
		//获取地区级别的方法,可以自己编写实现。
		Map<String, Object> data = interceptorService.getRegionalLevel(token);
		//获取到权限信息存入session
		request.getSession().setAttribute("region",data.get("region"));
        request.getSession().setAttribute("level",data.get("level"));
		return true;
	}
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
	}
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
	}
}

二、编写登录接口:

1、编写controller、service、dao、mapper等,实现interceptorService/regionalLevel接口请求操作。
然后通过postman测试该接口,携带header信息,发送请求,可以正常通过拦截器。如果不懈怠header,会报401。(浏览器测试结果明显)。

①controller类

在这里插入图片描述
②service类
登录方法通过拦截器后返回结果,方法如下:
在这里插入图片描述

此方法为(一)拦截器中2.的Map<String, Object> data = interceptorService.getRegionalLevel(token);


public Map<String, Object> getRegionalLevel(String token) {
		List<DqxxInfo> dqxxbInfoList = null;
		Map<String, Object> data = new HashMap<String, Object>();
		Map<String, Object> paramMap = new HashMap<String, Object>();
		if("0".equals(token)) {
			paramMap.put("token", 1);
			paramMap.put("dqjb", 1);
			dqxxbInfoList = interceptorDao.getRegionalLevel(paramMap);
			if(dqxxbInfoList != null) {
				Integer options = (int) (0 + Math.random() * (dqxxbInfoList.size()));
				data.put("region", dqxxbInfoList.get(options).getDqxsmc());
				data.put("level", dqxxbInfoList.get(options).getDqjb());
			}
		}
		System.out.println("进入登录拦截器验证方法......");
		return data;
	}

③dao类
在这里插入图片描述
④mapper.xml
在这里插入图片描述

温馨提示:
本人联系方式:
QQ:961094233
邮箱:961094233@qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值