摘要
最近沒事兒瞎折騰java web,在idea中,突然發現無法顯示頁面了。
問題
為什么會出現這個問題?
接觸了過濾器的內容,然后在項目中添加了這樣的一個過濾器,用來對post過來的數據進行ut8編碼。
package com.shop.filter; import javax.servlet.*; import java.io.IOException; /** * post請求過濾器 */ public class EncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("UTF-8"); } @Override public void destroy() { } }
注意,對過濾器的生命周期,是在服務器啟動的時候,會對過濾器進行初始化,根據web.xml配置文件中的url-pattern進行過濾。
<!--post請求過濾器配置--> <filter> <filter-name>post-encoding</filter-name> <filter-class>com.shop.filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>post-encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
這里進行的對所有的url進行過濾,在這種模式下,會對所有的請求,都會先進入doFilter方法,但是,在對請求進行處理之后,並沒有放行,導致直接返回客戶端了,所以頁面一直是一個空白頁。不管jsp還是html都是一樣的。解決辦法,在過濾器鏈中對其放行,讓它繼續執行之后的過濾器,如果沒有則進行請求處理,然后相應,最后回到該過濾器,然后響應給客戶端。
所以解決辦法如下:
@Override public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("UTF-8"); //放行 filterChain.doFilter(servletRequest, servletResponse); }
結語
關於過濾器,一定要根據業務關系,要在滿足一定條件的情況下,給與放行。