😀前言
本篇博文是關于攔截器-HandlerInterceptor的使用,希望你能夠喜歡
🏠個人主頁:晨犀主頁
🧑個人簡介:大家好,我是晨犀,希望我的文章可以幫助到大家,您的滿意是我的動力😉😉
💕歡迎大家:這里是CSDN,我總結知識的地方,歡迎來到我的博客,感謝大家的觀看🥰
如果文章有什么需要改進的地方還請大佬不吝賜教 先在此感謝啦😊
文章目錄
- 攔截器-HandlerInterceptor
- 基本介紹
- 基本步驟:
- 攔截器應用實例
- 需求:
- 代碼實現
- 注意事項和細節
- URI 和URL 的區別
- 舉例說明:
- 😄總結
攔截器-HandlerInterceptor
基本介紹
在Spring Boot 項目中, 攔截器是開發中常用手段,要來做登陸驗證、性能檢查、日志記錄等。
基本步驟:
√ 編寫一個攔截器實現HandlerInterceptor 接口
√ 攔截器注冊到配置類中(實現WebMvcConfigurer 的addInterceptors)
√ 指定攔截規則
攔截器應用實例
需求:
使用攔截器防止用戶非法登錄, 如圖- 使用攔截器就不需要在每個方法驗證了
瀏覽器輸入: http://localhost:8080/manage.html , 如果用戶沒有登錄,則返回登錄界面.
代碼實現
- 創建com/my/usersys/interceptor/LoginInterceptor.javapackage com.
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {// 目標方法執行前被調用.@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//為了讓小伙伴看到訪問的URIString requestURI = request.getRequestURI();String requestURL = request.getRequestURL().toString();log.info("preHandle攔截到的請求的URI={}", requestURI);log.info("preHandle攔截到的請求的URL={}", requestURL);//進行登錄的校驗HttpSession session = request.getSession();Object loginAdmin = session.getAttribute("loginAdmin");if (null != loginAdmin) {//說明該用戶已經成功登錄//放行return true;}//攔截, 重新返回到登錄頁面request.setAttribute("msg", "你沒有登錄/請登錄~~");request.getRequestDispatcher("/").forward(request, response);return false;}//目標方法執行完成以后調用@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info("postHandle執行了...");}//頁面渲染以后調用@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("afterCompletion執行了...");}
}
- 創建com/my/usersys/config/WebConfig.java
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注冊自定義攔截器LoginInterceptorregistry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**") //攔截所有的請求.excludePathPatterns("/","/login","/images/**");//指定要放行的,后面可以根據業務需求,來添加放行的請求路徑}
}
- 修改com/my/usersys/controller/AdminController.java , 去掉session 驗證用戶是否登錄代碼, 并完成測試, 注意看頁面和后臺日志.
//處理用戶的請求到 manage.html@GetMapping("/manage.html")public String mainPage(Model model, HttpSession session) {log.info("進入mainPage()");//可以這里集合-模擬用戶數據, 放入到request域中,并顯示ArrayList<User> users = new ArrayList<>();users.add(new User(1, "關羽~", "666666", 20, "gy@sohu.com"));users.add(new User(2, "張飛", "666666", 30, "zf@sohu.com"));users.add(new User(3, "趙云", "666666", 22, "zy@sohu.com"));users.add(new User(4, "馬超", "666666", 28, "mc@sohu.com"));users.add(new User(5, "黃忠", "666666", 50, "hz@sohu.com"));//放入model的數據默認到request域model.addAttribute("users", users);return "manage"; //這里才是我們的視圖解析到 /templates/manage.html}
注意事項和細節
URI 和URL 的區別
URI = Universal Resource Identifier
URL = Universal Resource Locator
Identifier:標識符,Locator:定位器從字面上來看, URI 可以唯一標識一個資源, URL 可以提供找到該資源的路徑
舉例說明:
String requestURI = request.getRequestURI();
String requestURL = request.getRequestURL().toString();
注冊攔截器, 依然可以使用如下方式
public class WebConfig /*implements WebMvcConfigurer*/ {//將我們的攔截器, 注入到容器中//@Override//public void addInterceptors(InterceptorRegistry registry) {//// //注冊自定義攔截器LoginInterceptor// registry.addInterceptor(new LoginInterceptor())// .addPathPatterns("/**") //攔截所有的請求// .excludePathPatterns("/","/login","/images/**");//指定要放行的,后面可以根據業務需求,來添加放行的請求路徑//}@Beanpublic WebMvcConfigurer webMvcConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addInterceptors(InterceptorRegistry registry) {System.out.println("addInterceptors~~~");//注冊攔截器registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/","/login","/images/**");}};}
}
😄總結
- URI 可以唯一標識一個資源, URL 可以提供找到該資源的路徑。
- 攔截所有的請求時要注意哪些資源需要放行,防止無法請求。
- 攔截器注冊到配置類中(實現WebMvcConfigurer 的addInterceptors),一定要指定攔截規則。
😁熱門專欄推薦
Thymeleaf快速入門及其注意事項
Spring Initailizr–快速入門–SpringBoot的選擇
帶你了解SpringBoot支持的復雜參數–自定義對象參數-自動封裝
Rest 優雅的url請求處理風格及注意事項
文章到這里就結束了,如果有什么疑問的地方請指出,諸大佬們一起來評論區一起討論😁
希望能和諸大佬們一起努力,今后我們一起觀看感謝您的閱讀🍻
如果幫助到您不妨3連支持一下,創造不易您們的支持是我的動力🤞