(1) 請求資訊編碼轉化的Filter
importjava.io.IOException;
importjava.util.Enumeration;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
public class EncodeFilter implementsFilter{
private FilterConfig filterConfig=null;
private String encoding=null;
//預設建構函式
public EncodeFilter(){
}
//初始化過濾器
public void init(FilterConfig filterConfig)throwsServletException{
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
}
//得到編碼
private String getEncoding(){
return this.encoding;
}
//執行過濾操作
public void doFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainfilterChain)throws
IOException,ServletException{
//設定編碼格式
if(request.getCharacterEncoding()==null){
//從設定檔得到編碼
String encoding=getEncoding();
//設定編碼
if(encoding!=null){
request.setCharacterEncoding(encoding);
}
//傳遞過濾器
filterChain.doFilter(request,response);
}
}
public void destroy(){
filterConfig=null;
encoding=null;
}
}
web.xml檔案配置
<filter>
<filter-name>SetEncodingFilter</filter-name>
<filter-class>cn.mblogger.mydeman.EncodeFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(2) 檢測使用者是否登陸的過濾器
/**
用於檢測使用者是否登陸的過濾器,如果未登入,則重新導向到指的登入頁面
checkSessionKey 需檢查的在 Session 中儲存的關鍵字
*/
public class CheckLoginFilter implements Filter {
protected FilterConfig filterConfig = null;
private String redirectURL = null;
private String sessionKey = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
redirectURL = filterConfig.getInitParameter("redirectURL");
sessionKey = filterConfig.getInitParameter("checkSessionKey");
}
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
if (session.getAttribute(sessionKey)!=null) {//如果已經登入了,執行其它的Filter
//filterChain.doFilter(request, response); 繼續下一個過濾器
request.getRequestDispatcher("/admin/index.jsp");
return;
} else {
response.sendRedirect("/login.jsp");
}
}
public void destroy(){
}
}
對過濾鏈的說明
比如上面兩個filter 一個是處理文字編碼,一個是處理許可權
1、執行EncodingFilter類doFilter()中chain.doFilter()之前的部分:request.setCharacterEncoding(encoding);
2、執行CheckLoginFilter類doFilter()中chain.doFilter()之前的部分:判斷使用者是否已登入。
3、如果使用者已登入,則訪問請求的資源:/admin/index.jsp。
4、如果使用者未登入,則頁面重新導向到:/login.jsp。
5、執行CheckLoginFilter類doFilter()中chain.doFilter()之後的部分:執行return語句返回方法
6、執行EncodingFilter類doFilter()中chain.doFilter()之後的部分:這裡也沒有代碼。
過濾鏈的好處是,執行過程中任何時候都可以打斷,只要不執行chain.doFilter()就不會再執行後面的過濾器和請求的內容。
而在實際使用時,就要特別注意過濾鏈的執行順序問題,像EncodingFilter就一定要放在所有過濾器
之前,這樣才能確保在使用請求中的資料前設定正確的編碼。
(3) 使瀏覽器不快取頁面面的過濾器
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 用於的使 Browser 不快取頁面面的過濾器
*/
public class ForceNoCacheFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException{
((HttpServletResponse) response).setHeader("Cache-Control","no-cache");
((HttpServletResponse) response).setHeader("Pragma","no-cache");
((HttpServletResponse) response).setDateHeader ("Expires", -1);
filterChain.doFilter(request, response);
}
public void destroy(){
}
public void init(FilterConfig filterConfig) throws ServletException{
}
}