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
郵箱:[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章