欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

9個SpringBoot中的自帶實用過濾器使用詳解

 更新時間:2025年05月09日 08:10:24   作者:風象南  
在SpringBoot應用中,過濾器(Filter)是處理HTTP請求和響應的重要組件,SpringBoot自帶了許多實用的過濾器,如字符編碼,跨域請求,緩存控制等,下面我們就來看看它的具體使用吧

在SpringBoot應用中,過濾器(Filter)是處理HTTP請求和響應的重要組件,它們能在請求到達控制器前或響應返回客戶端前進行攔截處理。

SpringBoot自帶了許多實用的過濾器,如字符編碼、跨域請求、緩存控制等。

1. CharacterEncodingFilter - 字符編碼過濾器

CharacterEncodingFilter是SpringBoot中最常用的過濾器之一,它確保HTTP請求和響應使用正確的字符編碼,避免出現亂碼問題。

功能和配置

在SpringBoot應用中,該過濾器默認已啟用,使用UTF-8編碼。你可以通過以下屬性進行自定義配置:

# application.properties
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.force=true
server.servlet.encoding.enabled=true

手動配置示例

@Bean
public FilterRegistrationBean<CharacterEncodingFilter> characterEncodingFilter() {
    CharacterEncodingFilter filter = new CharacterEncodingFilter();
    filter.setEncoding("UTF-8");
    filter.setForceEncoding(true);
    
    FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>();
    registrationBean.setFilter(filter);
    registrationBean.addUrlPatterns("/*");
    registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return registrationBean;
}

實際應用:當你的應用需要處理多語言內容,特別是包含中文、日文、阿拉伯文等非ASCII字符時,此過濾器能確保數據在傳輸過程中不會出現亂碼。

2. HiddenHttpMethodFilter - HTTP方法轉換過濾器

HTML表單只支持GET和POST方法,但RESTful API通常需要PUT、DELETE等HTTP方法。HiddenHttpMethodFilter通過識別表單中的隱藏字段來模擬這些HTTP方法。

配置方式

# 默認是開啟的,如需禁用可設置為false
spring.mvc.hiddenmethod.filter.enabled=true

使用示例

<form action="/users/123" method="post">
    <input type="hidden" name="_method" value="DELETE"/>
    <button type="submit">刪除用戶</button>
</form>

上述表單提交后,過濾器將把POST請求轉換為DELETE請求,路由到對應的刪除處理方法。

@DeleteMapping("/users/{id}")
public String deleteUser(@PathVariable Long id) {
    userService.deleteUser(id);
    return "redirect:/users";
}

實際應用:當你構建不使用JavaScript的傳統Web應用,而又希望遵循RESTful設計原則時,這個過濾器非常有用。

3. FormContentFilter - 表單內容過濾器

FormContentFilter允許處理非POST請求(如PUT、PATCH等)中的表單數據,使這些請求的表單數據能像POST請求一樣被解析。

配置方式

spring.mvc.formcontent.filter.enabled=true

實際應用場景

當客戶端需要通過PUT請求更新資源,并以表單形式提交數據時,該過濾器能確保SpringMVC正確解析請求數據。

@PutMapping("/users/{id}")
public String updateUser(@PathVariable Long id, UserForm form) {
    // 沒有FormContentFilter時,form對象的屬性將無法被正確填充
    userService.updateUser(id, form);
    return "redirect:/users";
}

4. RequestContextFilter - 請求上下文過濾器

RequestContextFilter創(chuàng)建并維護一個RequestContext對象,使其在整個請求處理過程中可用,便于訪問特定于請求的信息。

主要功能

• 使Locale解析和主題解析可用于整個請求

• 允許在任何地方獲取當前請求的信息

• 支持請求作用域的數據綁定

使用示例

@Component
public class RequestInfoService {
    
