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