Filter用的比較多,比較典型的一個場景就是解決跨域問題(什麼是跨域問題這裏先不解釋)
下面是示例
在web.xml中加入配置即可
<!--這個是聲明Filter-->
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>com.xxxx.CorsFilter</filter-class>
</filter>
<!--指定Filter的攔截規則-->
<filter-mapping>
<filter-name>corsFilter</filter-name>
<url-pattern>/*</url-pattern> <!--表示攔截所有-->
</filter-mapping>
/**
* 跨域,先允許所有
*/
public class CorsFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// 這裏你可以做你想做的事情,所有的請求都會先經過這裏,比如你可以在這裏做個是否已經登錄的判斷,如果沒有,可以重定向到登錄頁面
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE");
httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
httpServletResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
if ("OPTIONS".equals(httpServletRequest.getMethod())) {
httpServletResponse.setStatus(HttpStatus.NO_CONTENT.value());
}
// 最後放行,否則不會走到你的servlet裏面
chain.doFilter(httpServletRequest, httpServletResponse);
}
}