最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Springboot實現(xiàn)攔截器的兩種方式

 更新時間:2021年08月19日 15:20:50   作者:怪咖軟妹@  
本文詳細(xì)的介紹了Springboot攔截器的兩種方式實現(xiàn),一種就是用攔截器,一種就是過濾器,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

實現(xiàn)過濾請求有兩種方式:

一種就是用攔截器,一種就是過濾器

攔截器相對來說比較專業(yè),而過濾器雖然不專業(yè)但是也能完成基本的攔截請求要求。

一、攔截器方式

1、配置HandlerInterceptor

下面這個也是我們公司項目攔截器的寫法,總體來說感覺還不錯,我就記錄了下來。
利用了一個靜態(tài)Pattern變量存儲不走攔截器的路徑,然后在preHandle方法當(dāng)中進(jìn)行過濾,讓他返回true。

@Component
public class LoginInterceptor implements HandlerInterceptor{
	
	private static final Pattern SHOULD_NOT_FILTER_URL_PATTERN;
	
	static {
		List<String> urlList = new ArrayList<>();
		// 將不走攔截器的請求存放到Pattern
		urlList.add("(socket/.*)");
		urlList.add("(user/findUserList)");
		StringBuilder sb = new StringBuilder();
		for (String url : urlList) {
			sb.append(url);
			sb.append("|");
		}
		sb.setLength(sb.length() - 1);
		SHOULD_NOT_FILTER_URL_PATTERN = Pattern.compile(sb.toString());
	}
	
