① 如何使用filter過濾器對入參進行處理(完整版)
前台把參數通過報文或者使用表單、ajax提交到後台,如果我們的請求參數是加密的,那麼我們在controller裡面的每一個方法里都需要進行解密處理。如果方法太多,那就太麻煩了。
使用過濾器,在一個Filter中將 HttpServletRequest 里的所有參數都取出來分別進行過濾然後再放回到該HttpServletRequest 中行不行呢?
通過測試後發現是不行的,因為HttpServletRequest 只提供了getParameter ,而沒有提供setParameter;所以,我們只能自己寫一個HttpServletRequest 方法繼承HttpServletRequestWrapper,然後覆蓋裡面的方法,並且增加我們自己的setParameters方法,這樣我們就可以為所欲為了,最後再在filter中調用該類的方法對參數進行處理(獲取、修改、存儲等等)。
在請求參數到達controller之前,在filter裡面進行解密;這樣,通過簡單的過濾器處理,把需要處理的請求都在過濾器里進行解密操作,這樣就等於實現了自動化處理。
這里我們針對兩種不同的請求方式進行講解:
第一步:新建一個類別
這個類繼承自HttpServletRequestWrapper
通過建立這個類我們就能完成向request對象添加我們處理之後的參數了。
第二步:通過實現filter介面建一個過濾器
第三步:過濾器的配置
方法一、在web.xml文件裡面進行簡單的配置(一般項目)
把我們的過濾器放在該文件中注冊
方法二、springboot項目的配置
新建一個配置類,加上@Configuration註解,在方法頭加上@Bean註解
controller 接收參數代碼:
請求示例代碼:
處理結果:
從結果可以看出,我們成功地通過過濾器對請求的email進行大寫轉小寫處理
第一步:新建一個類別
這個類繼承自HttpServletRequestWrapper
通過建立這個類我們就能完成向request對象添加我們處理之後的參數了。
第二步:通過實現filter介面建一個過濾器
第三步:
方法一、在web.xml文件裡面進行簡單的配置
把我們的過濾器放在該文件中注冊
方法二、springboot項目的配置
新建一個配置類,加上@Configuration註解,在方法頭加上@Bean註解
controller 接收參數代碼:
請求報文示例:
我這里使用的是postman工具進行json參數請求
返回結果:
通過該過濾器,把email轉換從小寫成功。
通過以上操作,我們就成功的創建了一個過濾器。
② servlet中filter有什麼用
首先介紹一下Filter到底是個什麼東西:
根據這個單詞就能猜到Filter的中文意思是過濾器,事實當然也是這樣的;Filter是Servlet中的一個重 要組件。
接下來簡單說說Filter這個介面中的常用方法吧。
①.init():類似於Servlet生命周期中的init()方法,用於初始化一些關於Filter介面的參數;只在Servlet 啟動時調用一次。
②.doFilter():類似於Servlete生命周期中的service()方法,該方法用於存放邏輯代碼。
③.destory():同理類似於Servlet生命周期中的destroy()方法,當Servlet容器銷毀前調用該方法。
然後說說如何創建一個Filter的HelloWorld。
①.創一個抽象的Java類,該類實現了Filter介面,同時實現了Filter介面的部分方法,例如
init(),destroy()方法。具體實現代碼如下:
public abstract class HttpFilter implements Filter {
private HttpServletRequest request;
private HttpServletResponse response;
//重寫Filter介面的destory方法
public void destroy() {}
//重寫doFilter方法,這個方法在這里主要作用是將ServletRequest,ServletResponse對象轉為對 //應的HttpServletRequest,HttpServletResponse對象
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
this.request = (HttpServletRequest) arg0;
this.response = (HttpServletResponse) arg1;
doFilter(request, response, arg2);
}
//該方法交由繼承該抽象類的實現類來實現
public abstract void doFilter(HttpServletRequest request,HttpServletResponse response,
FilterChain chain);
private FilterConfig config;
//這個方法是為了方便子類獲取ServletContext對象
public FilterConfig getFilterConfig(){
return config;
}
//該方法一般不建議重寫,因為重寫該方法會出現某些錯,基於此提供了下面的無參數的init()方法
public void init(FilterConfig arg0) throws ServletException {
this.config = arg0;
init();
}
public void init(){}
}
②.一個繼承了HttpFilter抽象類的實現類,代碼如下,只要功能是為了實現禁用瀏覽器緩存
public class NoCacheFilter extends HttpFilter{
@Override
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain) {
//通過過濾器實現頁面禁用瀏覽器緩存
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
}
}
③.將該實現類配置到web.xml文件中,配置方式和配置普通的Servlet一樣,具體代碼
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>com.xingyun.servlet.filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
至此,就實現了一個簡單的用於禁用瀏覽器緩存的過濾器了。
上面說了這么多,在開發中哪些地方中能用到Filter才是最終目的,好了,我大概說一下我在開發中用到的地方。
①.上面提到的禁用瀏覽器的緩存。這個真的很重要,有時候修改了前端頁面,就是因為緩存的原因,導致頁面不 能及時刷新過來,真的很蛋疼。
②.解決中文亂碼的問題。在開發中,頁面可能達到幾十個甚至上百個,在每個頁面處理中文亂碼的問題很煩,但 是通過過濾器,那麼問題就變得很簡單了。
③.通過檢查用戶是否登錄來管理用戶是否可以訪問某些頁面,比如個人隱私等頁面。這個用的也是蠻多的。
③ 過濾器Filter使用
Filter是Servlet技術中的核心組件,用於攔截並處理web伺服器管理的所有資源,實現高級功能。以下是關於Filter使用的詳細解答:
Filter的基本概念:
Filter的請求流程:
Filter的主要用途:
Filter的核心方法:
Filter的配置:
Filter的生命周期:
FilterConfig介面:
綜上所述,Filter是web開發中非常重要的組件,通過靈活配置和使用Filter,可以實現豐富的功能擴展和安全控制。