- 浏览: 1076656 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
flyfeifei66:
list<bean> bean 中有 list&l ...
freemarker中的list -
BelloVersion:
第五种错误Remote host closed connect ...
客户端如何使用httpclient向https服务器发送数据 -
willxue:
看了半天 前面说的是错的?。。。
反向键索引的原理和用途 -
liulanghan110:
quainter 写道麻烦博主,参数为数组时,paramete ...
MYBATIS 的parameter -
quainter:
麻烦博主,参数为数组时,parameterType怎么写啊?
MYBATIS 的parameter
java拦截器的基本原理其实非常简单,说白了就是动态代理类。
下面来看一个简单的例子
首先,我建立一个拦截器的类InterceptorClass,这里的before()和after()方法是以后拦截器会执行的方法
CODE清单一:
public class InterceptorClass { public void before() { System.out.println("拦截器InterceptorClass方法调用:before()!"); } public void after() { System.out.println("拦截器InterceptorClass方法调用:after()!"); } }
我们模拟一个业务组件接口BusinessInterface,和一个业务组件实现类BusinessClass
CODE清单二:
public interface BusinessInterface { public void doSomething(); }
CODE清单三:
public class BusinessClass implements BusinessInterface { public void doSomething() { System.out.println("业务组件BusinessClass方法调用:doSomething()"); } }
然后,创建一个动态代理类DynamicProxyHandler,这个类是集成InvocationHandler接口的,动态类的原理实际上是使得当你执行一个动态方
法的时候,他可以把这个动态方法dispatch到这个动态类上来。这样,你就可以在这个方法的前后嵌入自己的一些方法。
CODE清单四:
//包含了业务对象绑定动态代理类的处理,并实现了InvocationHandler接口的invoke方法
package com.test.Interceptor;
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 inceptor = new InterceptorClass();//拦截器 // 动态生成一个代理类对象,并绑定被代理类和代理处理器 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 * 被代理接口方法的参数 * @throws Throwable */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; inceptor.before(); result = method.invoke(business, args); inceptor.after(); return result; } }
OK,我们来写个类测试一下
public static void main(String[] args) { //生成动态代理类实例 DynamicProxyHandler handler = new DynamicProxyHandler(); //生成待测试的业务组件对象 BusinessInterface business = new BusinessClass(); //将业务组件对象和动态代理类实例绑定 BusinessInterface businessProxy = (BusinessInterface) handler.bind(business); //用动态代理类调用方法 businessProxy.doSomething(); }
来看看结果:
近期struts2很流行,而且拦截器是struts2里面一个比较好的功能,下面举个例子说明一下拦截器在struts2中的用法。
struts2对拦截器实现做了一个封装,使得我们在实现的时候比较简单。
首先我们要建一个拦截器类
public class AuthorizationInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { Map session = invocation.getInvocationContext().getSession(); String userName = (String) session.get("userName"); if (userName != null && userName.equals("test")) { System.out.println("拦截器:合法用户登录---"); return invocation.invoke(); } else { System.out.println("拦截器:用户未登录---"); return Action.LOGIN; } } }
这个类是必须要继承struts2包中提供的AbstractInterceptor类,这个类有一个抽象方法intercept,这个方法是必须要实现的。
那么经理在这个拦截器里面写了一个简单的实现,对url用户合法性做了一个限制。
接下来比较关键的是过滤器在struts2中的配置,先看看代码
<package name="system" extends="struts-default"> <interceptors> <!-- 定义权限控制拦截器 --> <interceptor name="authority" class="com.sharesin.biz.common.intercepts.struts2.AuthorizationInterceptor"/> <!-- 定义一个包含权限控制的拦截器栈 --> <interceptor-stack name="mystack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="authority"></interceptor-ref> </interceptor-stack> </interceptors> <!--定义默认拦截器 --> <default-interceptor-ref name="mystack" /> <!--定义全局处理结果 --> <global-results> <result name="login">index.jsp</result> </global-results> <action name="login_*" class="com.sharesin.biz.web.system.LoginAction" method="{1}"> <result name="success">system/homepage.jsp</result> </action> </package>
在interceptors节点里,我们可以定义多个拦截器,这里的名为authority的只是其中的一个。struts2的拦截器栈我是先执行struts2默认的拦
截器defaultStack,然后再执行我的。然后只需要用default-interceptor-ref标签设置好这个system包中的默认拦截器为这个拦截器就OK了。
struts2中引入了package这个概念,我觉得十分实用,当然这对struts2拦截器也是个实惠,我们可以根据不同的action来分包和不同的拦截器
ok,来运行测试一下。
发表评论
-
JAVA内存分析
2017-09-30 18:42 507jmap -heap pid : 查看堆的使用状况信息 ... -
java dump线程日志
2016-02-15 10:52 1555JVM 自带的工具获取线程堆栈: JDK自带命令行工具获取 ... -
spring 拦截器
2015-05-05 16:07 8771.拦截器配置 <mvc:intercepto ... -
用 ThreadLocal 管理用户session
2014-11-10 15:47 9253很多项目中需要在代码中使用当前登录用户的信息,但是又不方便把 ... -
JAVA并发控制的几种办法
2014-08-25 16:43 2779假如有十张票,现在 ... -
synchronized
2014-08-21 16:58 1298synchronized 关键字的作 ... -
非阻塞同步机制与CAS操作
2014-07-29 16:07 1435锁的劣势 Java ... -
线程简介(转)
2014-04-21 12:06 807一、线程概述 线程是 ... -
什么是线程,如何创建线程
2014-04-21 12:03 972如果你学习过操作系统 ... -
线程池有助于实现最佳资源利用率
2014-04-21 10:01 1476为什么要用线程池? 诸如 Web 服务器、数据库服务器、 ... -
spring实现初始化和销毁bean之前进行的操作
2014-03-03 19:01 1016第一种:通过@PostConstruct 和 @PreDes ... -
文章自动添加超链接
2014-01-14 16:01 2209在网上可以发现,很多文章中的关键词会有超链接,超链接的实现 ... -
JVM 内存监控
2013-11-28 14:17 1083jps Java进程查看工具,实际上它和Unix/Lin ... -
freemarker操作字符串,数字,布尔类型函数
2013-11-26 16:45 6691布尔类型 1. 后台不能将值设置为Boolean对 ... -
汉字转拼音
2013-11-26 16:39 1242import net.sourceforge.pinyin4 ... -
birt读取现有系统的数据库配置作为数据源
2013-09-10 13:51 3865Birt的数据源可以用多种形式,当我们把BIRT嵌入到现有 ... -
birt动态SQL
2013-07-26 18:05 9119birt动态SQL实现有三种方式:拼接SQL、绑定变量和让 ... -
关于spring事务
2013-06-13 14:44 1021在ORACLE数据库中,一般DDL语句是隐式COMMIT提交 ... -
Tomcat Server是如何处理http请求的
2013-05-08 10:24 1336假设来自客户的请求为:http://localhost:8 ... -
注解annotation
2013-05-07 14:40 1128ava注解是附加在代码中的一些元信息,用于一些工具在编译、运 ...
相关推荐
在本文中,我们将深入探讨Struts2拦截器的工作原理。 ### 一、拦截器概念 拦截器是基于Java的动态代理机制实现的,它允许我们在Action执行前后插入自定义的行为。在Struts2中,拦截器是一个实现了`Interceptor`...
Struts2 拦截器是基于Java的Servlet Filter设计模式的一种实现,它提供了一种在Action执行前后插入额外逻辑的方式。拦截器是Struts2框架的核心组件之一,用于增强应用的功能,比如权限验证、日志记录、数据校验等。 ...
这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP(面向切面编程)思想的组件,它可以理解为在Action调用前后插入的逻辑处理。在...
总之,Struts2的拦截器机制极大地增强了框架的功能性和灵活性,使得开发者可以轻松地添加自定义逻辑,提高代码的可维护性和可扩展性。在实际项目中,合理利用拦截器可以解决许多常见的问题,提高Web应用程序的质量。
其中,拦截器(Interceptor)是Struts2中的一个关键特性,用于扩展框架的功能,实现诸如事务管理、权限控制、输入验证等功能。 #### Struts2的处理流程 1. **客户端请求**: 当客户端发起HTTP请求时,请求首先到达...
以下是对Struts2拦截器原理与实现的详细解析: 1. **拦截器的概念** Struts2拦截器是一种AOP(面向切面编程)的实现,它可以在不修改Action代码的情况下,通过定义拦截器并在配置文件中设置拦截器链,来动态地添加...
- 拦截器是Struts2的核心组件之一,它们是基于Java的动态代理机制实现的。在Action调用前后,拦截器可以执行一系列预定义的任务,如日志记录、权限验证、数据校验等。 - 拦截器链是由多个拦截器按照特定顺序组成的...
在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照配置的顺序形成一个拦截器链。每个拦截器都可以在Action执行之前或之后执行特定的任务,而无需修改Action本身。这遵循了“开闭原则”,使得代码更易于...
Struts2框架作为Java Web开发中的一种流行框架,其核心组件之一便是**拦截器**。拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。本文将深入探讨Struts2拦截器的基本概念、工作原理以及其...
通过上述内容,我们可以看到Struts2的拦截器机制是实现业务逻辑和控制逻辑分离的重要工具,它使得我们可以更灵活地扩展和管理应用程序。在实际开发中,结合适当的拦截器策略,可以显著提高代码的复用性和可维护性。
在Struts2中,拦截器的工作原理如下: 1. 用户发起HTTP请求,请求到达Struts2的Front Controller(DispatcherServlet)。 2. DispatcherServlet会根据配置找到对应的Action(动作)类。 3. 在调用Action之前,...
首先,让我们理解Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念设计的,它们形成一个链,每个拦截器按照定义的顺序依次执行。当请求到达Action时,Struts2会调用这个链上的所有拦截器,然后才...
本篇文章将深入剖析Struts2拦截器的工作原理,并通过案例"struts007"来展示如何实际应用。 首先,我们了解下拦截器的基本概念。拦截器是一个实现了Struts2提供的`Interceptor`接口的类,它定义了两个方法:`...
下面将详细探讨Struts2拦截器的源码及其工作原理。 首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的...
Struts2.X 拦截器是Apache Struts框架的核心组件之一,它是基于拦截器模式实现的,使得开发者能够方便地扩展和定制应用程序的行为。在Struts2中,拦截器扮演着中间件的角色,它在Action执行前后进行处理,可以进行如...
在Struts2中,拦截器是一个实现了`Interceptor`接口的Java类。当一个请求被发送到Struts2框架时,拦截器会按照配置的顺序依次对请求进行处理。每个拦截器都有`intercept()`方法,这个方法会在动作执行前和执行后被...
Struts拦截器是Java Web开发框架Struts2中的核心组件之一,它允许开发者在Action执行前后插入自定义的处理逻辑,实现AOP(面向切面编程)的理念。动态代理则是Java提供的一种机制,允许在运行时创建接口的实现类实例...
Struts2是一个强大的MVC框架,它通过使用拦截器(Interceptor)来实现业务逻辑与表现层的解耦,提供了一种灵活的扩展机制。在Struts2中,拦截器是AOP(面向切面编程)的一种实现,它可以监控、修改或增强方法调用的...
Struts拦截器是Java Web开发中的重要概念,尤其在基于Struts 2框架的应用中扮演着核心角色。这个"struts拦截器的例子"提供了一个学习和理解拦截器工作原理的起点,非常适合对这一主题感兴趣的初学者。 Struts 2框架...