Ok>
dependencies{
//
//Ok>
区别如下:
1 、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2 、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3 、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4 、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5 、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
使用如下:
在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。
这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。
扩展资料:
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些 *** 作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。
参考资料:
在工作中,我们常常需要在不改变源码的条件下对sql进行一些修改。
在这过程中用到的技术原理就是mybatis的拦截器(对于mybatis的内置对象笔者也还知之甚少,但这个不耽误咱使用mybatis的拦截器)。
package cominterceptorsmybatis;
import lombokexternslf4jSlf4j;
import orgapachecommonslang3StringUtils;
import orgapacheibatisexecutorstatementStatementHandler;
import orgapacheibatismappingBoundSql;
import orgapacheibatismappingMappedStatement;
import orgapacheibatismappingSqlCommandType;
import orgapacheibatismappingSqlSource;
import orgapacheibatisplugin;
import orgapacheibatisreflectionDefaultReflectorFactory;
import orgapacheibatisreflectionMetaObject;
import orgapacheibatisreflectionSystemMetaObject;
import orgapacheibatisreflectionfactoryDefaultObjectFactory;
import orgapacheibatisreflectionwrapperDefaultObjectWrapperFactory;
import orgapacheibatissessionResultHandler;
import orgapacheibatissessionRowBounds;
import orgspringframeworkstereotypeComponent;
import javalangreflectField;
import javalangreflectMethod;
import javasqlConnection;
import javautilProperties;
@Component
@Intercepts({
@Signature(
type = StatementHandlerclass, method ="prepare", args = {Connectionclass, Integerclass})
})
@Slf4j
public class MybatisSqlInterceptorimplements Interceptor {
@Override
public Object intercept(Invocation invocation)throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocationgetTarget();
MetaObject metaObject = MetaObjectforObject(statementHandler, SystemMetaObjectDEFAULT_OBJECT_FACTORY, SystemMetaObjectDEFAULT_OBJECT_WRAPPER_FACTORY,new DefaultReflectorFactory());
//先拦截到RoutingStatementHandler,里面有个StatementHandler类型的delegate变量,其实现类是BaseStatementHandler,然后就到BaseStatementHandler的成员变量mappedStatement
MappedStatement mappedStatement = (MappedStatement) metaObjectgetValue("delegatemappedStatement");
//id为执行的mapper方法的全路径名
String id = mappedStatementgetId();
//sql语句类型 select、delete、insert、update
String sqlCommandType = mappedStatementgetSqlCommandType()toString();
BoundSql boundSql = statementHandlergetBoundSql();
//获取到原始sql语句
String sql = boundSqlgetSql();
String mSql = sql;
//TODO 修改位置
//注解逻辑判断 添加注解了才拦截
Class classType = ClassforName(mappedStatementgetId()substring(0, mappedStatementgetId()lastIndexOf("")));
String mName = mappedStatementgetId()substring(mappedStatementgetId()lastIndexOf("") +1, mappedStatementgetId()length());
for (Method method : classTypegetDeclaredMethods()) {
if (methodisAnnotationPresent(InterceptAnnotationclass) && mNameequals(methodgetName())) {
InterceptAnnotation interceptorAnnotation = methodgetAnnotation(InterceptAnnotationclass);
if (interceptorAnnotationflag()) {
//重新设置mapper接口的参数或者对sql进行改造
boundSqlsetAdditionalParameter("","");
}
}
}
//通过反射修改sql语句
Field field = boundSqlgetClass()getDeclaredField("sql");
fieldsetAccessible(true);
fieldset(boundSql, mSql);
return invocationproceed();
}
@Override
public Object plugin(Object target) {
if (targetinstanceof StatementHandler) {
return Pluginwrap(target,this);
}else {
return target;
}
}
@Override
public void setProperties(Properties properties) {
}
}
package cominterceptorsmybatis;
import javalangannotationElementType;
import javalangannotationRetention;
import javalangannotationRetentionPolicy;
import javalangannotationTarget;
@Target({ElementTypeMETHOD, ElementTypePARAMETER})
@Retention(RetentionPolicyRUNTIME)
public @interface InterceptAnnotation {
boolean flag()default true;
}
(对于mybatis拦截器的使用还需要了解mybatis更多的内置方法,本篇文章也只是mybatis拦截器的一点皮毛)
以上就是关于Android网络请求库【OkHttp4.9.3】基本用法与原理分析全部的内容,包括:Android网络请求库【OkHttp4.9.3】基本用法与原理分析、struts2中拦截器中也无处理,没有做任何拦截或者验证是怎么回事、用struts2拦截器错误信息如何显示在页面上等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)