    public String getClientInfo() {
        ServletRequestAttributes attributes = 
            (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        
        return String.format("Client IP: %s, User-Agent: %s", 
                             request.getRemoteAddr(), 
                             request.getHeader("User-Agent"));
    }
}

實際應用:當你需要在非Controller組件(如Service層)中訪問當前HTTP請求信息時,此過濾器提供的功能非常有用。

5. CorsFilter - 跨域資源共享過濾器

CorsFilter實現了跨域資源共享(CORS)規(guī)范,允許瀏覽器向不同域的服務器發(fā)送請求,解決同源策略的限制。

配置方式

@Bean
public CorsFilter corsFilter() {
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("https://example.com");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/api/**", config);
    
    return new CorsFilter(source);
}

也可通過屬性配置:

spring.web.cors.allowed-origins=https://example.com
spring.web.cors.allowed-methods=GET,POST,PUT,DELETE
spring.web.cors.allowed-headers=Authorization,Content-Type
spring.web.cors.allow-credentials=true

實際應用:當你的前端應用和API部署在不同域名下時,如前端在example.com,API在api.example.com,CORS過濾器是必不可少的。

6. ShallowEtagHeaderFilter - ETag緩存過濾器

ShallowEtagHeaderFilter自動為HTTP響應添加ETag 頭信息,幫助客戶端實現高效的緩存策略,減少不必要的網絡傳輸。

原理與配置

此過濾器通過計算響應內容的哈希值生成ETag,當客戶端再次請求相同資源時,可以通過比對ETag決定是否返回304(Not Modified)狀態(tài)碼。

@Bean
public FilterRegistrationBean<ShallowEtagHeaderFilter> shallowEtagHeaderFilter() {
    FilterRegistrationBean<ShallowEtagHeaderFilter> registration = new FilterRegistrationBean<>();
    registration.setFilter(new ShallowEtagHeaderFilter());
    registration.addUrlPatterns("/api/*");
    registration.setName("shallowEtagHeaderFilter");
    return registration;
}

使用效果

  • 首次請求:服務器返回完整內容和ETag
  • 后續(xù)請求:客戶端發(fā)送If-None-Match頭,服務器比較ETag值
  • 內容未變:返回304狀態(tài)碼,無響應體
  • 內容已變:返回200狀態(tài)碼和新內容

實際應用:當你的應用提供大量靜態(tài)內容或不頻繁變化的API響應時,此過濾器能顯著減少帶寬使用并提高響應速度。

7. ForwardedHeaderFilter - 轉發(fā)頭信息過濾器

在使用負載均衡器或反向代理時,ForwardedHeaderFilter能處理轉發(fā)的頭信息,確保應用能正確識別客戶端的原始信息。

處理的頭信息

• X-Forwarded-Host

• X-Forwarded-Port

• X-Forwarded-Proto

• X-Forwarded-Prefix

• X-Forwarded-For

配置示例

@Bean
public FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() {
    FilterRegistrationBean<ForwardedHeaderFilter> registration = new FilterRegistrationBean<>();
    registration.setFilter(new ForwardedHeaderFilter());
    registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return registration;
}

實際應用:當你的SpringBoot應用部署在Nginx或AWS ELB等反向代理后面時,此過濾器能確保生成的URL和重定向使用正確的協議、主機名和端口。

8. OrderedRequestContextFilter - 有序請求上下文過濾器

OrderedRequestContextFilterRequestContextFilter的擴展版本,實現了Ordered接口,使其在過濾器鏈中的執(zhí)行順序可以更精確控制。

與RequestContextFilter的區(qū)別

• 實現了Ordered接口

• 默認優(yōu)先級為FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER - 10000

• 在SpringBoot應用中替代了普通的RequestContextFilter

使用場景

當你有多個過濾器,且它們之間存在依賴關系時,OrderedRequestContextFilter能確保在正確的時機執(zhí)行請求上下文初始化。

9. ResourceUrlEncodingFilter - 資源URL編碼過濾器

ResourceUrlEncodingFilter主要用于處理靜態(tài)資源的版本化URL,特別是在使用資源指紋或版本策略時。

功能介紹

• 將資源路徑轉換為包含版本信息的URL

• 支持內容哈?;蚬潭ò姹咎?/p>

• 與ResourceUrlProvider協同工作

使用示例

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Bean
    public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
        return new ResourceUrlEncodingFilter();
    }
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("classpath:/static/")
                .setCachePeriod(3600)
                .resourceChain(true)
                .addResolver(new VersionResourceResolver()
                        .addContentVersionStrategy("/**"));
    }
}

在模板中使用:

<!-- Thymeleaf -->
<link rel="stylesheet" th:href="@{/resources/css/main.css}" rel="external nofollow" />

<!-- 渲染后可能變?yōu)?-->
<link rel="stylesheet" href="/resources/css/main-d41d8cd98f00b204e9800998ecf8427e.css" rel="external nofollow" />

實際應用:當你需要實現高效的前端資源緩存策略,特別是在部署新版本時確保用戶獲取最新資源而不受瀏覽器緩存影響時,此過濾器非常有用。

總結

在實際項目中,根據應用需求選擇合適的過濾器,并正確配置它們的執(zhí)行順序,將極大地提升應用的質量和開發(fā)效率。

到此這篇關于9個SpringBoot中的自帶實用過濾器使用詳解的文章就介紹到這了,更多相關SpringBoot過濾器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現圖的鄰接表存儲結構的兩種方式及實例應用詳解

    java實現圖的鄰接表存儲結構的兩種方式及實例應用詳解

    這篇文章主要介紹了java實現圖的鄰接表存儲結構的兩種方式及實例應用詳解,鄰接表構建圖是必須需要一個Graph對象,也就是圖對象!該對象包含屬性有:頂點數、邊數以及圖的頂點集合,需要的朋友可以參考下
    2019-06-06
  • SpringBoot實現動態(tài)定時任務的示例代碼

    SpringBoot實現動態(tài)定時任務的示例代碼

    在SpringBoot項目中簡單使用定時任務,不過由于要借助cron表達式且都提前定義好放在配置文件里,不能在項目運行中動態(tài)修改任務執(zhí)行時間,實在不太靈活。現在我們就來實現可以動態(tài)修改cron表達式的定時任務,感興趣的可以了解一下
    2022-10-10
  • 基于Java匯總Spock框架Mock靜態(tài)資源經驗

    基于Java匯總Spock框架Mock靜態(tài)資源經驗

    這篇文章主要介紹了基于Java匯總Spock框架Mock靜態(tài)資源經驗,前面講了?Spock框架Mock對象、方法經驗總結,今天分享一下Spock框架中Mock靜態(tài)資源的實踐經驗匯總。分成靜態(tài)資源和混合場景,需要的朋友可以參考一下
    2022-02-02
  • spring boot 日志/頁面處理、實體類構建、后臺管理功能的實現

    spring boot 日志/頁面處理、實體類構建、后臺管理功能的實現

    這篇文章主要介紹了spring boot 日志/頁面處理、實體類構建、后臺管理功能的實現,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Java synchronized同步方法詳解

    Java synchronized同步方法詳解

    這篇文章主要為大家詳細介紹了Java synchronized同步方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java集合中的Collection接口總結

    Java集合中的Collection接口總結

    這篇文章主要介紹了Java集合中的Collection接口總結,Collection 接口是 List和Set接口的父接口,該接口里定義的方法既可用于操作 Set 集合,也可用于操作 List 集合,需要的朋友可以參考下
    2023-11-11
  • 詳解IDEA中SpringBoot整合Servlet三大組件的過程

    詳解IDEA中SpringBoot整合Servlet三大組件的過程

    這篇文章主要介紹了詳解IDEA中SpringBoot整合Servlet三大組件的過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java創(chuàng)建對象之顯示創(chuàng)建與隱式創(chuàng)建

    Java創(chuàng)建對象之顯示創(chuàng)建與隱式創(chuàng)建

    在本篇文章中,小編會帶大家學習面向對象中關于對象的創(chuàng)建之顯示創(chuàng)建和隱式創(chuàng)建,其實類和對象作為面向對象中最基本的,也是最重要的,需要的朋友可以參考下
    2023-05-05
  • IDEA 顯示Run Dashboard窗口的2種方式(推薦)

    IDEA 顯示Run Dashboard窗口的2種方式(推薦)

    這篇文章主要介紹了IDEA 顯示Run Dashboard窗口的2種方式,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • java代碼實現空間切割

    java代碼實現空間切割

    大家好,本篇文章主要講的是java代碼實現空間切割,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01

最新評論