什么是拦截器java?Java实现的拦截器
大家好,今天给各位分享什么是拦截器java的一些知识,其中也会对Java实现的拦截器进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
java中拦截器和过滤器的区别
1
拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2
拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
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();
}
lishixinzhi/Article/program/Java/hx/201311/27143为什么拦截器是基于java的反射机制
如果说拦截器是基于反射机制,也就是说拦截器
我们在xml文件中定义,但是创建不需要我们创建;每次当要执行到拦截器相关代码的时候
可以动态的执行class.forname("类名")
创建拦截器对象,而不需要我们再去创建
和操作~~~这些都是封装好了的,我们只管定义好拦截器就行,那个应该属于拦截器的一个底层实现原理!
什么是拦截器,如何配置拦截器,如何使用拦截器
需在web.xml文件中配置<filter>标签,这个标签就是用作拦截器的,具体的配置如下:
<filter>---配置过滤器
<filter-name>FirstFilter</filter-name>
---为过滤器起一个名字
<filter-class>com.itheima.filter.FirstFilter</filter-class>
---过滤器类的全路径名
<init-param>
---可选的可以配置多个过滤器的初始化参数可以在过滤器中通过FilterConfig对象来获取
<param-name>name1</param-name>
<param-value>value1</param-value>
</init-param>
</filter>
<filter-mapping>
---配置过滤器的拦截路径,一个<Filter>可以配置多个<filter-mappint>
<filter-name>FirstFilter</filter-name>
---为哪个过滤器进行配置
<url-pattern>/*</url-pattern>
---拦截哪个路径其中url-pattern的写法和学习Serlvet时的url-pattern的写法相同这个url-pattern可以配置多个
<servlet-name>Demo1Servlet</servlet-name>
---拦截哪个名字的Servlet可以配置多个
<dispatcher>REQUEST</dispatcher>
---配置拦截哪种类型的对资源的访问,可选的值有REQUESTFORWARD INCLUDE ERROR,如果不配置默认只拦截REQUEST方式,如果具体配置了就拦截具体配置的方式的对资源的访问,此标签可以配置多个
</filter-mapping>
简单点说就是需要配置<filter>和<filter-mapper>标签,filter标签里<filter-name>、<filter-class>是必须要的,filtermapper中<filter-name>、<url-pattern>是必须要的,其他标签都是可选的
OK,本文到此结束,希望对大家有所帮助。