Spring Boot 使用攔截器--跟著慕課熊貓學
阿新 • • 發佈:2020-10-22
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方法