當前位置:首頁 » 編程語言 » java的攔截器

java的攔截器

發布時間: 2022-12-31 13:23:17

1. java web 過濾器跟攔截器的區別和使用

  • 過濾器(filter):就是對請求起到過濾的作用,它在監聽器之後,作用在servlet之前,對請求進行過濾。

  • 攔截器(interceptor):就是對請求和返回進行攔截,它作用在servlet的內部,具體來說有三個地方:servlet_1和servlet_2之間,即請求還沒有到controller層。servlet_2和servlet_3之間,即請求走出controller層次,還沒有到渲染時圖層。servlet_3和servlet_4之間,即結束視圖渲染,但是還沒有到servlet的結束。

  • 它們之間的關系,可以用一張圖來表示:

2. Java實現的攔截器

攔截器在在流行的開源框架中很常見 依賴的技術就是Java的動態代理

理解攔截器的核心原理對理解這些開源框架的體系結構至關重要

下面以一個簡單的模型的來說明攔截器的實現的一般方法

模型分為以下模塊

業務組件 是被代理和被攔截的對象

代理處理器 實現了InvocationHandler介面的一個對象

代理對象 Proxy對象

攔截器 普通的JavaBean 在調用業務方法的之前或者之後會自動攔截並執行自己的一些方法

客戶端 執行業務處理的入口

以下是模型的實現

一 業務組件 分為業務介面和業務類

/**

* 業務組件介面

*/

public interface BusinessInterface {

public void doSomething();

}

/**

* 業務組件

*/

public class BusinessClass implements BusinessInterface{

public void doSomething() {

System out println( 業務組件BusinessClass方法調用:doSomething() );

}

}

二 代理處理器 包含了業務對象綁定動態代理類的處理 並實現了 InvocationHandler介面的invoke方法

import java lang reflect InvocationHandler;

import java lang reflect Method;

import java lang reflect Proxy;

/**

* 動態代理處理器工具

*/

public class DynamicProxyHandler implements InvocationHandler {

private Object business; //被代理對象

private InterceptorClass interceptor = new InterceptorClass(); //攔截器

/**

* 動態生成一個代理類對象 並綁定被代理類和代理處理器

*

* @param business

* @return 代理類對象

*/

public Object bind(Object business) {

this business = business;

return Proxy newProxyInstance(

//被代理類 的ClassLoader

business getClass() getClassLoader()

//要被代理 的介面 本方法返回對象會自動聲稱實現了這些介面

business getClass() getInterfaces()

//代理處理 器對象

this);

}

/**

* 代理要調用的方法 並在方法調用前後調用連接器的方法

*

* @param proxy 代理類對象

* @param method 被代理的介面方法

* @param args 被代理介面方法的參數

* @return 方法調用返回的結果

* @throws Throwable

*/

public Object invoke(Object proxy Method method Object[] args) throws Throwable {

Object result = null;

interceptor before();

result=method invoke(business args);

interceptor after();

return null; //To change body of implemented methods use File | Settings | File Templates

}

}

三 攔截器 普通的JavaBean 在調用業務方法的之前或者之後會自動攔截並執行自己的 一些方法

/**

* 攔截器

*/

public class InterceptorClass {

public void before(){

System out println( 攔截器InterceptorClass方法調用:before()! );

}

public void after(){

System out println( 攔截器InterceptorClass方法調用:after()! );

}

}

四 模擬客戶端 執行業務處理的入口

/**

* 客戶端

*/

