1. 程式人生 > >攔截器與過濾器的區別以及他們的配置

攔截器與過濾器的區別以及他們的配置

1、

過濾器,是在java web中,你傳入的request,response提前過濾掉一些資訊,或者提前設定一些引數,然後再傳入servlet或者struts的 action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果使用者沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設定字符集,或者去除掉一些非法字元


攔截器,是在面向切面程式設計的就是在你的service或者一個方法,前呼叫一個方法,或者在方法後呼叫一個方法比如動態代理就是攔截器的簡單實現,在你呼叫方法前打印出字串(或者做其它業務邏輯的操作),也可以在你呼叫方法後打印出字串,甚至在你丟擲異常的時候做業務邏輯的操作。

攔截器與過濾器的區別:
攔截器是基於java的反射機制的,而過濾器是基於函式回撥。
攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
攔截器可以訪問action上下文、值棧裡的物件,而過濾器不能訪問。
在action的生命週期中,攔截器可以多次被呼叫,而過濾器只能在容器初始化時被呼叫一次

執行順序:過濾前 – 攔截前 – Action處理 – 攔截後 – 過濾後。個人認為過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登入使用者不能訪問內部頁面的處理);過濾通過後,攔截器將檢查使用者提交資料的驗證,做一些前期的資料處理,接著把處理後的資料發給對應的Action;Action處理完成返回後,攔截器還可以做其他過程(還沒想到要做啥),再向上返回到過濾器的後續操作。
2、怎麼寫自定義攔截器 
    <!-- 宣告一個為default的攔截器 -->
    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="auth" class="com.pb.intercept.AuthIntercepter"></interceptor>
            <!-- 定義一個包含許可權檢查的攔截器棧 -->
            <interceptor-stack name="mystack">
                <interceptor-ref name="auth"/>
                <!-- 定義攔截器棧包含defaultstack攔截器棧 -->
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        <!-- 配置struts2框架執行時,預設執行自定義攔截器棧 -->
        <default-interceptor-ref name="mystack"/>
        <global-results>
            <!--    被攔截後調回登入頁面    -->
            <result name="login">/login.jsp</result>
        </global-results>

    </package>

應用到宣告的包下,只要相應包下所有的action就會呼叫自定義的攔截器。

<package name="users" extends="default">

<!-- 登入 -->

        <action name="login" class="userAction" method="login">
            <result type="redirectAction">list</result>
            <result name="input">/login.jsp</result>
        </action>

</package>

寫攔截器類:

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.pb.domain.Users;

public class AuthIntercepter extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        Users loginUser=(Users) ActionContext.getContext().getSession().get("loginUser");
         // 獲得當前方法名.
        //String methodName = invocation.getInvocationContext().getName();

        //獲取url,如果是login就是登陸時候響應的直接通過攔截返回方法,進入action中,

        if(invocation.getProxy().getActionName().equals("login")){

           //返回方法名,進入action

            return invocation.invoke();

//如果獲得url不是login可能就是登陸成功了,判斷session中是否為空,不為空就是登陸成功的,

            }else if(loginUser!=null){
            return invocation.invoke(); 

//或者是非法url,直接  跳回登陸頁面
        }else{
            return "login";
        }
        
    }

}

3、怎麼編寫過濾器

  Web.xml配置,以下欄位放在servlet下

 <filter>
  <filter-name>sessionFilter</filter-name>
  <filter-class>com.FlyPig.util.filter_session</filter-class>
 </filter>

 <filter-mapping>
  <filter-name>sessionFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 import javax.servlet.http.HttpSession;
14 
15 public class filter_session implements Filter {
16     private String encoding;
17 
18     public filter_session() {
19     }
20 
21     public void init(FilterConfig filterconfig) throws ServletException {
22         encoding = "utf-8";
23     }
24 
25     public void doFilter(ServletRequest servletrequest,
26             ServletResponse servletresponse, FilterChain filterchain)
27             throws IOException, ServletException {
28         servletrequest.setCharacterEncoding(encoding);
29         servletresponse.setCharacterEncoding(encoding);
30         HttpServletRequest req=(HttpServletRequest)servletrequest;
31         HttpSession session=req.getSession();
32         HttpServletResponse resp=(HttpServletResponse) servletresponse;
33         
34         String url=req.getRequestURI();
35         System.out.println(url);
36         if(!url.equals("/FlyPig")&&!url.equals("/FlyPig/login.jsp")){
37             if(session.getAttribute("username")==null||session.getAttribute("username")==""){
38                 resp.sendRedirect("login.jsp");
39                 return ;
40             }
41         }
42         
43         
44         filterchain.doFilter(servletrequest, servletresponse);
45     }
46 
47     public void destroy() {
48     }
49 }

並附帶了一個ssh的專案具體攔截器配置就在專案中,大家可以下載下來看一下

相關推薦

攔截過濾器區別以及他們配置

1、 過濾器,是在java web中,你傳入的request,response提前過濾掉一些資訊,或者提前設定一些引數,然後再傳入servlet或者struts的 action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果使用者沒有登陸都過濾掉),

關於攔截過濾器使用場景、攔截過濾器區別以及配置整理