	/**
	 * 在請求處理之前進(jìn)行調(diào)用(Controller方法調(diào)用之前)
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		HttpSession session = request.getSession();
		// 獲取訪問的url
 		String servletPath = request.getServletPath();
		// 排除特定請求
		if (SHOULD_NOT_FILTER_URL_PATTERN.matcher(servletPath).find()) {
			return true;
		}
		if (session.getAttribute("user") != null) {
			// 可能有的項目在校驗完session,還會校驗token
			String token = request.getHeader("access_token");
			// 此處業(yè)務(wù)省略。。。
			return true;
		}
		return false;
	}

	/**
	 * 請求處理之后進(jìn)行調(diào)用,但是在視圖被渲染之前(Controller方法調(diào)用之后)
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		
	}

	/**
	 * 在整個請求結(jié)束之后被調(diào)用,也就是在DispatcherServlet 渲染了對應(yīng)的視圖之后執(zhí)行(主要是用于進(jìn)行資源清理工作)
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		
	}
}

2、注冊攔截器

配置完上面的攔截器還需要注冊攔截器。

WebMvcConfigurerAdapter類是 Spring內(nèi)部的一種配置方式
采用JavaBean的形式來代替?zhèn)鹘y(tǒng)的xml配置文件形式進(jìn)行針對框架個性化定制

@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
	
	@Autowired
    private LoginInterceptor loginInterceptor;
	

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 多個攔截器組成一個攔截器鏈
		// addPathPatterns 用于添加攔截規(guī)則
		// excludePathPatterns 用戶排除攔截
		registry.addInterceptor(loginInterceptor).addPathPatterns("/**");
		super.addInterceptors(registry);
	}
}

3、使用攔截器的坑

繼承WebMvcConfigurerAdapter 重寫addInterceptors方法的時候,一定要使用注入方式,將loginInterceptor注入到變量當(dāng)中,要么就使用@Bean注解的方式,將loginInterceptor(攔截器)注入到容器。

之所以這么搞是因為攔截器在 Bean 初始化之前進(jìn)行,所以在攔截器中無法像這樣注入 Bean。
就算加了@Component,他是存放于容器當(dāng)中了,但是他存放容器當(dāng)中的對象屬性,是空屬性。

在WebMvcConfigurerAdapter 使用@Autowired注入了一遍攔截器,屬性就有值了。

說白了不管采用哪種方案,目的只有一個,讓對象的屬性有值,因為攔截器比其他對象初始化早,導(dǎo)致屬性為空,想讓他有值,就想辦法讓他重新走一遍spring注入容器,也可以采用這種方式:

@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
	
	// 這么寫的目的是為了在SessionInterceptor中能注入spring中的service
	@Bean
	LoginInterceptor loginInterceptor() {
		return new LoginInterceptor();
	}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 多個攔截器組成一個攔截器鏈
		// addPathPatterns 用于添加攔截規(guī)則
		// excludePathPatterns 用戶排除攔截
		registry.addInterceptor(loginInterceptor()).addPathPatterns("/**");
		super.addInterceptors(registry);
	}
}

二、過濾器方式

本人這一篇博客寫了關(guān)于filter的一些知識:http://www.fzitv.net/article/204084.htm

1、實現(xiàn)Filter接口

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Component;

@Component
@WebFilter(filterName = "requestParamFilter",urlPatterns = "/*")
public class RequestParamFilter implements Filter {

	private static final Pattern SHOULD_NOT_FILTER_URL_PATTERN;
	
	static {
		List<String> urlList = new ArrayList<>();
		// 將不走攔截器的請求存放到Pattern
		urlList.add("(socket/.*)");
		urlList.add("(user/findUserList)");
		StringBuilder sb = new StringBuilder();
		for (String url : urlList) {
			sb.append(url);
			sb.append("|");
		}
		sb.setLength(sb.length() - 1);
		SHOULD_NOT_FILTER_URL_PATTERN = Pattern.compile(sb.toString());
	}

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
	
	// 發(fā)送請求會執(zhí)行這個方法
    // 一個doFilter相當(dāng)于攔截器的執(zhí)行前和執(zhí)行后
    // filterChain.doFilter后面的內(nèi)容就是執(zhí)行后的內(nèi)容,假如不執(zhí)行filterChain.doFilter方法相當(dāng)于方法被攔截
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        System.out.println("sunhan---請求參數(shù)過濾器!---test1");
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpSession session = request.getSession();
		// 獲取訪問的url
 		String servletPath = request.getServletPath();
		// 排除特定請求
		if (SHOULD_NOT_FILTER_URL_PATTERN.matcher(servletPath).find()) {
			filterChain.doFilter(servletRequest,servletResponse);
		}
        System.out.println("開始攔截了................");
        //業(yè)務(wù)代碼
    }

    @Override
    public void destroy() {

    }
}

2、使用過濾器需要注意的

攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調(diào)用業(yè)務(wù)邏輯

執(zhí)行順序如下:

在這里插入圖片描述

到此這篇關(guān)于淺談Springboot實現(xiàn)攔截器的兩種方式的文章就介紹到這了,更多相關(guān)Springboot 攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Jmeter關(guān)聯(lián)實現(xiàn)及參數(shù)化使用解析

    Jmeter關(guān)聯(lián)實現(xiàn)及參數(shù)化使用解析

    這篇文章主要介紹了Jmeter關(guān)聯(lián)實現(xiàn)及參數(shù)化使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 解決JDK異常處理No appropriate protocol問題

    解決JDK異常處理No appropriate protocol問題

    這篇文章主要介紹了解決JDK異常處理No appropriate protocol問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Mybatis-plus如何通過反射實現(xiàn)動態(tài)排序不同字段功能

    Mybatis-plus如何通過反射實現(xiàn)動態(tài)排序不同字段功能

    這篇文章主要介紹了Mybatis-plus如何通過反射實現(xiàn)動態(tài)排序不同字段功能,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 基于多網(wǎng)卡環(huán)境下Eureka服務(wù)注冊IP的選擇問題

    基于多網(wǎng)卡環(huán)境下Eureka服務(wù)注冊IP的選擇問題

    這篇文章主要介紹了基于多網(wǎng)卡環(huán)境下Eureka服務(wù)注冊IP的選擇問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring Cloud Feign統(tǒng)一設(shè)置驗證token實現(xiàn)方法解析

    Spring Cloud Feign統(tǒng)一設(shè)置驗證token實現(xiàn)方法解析

    這篇文章主要介紹了Spring Cloud Feign統(tǒng)一設(shè)置驗證token實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 詳解Springboot配置文件的使用

    詳解Springboot配置文件的使用

    在springboot項目中,也可以使用yml類型的配置文件代替properties文件。接下來通過本文給大家分享Springboot配置文件的使用,感興趣的朋友一起看看吧
    2017-07-07
  • Log4j新手快速入門教程

    Log4j新手快速入門教程

    這篇文章主要給大家介紹了關(guān)于Log4j新手入門的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Log4j具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Java 實現(xiàn)隨機(jī)驗證碼功能簡單實例

    Java 實現(xiàn)隨機(jī)驗證碼功能簡單實例

    這篇文章主要介紹了Java 實現(xiàn)隨機(jī)驗證碼功能簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 淺談@PostConstruct不被調(diào)用的原因

    淺談@PostConstruct不被調(diào)用的原因

    這篇文章主要介紹了淺談@PostConstruct不被調(diào)用的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • feign?打印日志不顯示的問題及解決

    feign?打印日志不顯示的問題及解決

    這篇文章主要介紹了feign?打印日志不顯示的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

商水县| 定南县| 逊克县| 长汀县| 深泽县| 儋州市| 贡山| 游戏| 肥东县| 南岸区| 两当县| 朔州市| 扶余县| 石城县| 寻乌县| 金溪县| 沾益县| 天镇县| 苏州市| 临海市| 广水市| 舟曲县| 潢川县| 渑池县| 桦南县| 巴彦淖尔市| 寿阳县| 玉屏| 宝兴县| 莫力| 北海市| 宜丰县| 酉阳| 东莞市| 罗源县| 武宁县| 建德市| 定襄县| 渝中区| 集安市| 饶平县|