public class Client {

public static void main(String args[]) {

DynamicProxyHandler handler = new DynamicProxyHandler();

BusinessInterface business = new BusinessClass();

BusinessInterface businessProxy = (BusinessInterface) handler bind(business);

businessProxy doSomething();

}

lishixin/Article/program/Java/hx/201311/27143

3. Java中的過濾器、攔截器、監聽器分別是什麼意思

王朝*說的很全面了,翻閱了幾本資料後,從J2EE的角度略作補充吧。
1)首先是攔截器,攔截器是一種面向方面/切面編程(AOP Aspect-Oriented Programming),而面向切面就是將多個模塊的的通用服務進行分離,如許可權管理、日誌服務,他們在多個模塊中都會用到,就可以將其各自封裝為一個可重用模塊。而這些通用服務的具體實現是通過攔截器來完成,比如用戶客戶端訪問一些保密模塊都應先通過許可權審查的攔截器來進行許可權審查,確定用戶是否具有該項操作的許可權後方能向下執行。
2)過濾器,過濾器處於客戶端與Web資源(Servlet、JSP、HTML)之間,客戶端與Web資源之間的請求和響應都要通過過濾器進行過濾。舉例:在過濾器中定義了禁止訪問192.10.10.1這個地址,那麼當客戶端發出訪問192.10.10.1的請求時,經過過濾器後,客戶端得到的響應是出現該IP禁止訪問的提示。再舉個例子,我們J2EE項目中的許可權管理就是通過過濾器實現的,網站有不用身份的用戶(系統管理員、會員級用戶、瀏覽者臨時用戶),不用身份對系統的功能模塊具有不同的訪問許可權,可以將各功能模塊以*.do命名,然後在過濾器中配置過濾*.do,就可以控制不同級別用戶的訪問許可權了
3)監聽器,是針對事件而說的,可以說是事件監聽器,J2EE中事件主要有三類:ServletContext事件、會話事件和請求事件。以ServletContext對象的創建事件為例,利用針對ServletContext對象創建事件的監聽器來監聽,一旦監聽到有ServletContext對象的創建事件(比如項目啟動時的初化),就讀取相應的資料庫連接操作來保存供調用。簡單來說監聽器就是監聽一些對象和屬性等的增加、修改和刪除,一旦監聽到相應事件就會觸發某種活動,做出相應處理。
答案均系在圖書館查閱資料後手敲,不知滿意否,呵呵。

4. java 攔截器

好像是不行吧!攔截器是攔截客戶端請求和服務端響應的,Action是處理客戶端請求並生成響應的,攔截器是工作在兩者之間的,對客戶端的請求攔截,對服務端的響應攔截。

5. 攔截器(Interceptor)和過濾器(Filter)的區別和執行順序)

1)攔截器是基於java的反射機制的,而過濾器是基於函數回調。

2)攔截器是依賴於web框架,而過濾器是依賴於servlet容器。

3)攔截器只能對action請求起作用,而過濾器可以對request請求和response響應起作用。

3)攔截器可以處理業務邏輯,而過濾器不能。

4)在action的生命周期中,攔截器實例可以多次被調用,而過濾器實例只能在servlet容器初始化時被調用一次。

過濾器前 -> 攔截器前 -> action處理 -> 攔截器後 -> 過濾器後。

6. java如何實現攔截簡訊功能

java里的攔截器是動態攔截Action調用的對象,它提供了一種機制可以使開發者在一個Action執行的前後執行一段代碼,也可以在一個Action

執行前阻止其執行,同時也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用於在某個方法或者欄位被訪問之前,進行攔截

然後再之前或者之後加入某些操作。目前,我們需要掌握的主要是Spring的攔截器,Struts2的攔截器不用深究,知道即可。

2,攔截器的原理

大部分時候,攔截器方法都是通過代理的方式來調用的。Struts2的攔截器實現相對簡單。當請求到達Struts2的ServletDispatcher時,Struts2

會查找配置文件,並根據配置實例化相對的攔截器對象,然後串成一個列表(List),最後一個一個的調用列表中的攔截器。Struts2的攔截器是可

插拔的,攔截器是AOP的一個實現。Struts2攔截器棧就是將攔截器按一定的順序連接成一條鏈。在訪問被攔截的方法或者欄位時,Struts2攔截器鏈

中的攔截器就會按照之前定義的順序進行調用。

3,自定義攔截器的步驟

第一步:自定義一個實現了Interceptor介面的類,或者繼承抽象類AbstractInterceptor。

第二步:在配置文件中注冊定義的攔截器。

第三步:在需要使用Action中引用上述定義的攔截器,為了方便也可以將攔截器定義為默認的攔截器,這樣在不加特殊說明的情況下,所有的

Action都被這個攔截器攔截。

4,過濾器與攔截器的區別

過濾器可以簡單的理解為「取你所想取」,過濾器關注的是web請求;攔截器可以簡單的理解為「拒你所想拒」,攔截器關注的是方法調用,比如攔截

敏感詞彙。

4.1,攔截器是基於java反射機制來實現的,而過濾器是基於函數回調來實現的。(有人說,攔截器是基於動態代理來實現的)

4.2,攔截器不依賴servlet容器,過濾器依賴於servlet容器。

4.3,攔截器只對Action起作用,過濾器可以對所有請求起作用。

4.4,攔截器可以訪問Action上下文和值棧中的對象,過濾器不能。

4.5,在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時調用一次。

5,Spring攔截器

7. Java實現攔截HTTP請求的幾種方式

