第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Spring Boot 使用攔截器

1. 前言

攔截器這個(gè)名詞定義的非常形象,就像導(dǎo)彈要攻擊目標(biāo)的時(shí)候,可能會(huì)被先進(jìn)的反導(dǎo)系統(tǒng)攔截,此處的反導(dǎo)系統(tǒng)就是一種攔截器。

我們開(kāi)發(fā)的應(yīng)用,對(duì)外暴露的是控制器中定義的 API 方法,我們可以在 API 方法的外圍放置攔截器,所有對(duì) API 的訪問(wèn)都可以通過(guò)攔截器進(jìn)行過(guò)濾。

OK,那么這樣的攔截有什么意義嗎,其實(shí)已經(jīng)很明顯了,反導(dǎo)系統(tǒng)可以保護(hù)目標(biāo)的安全并識(shí)別對(duì)目標(biāo)的攻擊行為。同理,攔截器可以跟蹤對(duì)應(yīng)用的訪問(wèn)行為,對(duì)合法訪問(wèn)行為予以放行,對(duì)非法訪問(wèn)行為予以拒絕。怎么樣,是不是很牛,接下來(lái)咱們就在 Spring Boot 項(xiàng)目中具體實(shí)現(xiàn)下。

2. 跟蹤訪問(wèn)行為

要想實(shí)現(xiàn)對(duì)訪問(wèn)的攔截,首先要能跟蹤訪問(wèn)行為,我們?cè)?Spring Boot 中引入攔截器來(lái)實(shí)現(xiàn)下。

2.1 使用 Spring Initializr 創(chuàng)建項(xiàng)目

Spring Boot 版本選擇 2.2.5 ,Group 為 com.imooc , Artifact 為 spring-boot-interceptor ,生成項(xiàng)目后導(dǎo)入 Eclipse 開(kāi)發(fā)環(huán)境。

2.2 引入項(xiàng)目依賴

引入 Web 項(xiàng)目依賴即可。

實(shí)例:

		<!-- web項(xiàng)目依賴 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

2.3 創(chuàng)建攔截器

創(chuàng)建的類實(shí)現(xiàn) HandlerInterceptor 接口,即可成為攔截器類.

實(shí)例:

/**
 * 自定義攔截器類
 */
public class MyInterceptor implements HandlerInterceptor {// 實(shí)現(xiàn)HandlerInterceptor接口
	/**
	 * 訪問(wèn)控制器方法前執(zhí)行
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println(new Date() + "--preHandle:" + request.getRequestURL());
		return true;
	}

	/**
	 * 訪問(wèn)控制器方法后執(zhí)行
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
	}

	/**
	 * postHandle方法執(zhí)行完成后執(zhí)行,一般用于釋放資源
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL());
	}
}

在上面的實(shí)例中,我們定義了一個(gè)攔截器類 MyInterceptor ,通過(guò)實(shí)現(xiàn) HandlerInterceptor 接口,該類具備了攔截器的功能。

MyInterceptor 中的方法執(zhí)行順序?yàn)?preHandle – Controller 方法 – postHandle – afterCompletion ,所以攔截器實(shí)際上可以對(duì) Controller 方法執(zhí)行前后進(jìn)行攔截監(jiān)控。

最后還有一個(gè)非常重要的注意點(diǎn), preHandle 需要返回布爾類型的值。 preHandle 返回 true 時(shí),對(duì)控制器方法的請(qǐng)求才能到達(dá)控制器,繼而到達(dá) postHandle 和 afterCompletion 方法;如果 preHandle 返回 false ,后面的方法都不會(huì)執(zhí)行。

2.4 配置攔截器

上一步我們開(kāi)發(fā)了配置器類,如果想讓配置器生效,還需要通過(guò)配置類進(jìn)行相應(yīng)配置。

實(shí)例:

/**
 * Web配置類
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
	/**
	 * 添加Web項(xiàng)目的攔截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 對(duì)所有訪問(wèn)路徑,都通過(guò)MyInterceptor類型的攔截器進(jìn)行攔截
		registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
	}
}

2.5 創(chuàng)建控制器

我們建立一個(gè)簡(jiǎn)單的控制器,實(shí)現(xiàn)登錄方法,以便檢驗(yàn)攔截器的效果。

實(shí)例:

/**
* 登錄控制器
*/
@RestController
public class LoginController {
   @RequestMapping("/login")
   public boolean login(String username, String password) {
   	System.out.println(new Date() + " 某用戶嘗試登錄,用戶名:" + username + " 密碼:" + password);
   	return true;
   }
}

2.6 跟蹤訪問(wèn)行為

運(yùn)行啟動(dòng)類,訪問(wèn) http://127.0.0.1:8080/login?username=imooc&password=123,控制臺(tái)輸出如下:

圖片描述

控制臺(tái)輸出內(nèi)容

可見(jiàn)我們已經(jīng)完整的跟蹤了一次對(duì) http://127.0.0.1:8080/login 接口的訪問(wèn)。

3. 實(shí)現(xiàn)訪問(wèn)控制

區(qū)分合法、非法訪問(wèn),最常見(jiàn)的就是根據(jù)用戶的登錄狀態(tài)、角色判斷。接下來(lái)我們就演示下,對(duì)未登錄用戶非法訪問(wèn)請(qǐng)求的攔截。

3.1 修改控制器方法

修改登錄方法,當(dāng)用戶輸入的用戶名和密碼正確時(shí),通過(guò) Session 記錄登錄人信息。

然后開(kāi)發(fā)獲取登錄人員信息方法,返回 Session 中記錄的登錄人信息。

實(shí)例:

/**
 * 登錄控制器
 */
@RestController
public class LoginController {
	/**
	 * 登錄方法
	 */
	@RequestMapping("/login")
	public boolean login(HttpServletRequest request, String username, String password) {
		if ("imooc".equals(username) && "123".equals(password)) {
			// 登錄成功,則添加Session并存儲(chǔ)登錄用戶名
			request.getSession().setAttribute("LOGIN_NAME", username);
			return true;
		}
		return false;
	}

