1. 程式人生 > 實用技巧 >Spring Boot 使用攔截器--跟著慕課熊貓學

Spring Boot 使用攔截器--跟著慕課熊貓學

Spring Boot 使用攔截器

攔截器可以跟蹤對應用的訪問行為,對合法訪問行為予以放行,對非法訪問行為予以拒絕。

建立攔截器

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

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

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

MyInterceptor 中的方法執行順序為 preHandle – Controller 方法 – postHandle – afterCompletion ,所以攔截器實際上可以對 Controller 方法執行前後進行攔截監控。

preHandle 需要返回布林型別的值。 preHandle 返回 true 時,對控制器方法的請求才能到達控制器,繼而到達 postHandle 和 afterCompletion 方法;如果 preHandle 返回 false ,後面的方法都不會執行。

配置攔截器

/**
 * Web配置類
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
	/**
	 * 新增Web專案的攔截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 對所有訪問路徑,都通過MyInterceptor型別的攔截器進行攔截
		registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
	}
}

測試

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * 登入控制器
 */
@RestController
public class LoginController {
    /**
     * 登入方法
     */
    @RequestMapping("/login")
    public boolean login(HttpServletRequest request, String username, String password) {
        if ("momoli".equals(username) && "123456".equals(password)) {
            // 登入成功,則新增Session並存儲登入使用者名稱
            request.getSession().setAttribute("LOGIN_NAME", username);
            return true;
        }
        return false;
    }

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

效果:

先請求登入方法 http://127.0.0.1:8080/login?username=momoli&password=123456 ,然後訪問 http://127.0.0.1:8080/info ,則網頁輸出

控制檯輸出

若輸入的網址不符合,則頁面出錯,且不會執行postHandle以及afterCompletion方法