在Java的服務端開發當中,攔截器是很常見的業務場景,這里對Java開發當中幾種常見的攔截器的實現方式進行記錄和分析。案例說明基於Spring Boot環境。
一:實現javax.servlet.Filter介面(使用過濾器方式攔截請求)
import org.springframework.stereotype.Component;import javax.servlet.*;import java.io.IOException;import java.util.Date;@Componentpublic class TimeInterceptor implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("time filter init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("time filter start");long start = new Date().getTime();filterChain.doFilter(servletRequest, servletResponse);System.out.println("time filter 耗時:"+(new Date().getTime()-start));System.out.println("time filter finish");}@Overridepublic void destroy() {System.out.println("time filter destroy");}}

如使用@Compent註解聲明不需要加入其它配置即可使得攔截器生效,但是默認攔截/*,會攔截所有請求。
二:使用@Bean注入自定義攔截器,依然上面的代碼,去掉@Compent註解,創建TimeWebConfig配置類:
import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.ArrayList;import java.util.List;@Configurationpublic class TimeWebConfig {@Beanpublic FilterRegistrationBean timeFilter(){FilterRegistrationBean registrationBean = new FilterRegistrationBean();TimeInterceptor interceptor = new TimeInterceptor();registrationBean.setFilter(interceptor);List<String> urls = new ArrayList<>();urls.add("/user/*");registrationBean.setUrlPatterns(urls);return registrationBean;}}

上面這兩種攔截請求的實現是基於JavaEE提供的Filter介面實現的,缺點在於,該攔截器實際上是一個過濾器,執行代碼的方法doFilter只提供了request,response等參數,當請求進入被過濾器攔截的時候,我們並不知道這個請求是由哪個控制器的哪個方法來執行的。
三:使用springMVC提供的攔截器,實現org.springframework.web.servlet.HandlerInterceptor介面:
創建自定義的攔截器:
import org.springframework.stereotype.Component;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Date;@Componentpublic class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {System.out.println("preHandler");System.out.println(((HandlerMethod) handler).getBean().getClass().getName());System.out.println(((HandlerMethod) handler).getMethod().getName());httpServletRequest.setAttribute("start", new Date().getTime());return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandler");Long start = (Long) httpServletRequest.getAttribute("start");System.out.println("time interceptor 耗時:"+(new Date().getTime()-start));}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");Long start = (Long) httpServletRequest.getAttribute("start");System.out.println("time interceptor 耗時:"+(new Date().getTime()-start));System.out.println("ex is:"+e);}}

創建配置類:
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {@Autowiredprivate MyInterceptor interceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(interceptor).addPathPatterns("/user/*").excludePathPatterns("/blog/*");}}

此種方式的攔截器當中我們能夠獲取攔截的請求對應的類和方法的相關信息,缺點在於該handler對象無法獲取具體執行方法的參數信息。
四:利用Spring的切面(AOP)實現攔截器:
引入jar包:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

創建切片類:
import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import java.util.Date;@Aspect@Componentpublic class TimeAspect {@Around("execution(* com.qinker.controller.UserController.*(..))")public Object handlerControllerMethod(ProceedingJoinPoint point) throws Throwable {System.out.println("time aspect start");long start = new Date().getTime();Object[] args = point.getArgs();for (Object obj : args) {System.out.println("arg is:"+obj);}Object obj = point.proceed();//具體方法的返回值System.out.println("aspect 耗時:"+(new Date().getTime()-start));System.out.println("time aspect end");return obj;}}
aspectj基於AOP實現的攔截器功能十分強大,具體詳解請參考spring官網網站的文檔。

8. java語言中攔截器、過濾器、監聽器都是什麼意思

過濾器,是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts2的
action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者
struts2的action前統一設置字元集,或者去除掉一些非法字元
攔截器,是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。

攔截器與過濾器的區別 :
攔截器是基於java的反射機制的,而過濾器是基於函數回調。
攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
執行順序 :過濾前 - 攔截前 - Action處理 - 攔截後 -
過濾後。個人認為過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登錄用戶不能訪問內部頁面的處理);過濾通過後,攔截器將檢查用戶提交數
據的驗證,做一些前期的數據處理,接著把處理後的數據發給對應的Action;Action處理完成返回後,攔截器還可以做其他過程,再向上返回到過濾器的後續操作。

監聽器:這個東西在c/s模式裡面經常用到,他會對特定的事件產生產生一個處理。監聽在很多模式下用到。比如說觀察者模式,就是一個監聽來的。又比如struts2可以用監聽來啟動。Servlet監聽器用於監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生後可以做一些必要的處理。
好比如果說Servlet的監聽器Listener,它是實現了javax.servlet.ServletContextListener
介面的伺服器端程序,它也是隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷毀。主要作用是:
做一些初始化的內容添加工作、設置一些基本的內容、比如一些參數或者是一些固定的對象等等。

9. java web 過濾器跟攔截器的區別和使用

區別如下:

1 、攔截器是基於java的反射機制的,而過濾器是基於函數回調。

2 、攔截器不依賴與servlet容器,過濾器依賴與servlet容器。

3 、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。

4 、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。

5 、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。

使用如下:

在Servlet作為過濾器使用時,它可以對客戶的請求進行處理。處理完成後,它會交給下一個過濾器處理,這樣,客戶的請求在過濾鏈里逐個處理,直到請求發送到目標為止。例如,某網站里有提交「修改的注冊信息」的網頁,當用戶填寫完修改信息並提交後,伺服器在進行處理時需要做兩項工作:判斷客戶端的會話是否有效;對提交的數據進行統一編碼。

這兩項工作可以在由兩個過濾器組成的過濾鏈里進行處理。當過濾器處理成功後,把提交的數據發送到最終目標;如果過濾器處理不成功,將把視圖派發到指定的錯誤頁面。

(9)java的攔截器擴展閱讀

攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。

在Webwork的中文文檔的解釋為——攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。

過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。

10. java web 過濾器跟攔截器的區別和使用

java web 過濾器跟攔截器的區別和使用分別介紹如下:

1、過濾器的使用

Filter主要對客戶端的請求和伺服器的響應進行過濾,使用場景:

  • 客戶端的請求到達伺服器,伺服器真正開始處理這個請求之前,要經過Filter的過濾

  • 伺服器真正的處理完這個請求,生成響應之後,要經過Filter的過濾,才能將響應發送給客戶端

作用:可以通過Filter技術,對web伺服器管理的所有web資源,例如JSP、Servlet、靜態圖片文件或靜態 html文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的許可權訪問控制、過濾敏感詞彙、壓縮響應信息等一些高級功能。

  • 配置Filter

同開發Servlet一樣,寫完了類,接下來就是配置了,我們需要在web.xml文件中配置Filter。具體的配置和Servlet配置如出一轍。

<filter>
<filter-name>log</filter-name>
<filter-class>com.jellythink.practise.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

上面配置中比較重要的就是url-pattern和dispatcher了。

過濾類:

public class LogFilter implements Filter
{
private FilterConfig config;

public void init(FilterConfig config)
{
this.config = config;
}

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

// 這個方法是Filter的核心方法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
// 對用戶的請求進行處理
ServletContext context = this.config.getServletContext();
long begin = System.currentTimeMillis();

// 輸出過濾信息
System.out.println("開始過濾...");
HttpServletRequest hRequest = (HttpServletRequest)request;
System.out.println("Filter已經截獲到用戶請求的地址:" + hRequest.getServletPath());
// 處理完以後,將請求交給下一個Filter或者Servlet處理
chain.doFilter(request, response);
// 對伺服器的響應進行處理
long end = System.currentTimeMillis();
System.out.println("過濾結束");
System.out.println("請求被定為到:" + hRequest.getRequestURI() + "; 所花費的時間為:" + (end - begin));
}
}

2、攔截器的使用:

攔截器的主要作用是攔截用戶的請求並進行相應的處理。比如通過它來進行許可權驗證,或者是來判斷用戶是否登陸,或者是像12306那樣子判斷當前時間是否是購票時間。

1.在SpringMVC的配置文件中加上支持MVC的schema

xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation=" http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
下面是聲明示例:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

這樣在SpringMVC的配置文件中就可以使用mvc標簽了,mvc標簽中有一個mvc:interceptors是用於聲明SpringMVC的攔截器的。

熱點內容
華為雲穩定伺服器 發布:2025-07-02 13:58:09 瀏覽:426
安卓游戲在哪裡下載免費 發布:2025-07-02 13:58:08 瀏覽:595
mts壓縮 發布:2025-07-02 13:53:31 瀏覽:964
資料庫的事務事務 發布:2025-07-02 13:51:15 瀏覽:609
買五菱s3哪個配置好 發布:2025-07-02 13:51:11 瀏覽:772
天乾地支對照表及演算法 發布:2025-07-02 13:50:04 瀏覽:786
我的世界上線送神裝伺服器 發布:2025-07-02 13:48:24 瀏覽:315
多ip雲伺服器怎麼設置 發布:2025-07-02 13:46:29 瀏覽:67
鳥哥的linux私房菜基礎篇第三版 發布:2025-07-02 13:44:46 瀏覽:107
我姐姐手機上的密碼多少的短視頻 發布:2025-07-02 13:09:10 瀏覽:800