	/**
	 * 獲取登錄人員信息
	 */
	@RequestMapping("/info")
	public String info(HttpServletRequest request) {
		return "您就是傳說(shuō)中的:" + request.getSession().getAttribute("LOGIN_NAME");
	}
}

3.2 修改攔截器方法

由于用戶在登錄之前還沒(méi)有設(shè)置 Session ,所以登錄方法不應(yīng)該攔截,可以讓用戶自由請(qǐng)求。但是只有登錄成功后的用戶,也就是說(shuō)具備 Session 的用戶才能訪問(wèn) info 方法。

實(shí)例:

/**
 * 自定義攔截器類
 */
public class MyInterceptor implements HandlerInterceptor {// 實(shí)現(xiàn)HandlerInterceptor接口
	/**
	 * 訪問(wèn)控制器方法前執(zhí)行
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		if (request.getRequestURI().contains("/login") == true) {// 登錄方法直接放行
			return true;
		} else {// 其他方法需要先檢驗(yàn)是否存在Session
			if (request.getSession().getAttribute("LOGIN_NAME") == null) {//未登錄的不允許訪問(wèn)
				return false;
			} else {
				return true;
			}
		}
	}
}

3.3 測(cè)試

首先直接請(qǐng)求 http://127.0.0.1:8080/info ,由于此時(shí)未登錄,所以請(qǐng)求被攔截,網(wǎng)頁(yè)輸出如下:

圖片描述

訪問(wèn)被攔截

如果先請(qǐng)求登錄方法 http://127.0.0.1:8080/login?username=imooc&password=123 ,然后訪問(wèn) http://127.0.0.1:8080/info ,則網(wǎng)頁(yè)輸出:

圖片描述

登錄成功后,訪問(wèn)正常通過(guò)攔截器

4. 小結(jié)

Spring Boot 的攔截器能夠管理對(duì)控制器方法的訪問(wèn)請(qǐng)求,通過(guò)使用攔截器,可以實(shí)現(xiàn)訪問(wèn)控制,加強(qiáng)項(xiàng)目的安全性。

當(dāng)然對(duì)于更加復(fù)雜的安全管理續(xù)期, Spring Boot 也可以快速的整合 Spring Security 或 Shiro ,以構(gòu)建企業(yè)級(jí)的安全管理體系,在后續(xù)章節(jié)再進(jìn)一步介紹吧。