- 浏览: 1064572 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
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 440jmap -heap pid : 查看堆的使用状况信息 ... -
java dump线程日志
2016-02-15 10:52 1469JVM 自带的工具获取线程堆栈: JDK自带命令行工具获取 ... -
spring 拦截器
2015-05-05 16:07 8331.拦截器配置 <mvc:intercepto ... -
用 ThreadLocal 管理用户session
2014-11-10 15:47 9191很多项目中需要在代码中使用当前登录用户的信息,但是又不方便把 ... -
JAVA并发控制的几种办法
2014-08-25 16:43 2742假如有十张票,现在 ... -
synchronized
2014-08-21 16:58 1248synchronized 关键字的作 ... -
非阻塞同步机制与CAS操作
2014-07-29 16:07 1391锁的劣势 Java ... -
线程简介(转)
2014-04-21 12:06 768一、线程概述 线程是 ... -
什么是线程,如何创建线程
2014-04-21 12:03 920如果你学习过操作系统 ... -
线程池有助于实现最佳资源利用率
2014-04-21 10:01 1421为什么要用线程池? 诸如 Web 服务器、数据库服务器、 ... -
spring实现初始化和销毁bean之前进行的操作
2014-03-03 19:01 972第一种:通过@PostConstruct 和 @PreDes ... -
文章自动添加超链接
2014-01-14 16:01 2177在网上可以发现,很多文章中的关键词会有超链接,超链接的实现 ... -
JVM 内存监控
2013-11-28 14:17 1039jps Java进程查看工具,实际上它和Unix/Lin ... -
freemarker操作字符串,数字,布尔类型函数
2013-11-26 16:45 6606布尔类型 1. 后台不能将值设置为Boolean对 ... -
汉字转拼音
2013-11-26 16:39 1193import net.sourceforge.pinyin4 ... -
birt读取现有系统的数据库配置作为数据源
2013-09-10 13:51 3799Birt的数据源可以用多种形式,当我们把BIRT嵌入到现有 ... -
birt动态SQL
2013-07-26 18:05 9058birt动态SQL实现有三种方式:拼接SQL、绑定变量和让 ... -
关于spring事务
2013-06-13 14:44 984在ORACLE数据库中,一般DDL语句是隐式COMMIT提交 ... -
Tomcat Server是如何处理http请求的
2013-05-08 10:24 1293假设来自客户的请求为:http://localhost:8 ... -
注解annotation
2013-05-07 14:40 1094ava注解是附加在代码中的一些元信息,用于一些工具在编译、运 ...
相关推荐
struts 拦截器,扩展,以及java annotation 这个是我学习所用,放在此处,作为中转。
4.3 研究内建的Struts 2拦截器 67 4.3.1 工具拦截器 67 4.3.2 数据转移拦截器 67 4.3.3 工作流拦截器 69 4.3.4 其他拦截器 72 4.3.5 内建的拦截器栈 73 4.4 声明拦截器 74 4.4.1 声明独立的拦截器和拦截器栈 74 ...
4.1 拦截器在Struts2中的缺省应用 47 4.2 拦截器原理实现 50 4.3 在Struts2中配置自定义的拦截器 53 4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的...
Struts2的核心组成部分是Action,拦截器和结果页。 Struts2提供了许多方法来创建Action类,并通过struts.xml中或通过注释进行配置。我们可以创建自己的拦截器实现常见任务。 Struts2中自带了很多的标签,并使用...
在核心实现篇中,通过源码解析,帮助广大开发者从Struts 2自身的设计原理上去掌握Web层开发的要点,如数据、动作、拦截器、视图、Plugin、配置、过程;最佳实践篇介绍了一些在实战中提炼出来的针对Struts 2的扩展和...
基于AOP(面向切面编程)思想的拦截器机制,更易扩展(不修改源代码的条件下,增强代码功能) 更强大、更易用输入校验功能 整合Ajax支持:json插件 Struts2的今生前世: 1.早期开发模型Servlet+JSP+JavaBean显得...
本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...
Struts 2 是Java Web 应用首选的MVC 框架。《深入浅出Struts2》对Struts 2 的工作机理进行了透彻的阐述。书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写...
6.1.2拦截器及拦截器栈的应用 111 6.1.3自定义拦截器 115 6.2类型转换器 117 6.2.1struts2内置类型转换器 117 6.2.2引用类型的转换方式 117 6.2.3特殊对象的类型转换 118 6.2.4类型转换的错误处理 121 6.3...
通过在您的操作(处理验证码输入)中扩展提供的基本操作类,或通过配置拦截器来启用 JCaptcha 支持。 ##2。 在您的应用程序中启用 JCaptcha 支持 有两种方法可以让您的应用程序使用此插件使用 JCaptcha。 从提供的 ...
12、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 60 13、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类...
AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅218K,且无第三方依赖 ...
AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅248K,且无第三方依赖
AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅538K
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅339K,且无第三方依赖 ...
AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅218K,且无第三方依赖
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...