日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【学习笔记】springboot的过滤器与拦截器的使用 springboot的事件驱动模型

發布時間:2024/9/30 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】springboot的过滤器与拦截器的使用 springboot的事件驱动模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 過濾器
    • 使用過濾器實現訪問控制
    • 攔截器
  • 事件驅動模型


過濾器

在實際的開發過程中,可能會遇到這樣一類需求:統計在線用戶、敏感詞過濾或者基于URL進行訪問控制。這些需求有一個共同點——在每個接口被請求時都需要進行該類操作。換而言之,如果編寫了對應以上需求的代碼,在每一個接口的某處都需要對這些代碼進行調用。不使用一些技巧的話,這個開發過程會變得異常煩瑣。

Filter(過濾器)這一概念來源于“Servlet規范”,具體的功能實現由Servlet容器(即Spring Boot內容的Tomcat)提供。過濾器的主要職責在于對資源的請求與響應的過濾,對從客戶端向服務端發送的請求進行過濾,也可以對服務端返回的響應進行處理。Filter與Servlet是有區別的。Filter雖然可以對請求與響應做出處理,但其本身并不可以產生響應。

使用過濾器實現訪問控制

(1)創建一個需要實施訪問控制的控制器。
一個簡單的例子:
在路徑src/main/java/com/example/myb-log/controller下創建SecretController.java:

@RequestMapping("/secret") @RestController public class SecretController {@GetMappingpublic String secret() {return "secret";}}

(2)創建用于身份認證的控制器。如果通過了認證,控制器將在Cookie中寫入作為身份憑證的內容。
在controller路徑下創建SessionController.java:

@RestController @RequestMapping("/session") public class SessionController {@PostMappingpublic String login(@RequestBody SessionQuery sessionQuery, HttpServletResponse response) {if (authenticate(sessionQuery)) {certificate(response);return "success";}//登陸失敗返回錯誤return "failed";}private boolean authenticate(SessionQuery sessionQuery) {//簡單的驗證邏輯,僅作演示return Objects.equals(sessionQuery.getUsername(), "admin") &&Objects.equals(sessionQuery.getPassword(), "password");}private void certificate(HttpServletResponse response) {//將登陸憑證以cookie的形式返回給客戶端Cookie credential = new Cookie("sessionId", "test-token");response.addCookie(credential);}}

(3)創建用于檢查憑證的過濾器。過濾器通過檢查請求中附帶的Cookie內容,以確認用戶的身份。
創建SessionFilter.java:

@Slf4j @WebFilter(urlPatterns = "/secret/*") public class SessionFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//讀取CookieCookie[] cookies = Optional.ofNullable(((HttpServletRequest) servletRequest).getCookies()).orElse(new Cookie[0]);boolean unauthorized = true;for (Cookie cookie : cookies) {if ("sessionId".equals(cookie.getName()) && "test-token".equals(cookie.getValue())) {unauthorized = false;}}if (unauthorized) {log.error("UNAUTHORIZED");unauthorizedResp(servletResponse);}else {filterChain.doFilter(servletRequest, servletResponse);}}private void unauthorizedResp(ServletResponse response) throws IOException {HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);httpResponse.setHeader("Content-type", "text/html;charset=UTF-8");httpResponse.setCharacterEncoding("UTF-8");httpResponse.getWriter().write("UNAUTHORIZED");} }

(4)啟用過濾器。需要在主類中使用@ServletComponentScan注解,以啟用被注解@WebFilter修飾的過濾器。

(5)分別在請求登錄接口前后訪問“受保護”的路徑,以確認訪問控制是否生效。

攔截器

Interceptor(攔截器)這一功能由Spring提供。Interceptor與Filter類似,操作粒度更小,但整體功能不如Filter強大。Interceptor支持自定義預處理(preHandle)可以在此過程中決定是否禁止程序繼續進行,自定義后續處理(postHandle)。 使用攔截器的前提是需要實現HandlerInterceptor接口。該接口包含三種主要方法: ·
 preHandle():在執行實際的處理程序之前調用,但尚未生成視圖。 · 
 postHandle():處理程序執行后調用。 · 
 afterC ompletion():在請求已經響應并且視圖生成完畢之后調用。
使用步驟:
首先創建一個繼承HandlerInterceptorAdapter的攔截器類,使用日志打印請求中的參數。在路徑src/main/java/com/example/myblog/interceptor下創建LogRequestInterceptor.java:
然后將攔截器配置到Spring上下文。在路徑src/main/java/com/example/myblog/config下創建InterceptorConfig.java:

@Configuration @RequiredArgsConstructor public class InterceptorConfig implements WebMvcConfigurer {private final LogRequestInterceptor logRequestInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(logRequestInterceptor).addPathPatterns("/**");} }

事件驅動模型

默認情況下,事件的發布與監聽是同步執行的。當要用到異步事件時,需要進行額外的配置。具體方式在于創建ApplicationEventMulticaster的JavaBean。在路徑src/main/java/com/example/myblog/config下創建AsynchronousEventsConfig.java:

@Configuration public class AsynchronousEventsConfig {@Bean(name = "applicationEventMulticaster")public ApplicationEventMulticaster simpleApplicationEventMulticaster() {SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster();eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());return eventMulticaster;} }

總結

以上是生活随笔為你收集整理的【学习笔记】springboot的过滤器与拦截器的使用 springboot的事件驱动模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。