Filter

使瀏覽器不緩存頁面的過濾器:
有 3 個 HTTP 響應頭字段都可以禁止瀏覽器緩存當前頁面,它們在 Servlet 中的示例代碼如下:
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache"); 
response.setHeader("Pragma","no-cache"); 

並不是所有的瀏覽器都能完全支持上面的三個響應頭,因此最好是同時使用上面的三個響應頭


<filter>
         <filter-name>m</filter-name>
         <filter-class>com.wepull.filter.SecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>m</filter-name>
<url-pattern>/list.jsp</url-pattern>
<url-pattern>/edit.jsp</url-pattern>
</filter-mapping>


 Filter 的基本功能是對 Servlet 容器調用 Servlet 的過程進行攔截,從而在 Servlet 進行響應處理的前後實現一些特殊的功能。
 Filter 程序需要在 web.xml 文件中進行註冊和設置它所能攔截的資源:Filter 程序可以攔截 Jsp, Servlet, 靜態圖片文件和靜態 html 文件


過濾器應用:
中文亂碼處理
驗證用戶登錄
訪問地址過濾


F:\項目工程\Filter

doFilter(ServletRequest request,ServletResponse response)把請求傳給Filter鏈的下一個Filter,

它是 FilterChain:Filter鏈,多個Filter可以構成Filter鏈。

若當前Filter是鏈的最後一個,則把請求傳給目標Servlet(或JSP)

多個Filter 攔截的順序和<filter-mapping>配置的順序有關,靠前的先被調用。



 可以對請求驗證 如果通過則放行(調用chain的doFilter方法)
也可以通過調用請求重定向 或 請求轉發對於客戶請求指向別處。


通過驗證就放行 filterChain.doFilter(servletRequest, servletResponse);


驗證不通過,重定向,不放行

  response.sendRedirect(response.encodeRedirectURL(request.getContextPath() + sbSkip.toString()));


http://blog.csdn.net/sd0902/article/details/8395641


1.如何驅動

在 web 應用程序啓動時,web 服務器將根據 web.xml 文件中的配置信息來創建每個註冊的 Filter 實例對象,並將其保存在服務器的內存中

2.方法介紹

    • init()  Init 方法在 Filter 生命週期中僅執行一次,web 容器在調用 init 方法時
    • destory()  在Web容器卸載 Filter 對象之前被調用。該方法在Filter的生命週期中僅執行一次。在這個方法中,可以釋放過濾器使用的資源。
    • doFilter() Filter 鏈的執行 


web.xml中元素執行的順序listener->filter->struts攔截器->servlet。

1.過濾器的概念

Java中的Filter 並不是一個標準的Servlet ,它不能處理用戶請求,也不能對客戶端生成響應。 主要用於對HttpServletRequest 進行預處理,也可以對HttpServletResponse 進行後處理,是個典型的處理鏈。

優點:過濾鏈的好處是,執行過程中任何時候都可以打斷,只要不執行chain.doFilter()就不會再執行後面的過濾器和請求的內容。而在實際使用時,就要特別注意過濾鏈的執行順序問題

2.過濾器的作用描述

  • 在HttpServletRequest 到達Servlet 之前,攔截客戶的HttpServletRequest 。 
  •   根據需要檢查HttpServletRequest ,也可以修改HttpServletRequest 頭和數據。 
  •   在HttpServletResponse 到達客戶端之前,攔截HttpServletResponse 。 
  • 根據需要檢查HttpServletResponse ,可以修改HttpServletResponse 頭和數據。


http://www.cnblogs.com/coderland/p/5902878.html(經典)

用戶在配置filter時,可以使用爲filter配置一些初始化參數,當web容器實例化Filter對象,調用其init方法時,會把封裝了filter初始化參數的filterConfig對象傳遞進來。因此開發人員在編寫filter時,通過filterConfig對象的方法,就可獲得以下內容:

String getFilterName();//得到filter的名稱。 
String getInitParameter(String name);//返回在部署描述中指定名稱的初始化參數的值。如果不存在返回null. 
Enumeration getInitParameterNames();//返回過濾器的所有初始化參數的名字的枚舉集合。 
public ServletContext getServletContext();//返回Servlet上下文對象的引用。

Filter使用案例

使用Filter驗證用戶登錄安全控制