轉:http://blog.csdn.net/qq_36411874/article/details/53996873 攔截器與過濾器的區別總結: 過濾器在web.xml中配置: (1)因為一開始在過濾器中對映的url-pattern填寫路徑是*.actio

攔截過濾器區別以及兩者的執行順序?

過濾器,是在java web中,你傳入的request,response提前過濾掉一些資訊,或者提前設定一些引數,然後再傳入servlet或者struts的 action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果使用者沒有登陸都過濾掉),或者在傳入servlet或者 s

攔截過濾器區別

攔截器 過濾器 interceptor filter 攔截器過濾器關鍵詞AOP、代理模式、反射機制、spring 函數回調、servlet、web原理反射機制函數回調容器不依賴servlet依賴servlet作用範圍只能對action請求起作用可以訪問action上下文、值棧裏的對象可以對所有

關於攔截過濾器使用場景、攔截過濾器區別整理

body fcm 選擇符 spf java ee 彈性 javaee 定義 asp 過濾器在web.xml中配置: (1)因為一開始在過濾器中映射的url-pattern填寫路徑是*.action。所有的action要經過它的過濾。<url-pattern>*.

談談攔截過濾器區別

let 函數回調 依賴 servle pos 裏的 AC 截器 被調用 1、攔截器是基於java反射機制的,而過濾器是基於函數回調的。 2、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請

攔截過濾器區別,Struts2SpringMVC的區別

攔截器和過濾器 1.攔截器是基於java反射機制的,而過濾器是基於函式回撥的; 2.攔截器不依賴於servlet容器,而過濾器依賴於servlet容器; 3.攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用; 4.攔截器可以訪問Action上下文、值棧裡的物件,而過

攔截過濾器區別

his view uri servlet容器 des owa acc long nlog 比如動態代理就是攔截器的簡單實現, public Object invoke(Object proxy, Method method, Object[] args) throws Th

Spring Boot實戰:攔截過濾器

www container extends post 代理 init 切面 請求 一個 一、攔截器與過濾器   在講Spring boot之前,我們先了解一下過濾器和攔截器。這兩者在功能方面很類似,但是在具體技術實現方面,差距還是比較大的。在分析兩者的區別之前,

struct_2攔截過濾器

機制 步驟 conf ava 方法 struct 登錄用戶 提交 簡單實現 這個為網上所剪切的知識點,僅為個人學習所用,無其他用途。 過濾器,是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或

分享知識-快樂自己:Struts2 攔截 過濾器

攔截器的使用以及配置: package com.gdbd.interceptor; import com.gdbd.pojo.UserInfo; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwor

攔截過濾器區別總結

因為過濾器Filter是servlet相關的由serviette容器tomcat管理,而攔截器Interceptor是spring管理,因為web程式執行過程就是先啟動tomcat容器,之後再在容器中呼叫spring那些東西,所以首先我猜測順序是先走Filter過濾器 後進

Struts2中攔截過濾器

核心:Struts2的核心就是攔截器,是基於過濾器開發的,所以最好與filter聯動對比學習 攔截器與過濾器的區別 : 1. 攔截器是基於java的反射機制的,而過濾器是基於函式回撥。 2. 攔截

萬字長文帶你徹底學會攔截過濾器

## SpringMVC攔截器介紹 ### 什麼是攔截器 **Spring MVC中的攔截器(Interceptor)類似於Servlet中的過濾器(Filter)**,它主要用於攔截使用者請求並作相應的處理。例如通過攔截器可以進行許可權驗證、記錄請求資訊的日誌、判斷使用者是否登入等。 ### 攔

java中攔截過濾器監聽器的區別

一、攔截器         interceptor:java裡的攔截器是動態攔截Action呼叫的物件。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的

struts2攔截的執行原理以及攔截過濾器區別

struts2攔截器的執行原理:     注意:struts2.1.3以後的版中下邊這張圖中的FilterDispatcher已經改為StrutsPrepareAndExecuteFilter     1.首先伺服器接受請求,首先載入web.xml,通過核心控制器Stru

filter(過濾器)攔截(AOP)區別

攔截器和過濾器的區別:   1、攔截器是基於java的反射機制,過濾器是基於java的函式回撥   2、攔截器不依賴於servlet容器,而過濾器依賴於servlet容器   3、攔截器只能對action請求起作用,過濾器幾乎對所有的請求起作用   4、攔截器可以訪問action上下文,值棧裡的物

過濾器(Filter)攔截(Interceptor)的區別

https class 作用 lan intercept 依賴 攔截器 www. clas 1 、攔截器是基於java的反射機制的,而過濾器是基於函數回調。 2 、攔截器不依賴與servlet容器,過濾器依賴與servlet容器。 3 、攔截器只能對action請求起作

攔截過濾器區別

str span line 實現 沒有 內部 不依賴 resp left 攔截器和過濾器都可以用來實現橫切關註功能,其區別主要在於: 1、攔截器是基於java反射機制的,而過濾器是基於函數回調的。 2、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。 3

Struts2攔截過濾器區別

tex ext struts 依賴 上下 生命周期 action 上下文 區別 ①過濾器依賴於Servlet容器,而攔截器不依賴於Servlet容器。 ②Struts2 攔截器只能對Action請求起作用,而過濾器則可以對幾乎所 有請求起作用。 ③攔截器可以訪問 Actio