前段時間參與維護一個項目,用戶退出系統後,再去地址欄訪問歷史,根據url,仍然能夠進入系統響應頁面。我去檢查一下發現對請求未進行過濾驗證用戶登錄。添加一個filter搞定問題!

先在web.xml配置
<filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.action.login.SessionFilter</filter-class>
    <init-param>
        <param-name>logonStrings</param-name><!-- 對登錄頁面不進行過濾 -->
        <param-value>/project/index.jsp;login.do</param-value>
    </init-param>
    <init-param>
        <param-name>includeStrings</param-name><!-- 只對指定過濾參數後綴進行過濾 -->
        <param-value>.do;.jsp</param-value>
    </init-param>
    <init-param>
        <param-name>redirectPath</param-name><!-- 未通過跳轉到登錄界面 -->
        <param-value>/index.jsp</param-value>
    </init-param>
    <init-param>
        <param-name>disabletestfilter</param-name><!-- Y:過濾無效 -->
        <param-value>N</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
接着編寫FilterServlet
package com.action.login;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

/**
 *    判斷用戶是否登錄,未登錄則退出系統
 */
public class SessionFilter implements Filter {

    public FilterConfig config;

    public void destroy() {
        this.config = null;
    }

    public static boolean isContains(String container, String[] regx) {
        boolean result = false;

        for (int i = 0; i < regx.length; i++) {
            if (container.indexOf(regx[i]) != -1) {
                return true;
            }
        }
        return result;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest hrequest = (HttpServletRequest)request;
        HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);

        String logonStrings = config.getInitParameter("logonStrings");        // 登錄登陸頁面
        String includeStrings = config.getInitParameter("includeStrings");    // 過濾資源後綴參數
        String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");// 沒有登陸轉向頁面
        String disabletestfilter = config.getInitParameter("disabletestfilter");// 過濾器是否有效

        if (disabletestfilter.toUpperCase().equals("Y")) {    // 過濾無效
            chain.doFilter(request, response);
            return;
        }
        String[] logonList = logonStrings.split(";");
        String[] includeList = includeStrings.split(";");

        if (!this.isContains(hrequest.getRequestURI(), includeList)) {// 只對指定過濾參數後綴進行過濾
            chain.doFilter(request, response);
            return;
        }

        if (this.isContains(hrequest.getRequestURI(), logonList)) {// 對登錄頁面不進行過濾
            chain.doFilter(request, response);
            return;
        }

        String user = ( String ) hrequest.getSession().getAttribute("useronly");//判斷用戶是否登錄
        if (user == null) {
            wrapper.sendRedirect(redirectPath);
            return;
        }else {
            chain.doFilter(request, response);
            return;
        }
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        config = filterConfig;
    }
}

這樣既可完成對用戶所有請求,均要經過這個Filter進行驗證用戶登錄。

防止中文亂碼過濾器

項目使用spring框架時。當前臺JSP頁面和Java代碼中使用了不同的字符集進行編碼的時候就會出現表單提交的數據或者上傳/下載中文名稱文件出現亂碼的問題,那就可以使用這個過濾器。

<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name><!--用來指定一個具體的字符集-->
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name><!--true:無論request是否指定了字符集,都是用encoding;false:如果request已指定一個字符集,則不使用encoding-->
        <param-value>false</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

*************************************

 
    private void processSessionValid(HttpServletRequest request, HttpServletResponse response, HttpSession session, String strRequestPage,
        UserDTO userDTO) {
        if ((!("1".equals(HttpSessionUtil.getSession().getAttribute("loginType"))))
            && (!(OnlineUserUtil.isActivityUser(session.getId(), userDTO.getAccount())))) {
            try {
                response.sendRedirect(response.encodeRedirectURL(request.getContextPath() + "/top/PustOutLogin.jsp"));
                return;
            } catch (IOException ex) {
                LOGGER.error("Session filter過濾時發生IO異常", ex);
            }
        } else {
            OnlineUserUtil.updateSessionActivity(session.getId());
            if (!(isRootPath(strRequestPage)))
                return;
            try {
                response.sendRedirect(response.encodeRedirectURL(request.getContextPath() + "/top/Success.jsp"));
                return;
            } catch (IOException ex) {
                LOGGER.error("Session filter過濾時發生IO異常", ex);
            }
        }
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章