shiro 自定义拦截器器后,怎么调用

struts2自定义的拦截器不能加载使用。_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:474,427贴子:
struts2自定义的拦截器不能加载使用。收藏
拦截器类:
和张大佛爷、二月红一起去探秘矿洞墓穴!
struts.xml中配置和使用:
启动服务器报错:09:26:11,537
WARN InterceptorBuilder:60 - Unable to load config class zhuomh.shop.util.PrivilegeInterceptor at interceptor - file:/D:/apache-tomcat-7.0.67/wtpwebapps/ZhuomhShopOL/WEB-INF/classes/struts.xml:20:92 probably due to a missing jar, which might be fine if you never plan to use the privilegeInterceptor interceptor09:26:11,537 ERROR InterceptorBuilder:42 - Actual exceptionCaught Exception while registering Interceptor class zhuomh.shop.util.PrivilegeInterceptor - interceptor - file:/D:/apache-tomcat-7.0.67/wtpwebapps/ZhuomhShopOL/WEB-INF/classes/struts.xml:20:92 at com.opensymphony.xwork2.factory.DefaultInterceptorFactory.buildInterceptor(DefaultInterceptorFactory.java:64) at com.opensymphony.xwork2.ObjectFactory.buildInterceptor(ObjectFactory.java:209) at com.opensymphony.xwork2.config.providers.InterceptorBuilder.constructInterceptorReference(InterceptorBuilder.java:70) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.lookupInterceptorReference(XmlConfigurationProvider.java:1114) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.buildInterceptorList(XmlConfigurationProvider.java:630) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:444) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:556) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:295) at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:264) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67) at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:967) at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:435) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:479) at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:57) at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260) at org.apache.catalina.core.ApplicationFilterConfig.&init&(ApplicationFilterConfig.java:105) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4917) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5609) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:677) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1939) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)Caused by: java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.&init&(Unknown Source) at org.springframework.asm.ClassReader.&init&(Unknown Source) at org.springframework.asm.ClassReader.&init&(Unknown Source) at org.springframework.core.LocalVariableTableParameterNameDiscoverer.inspectClass(LocalVariableTableParameterNameDiscoverer.java:110) at org.springframework.core.LocalVariableTableParameterNameDiscoverer.getParameterNames(LocalVariableTableParameterNameDiscoverer.java:85) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:193) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1049) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowire(AbstractAutowireCapableBeanFactory.java:344) at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:194) at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:164) at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:178) at com.opensymphony.xwork2.factory.DefaultInterceptorFactory.buildInterceptor(DefaultInterceptorFactory.java:42) ... 31 more
报错说,可能少了一个jar包,我看了一下,没少啊,struts2包都在这
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或Java的Struts框架中Action的编写与拦截器的使用方法
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Java的Struts框架中Action的编写与拦截器的使用方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
Struts2 Action/动作
动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架。每个URL将被映射到一个特定的动作,它提供了来自用户的请求提供服务所需的处理逻辑。
但动作也提供其他两个重要的能力。首先,操作从请求数据的传输中起着重要的作用,通过向视图,无论是一个JSP或其它类型的结果。二,动作必须协助的框架,在确定结果应该渲染视图,在响应该请求将被退回。
创建动作:
在Struts2的动作,唯一的要求是必须有一个无参数的方法返回String或结果的对象,必须是一个POJO。如果不带参数的方法是不指定,则默认动作是使用execute()方法。
也可以选择扩展ActionSupport类实现了6个接口,包括动作界面。动作界面如下:
public interface Action {
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws E
让我们来看看Hello World示例的操作方法:
package com.yiibai.struts2;
public class HelloWorldAction{
public String execute() throws Exception {
return "success";
public String getName() {
public void setName(String name) {
this.name =
为了说明这一点,操作方法控制视图,让我们做出以下更改执行方法和扩展类ActionSupport 如下:
package com.yiibai.struts2;
import com.opensymphony.xwork2.ActionS
public class HelloWorldAction extends ActionSupport{
public String execute() throws Exception {
if ("SECRET".equals(name))
return SUCCESS;
return ERROR;
public String getName() {
public void setName(String name) {
this.name =
在这个例子中,我们有一些在execute方法的逻辑来看待的name属性。如果属性等于字符串“SECRET”,我们返回SUCCESS 的结果,否则我们返回ERROR 的结果。因为我们已经扩展ActionSupport,所以我们可以使用字符串常量的成功和错误。现在,让我们修改我们的struts.xml文件如下:
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&constant name="struts.devMode" value="true" /&
&package name="helloworld" extends="struts-default"&
&action name="hello"
class="com.yiibai.struts2.HelloWorldAction"
method="execute"&
&result name="success"&/HelloWorld.jsp&/result&
&result name="error"&/AccessDenied.jsp&/result&
&/package&
让我们创建以下JSP文件 helloWorld.jsp 的WebContent文件夹在eclipse项目。要做到这一点,右键单击WebContent文件夹在项目资源管理器,选择New &JSP File。该文件将要求返回的结果是SUCCESS,这是一个字符串常量“success”的定义在动作界面:
&%@ page contentType="text/ charset=UTF-8" %&
&%@ taglib prefix="s" uri="/struts-tags" %&
&title&Hello World&/title&
Hello World, &s:property value="name"/&
以下是由框架的动作的结果将被调用的文件,该文件是等于字符串常量“错误”的ERROR 。以下是AccessDenied.jsp 的内容
&%@ page contentType="text/ charset=UTF-8" %&
&%@ taglib prefix="s" uri="/struts-tags" %&
&title&Access Denied&/title&
You are not authorized to view this page.
我们还需要在WebContent文件夹中创建index.jsp。该文件将作为初始动作URL,用户可以直接点击告诉Struts 2框架调用HelloWorldAction类的 execute方法,并呈现 helloWorld.jsp视图。
&%@ page language="java" contentType="text/ charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%&
&%@ taglib prefix="s" uri="/struts-tags"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"&
&title&Hello World&/title&
&h1&Hello World From Struts2&/h1&
&form action="hello"&
&label for="name"&Please enter your name&/label&&br/&
&input type="text" name="name"/&
&input type="submit" value="Say Hello"/&
就是这样,不需要改变的web.xml文件,所以让我们用同一个web.xml,是之前我们已经创建了范例章。现在,我们已经准备好运行使用Struts 2框架的 Hello World应用程序。
执行应用程序
右键点击项目名称,并单击 Export & WAR File 创建一个WAR文件。然后在Tomcat 的webapps目录下部署这个WAR。最后,启动Tomcat服务器和尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。这会给出以下画面:
让我们为“SECRET”,并输入一个字,应该看到以下页面:
现在输入任何单词而非“SECRET”,应该看到以下页面:
建立多个动作:
经常会定义一个以上的动作,以处理不同的请求,并提供不同的用户的URL,因此可以定义不同的类定义如下:
package com.yiibai.struts2;
import com.opensymphony.xwork2.ActionS
class MyAction extends ActionSupport{
public static String GOOD = SUCCESS;
public static String BAD = ERROR;
public class HelloWorld extends ActionSupport{
public String execute()
if ("SECRET".equals(name)) return MyAction.GOOD;
return MyAction.BAD;
public class SomeOtherClass extends ActionSupport{
public String execute()
return MyAction.GOOD;
在struts.xml文件中配置这些操作如下:
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&constant name="struts.devMode" value="true" /&
&package name="helloworld" extends="struts-default"&
&action name="hello"
class="com.yiibai.struts2.HelloWorld"
method="execute"&
&result name="success"&/HelloWorld.jsp&/result&
&result name="error"&/AccessDenied.jsp&/result&
&action name="something"
class="com.yiibai.struts2.SomeOtherClass"
method="execute"&
&result name="success"&/Something.jsp&/result&
&result name="error"&/AccessDenied.jsp&/result&
&/package&
正如看到在上述假设的例子,动作的结果是重复的SUCCESS和ERROR。要解决这个问题,建议创建一个类包含结果的结果。
Struts2 拦截器
拦截器的概念是Servlet过滤器或JDK代理类一样的。拦截器允许横切功能分开实现的动作,以及框架。使用拦截器,可以实现如下:
提供预处理行动之前被称为逻辑。
提供后处理逻辑动作后被调用
捕获异常,这样可以进行替代处理。
Struts2框架提供的许多功能都使用拦截实现的例子包括异常处理,文件上传,生命周期回调和验证等事实上作为Struts2的基础,其功能拦截,这可能有7或8拦截器分配给每个动作。
Struts2框架的拦截器:
Struts 2框架提供了良好的箱拦截列表来预先设定的,并准备使用。下面列出了几个重要的拦截:
请看Struts 2文档的完整细节上面提到的拦截。会告诉如何使用Struts应用程序在一个拦截器。
如何使用拦截器?
让我们来看看如何使用已有的拦截,我们的“Hello World”程序。我们将使用计时器来测量过了多长时间执行操作方法,其目的是拦截。同时使用params拦截器,其目的是发送请求参数的动作。您可以尝试不使用这个拦截您的示例中会发现,没有被设置name属性,因为参数是无法达到动作。
我们将继续HelloWorldAction.java,web.xml 的helloWorld.jsp 和 index.jsp 文件,因为他们已经建立了范例章节,但让我们如下修改struts.xml文件,添加一个拦截器
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&constant name="struts.devMode" value="true" /&
&package name="helloworld" extends="struts-default"&
&action name="hello"
class="com.yiibai.struts2.HelloWorldAction"
method="execute"&
&interceptor-ref name="params"/&
&interceptor-ref name="timer" /&
&result name="success"&/HelloWorld.jsp&/result&
&/package&
右键点击项目名称,并单击 Export & WAR File 创建一个WAR文件。然后部署在Tomcat 的webapps目录下这个WAR。最后,启动Tomcat服务器和尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。这会给你以下画面:
现在,在给定的文本框中输入单词,并单击“Say Hello按钮执行已定义的动作。现在,如果将检查生成的日志,会发现下面的文字:
INFO: Server startup in 3539 ms
27/08/:53 PM
com.opensymphony.xwork2.monsLogger info
INFO: Executed action [//hello!execute] took 109 ms.
这里底行,正在生成因为这告诉动作发生要执行的总共为 109ms定时器的拦截器。
创建自定义的拦截器
在应用程序中使用自定义的拦截器是一种优雅的方式提供横切的应用功能。创建一个自定义拦截器是很容易的,需要扩展的接口,下面的Interceptor接口:
public interface Interceptor extends Serializable{
void destroy();
void init();
String intercept(ActionInvocation invocation)
正如其名称所表明的,init()方法提供了一种方法来初始化拦截器,并destroy() 方法提供了一种工具拦截清理。不同的行动,拦截被重用跨请求和需要是线程安全的,尤其是intercept() 方法。
ActionInvocation对象可以访问运行时环境。它允许访问的动作本身和方法调用的动作,并确定动作是否已被调用。
如果不需要初始化或清除代码,可以扩展AbstractInterceptor类。这提供了一个默认的无操作实现的init()和 destroy()方法。
创建拦截器类:
让我们创建Java资源 MyInterceptor.java& src 文件夹:
package com.yiibai.struts2;
import java.util.*;
import com.opensymphony.xwork2.ActionI
import com.opensymphony.xwork2.interceptor.AbstractI
public class MyInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation)throws Exception{
/* let us do some pre-processing */
String output = "Pre-Processing";
System.out.println(output);
/* let us call action or next interceptor */
String result = invocation.invoke();
/* let us do some post-processing */
output = "Post-Processing";
System.out.println(output);
就像看到的,实际行动将使用拦截器执行invocation.invoke()调用。所以,可以做一些前处理和一些处理后,根据需要。
该框架本身启动的过程中,在第一次调用ActionInvocation对象的invoke()。每次 invoke()被调用,ActionInvocation的咨询的状态和执行为准拦截接下来。通过请求流以下数据图显示了相同的概念:
创建动作类:
让我们创建一个Java文件HelloWorldAction.java的Java下Java Resources & src下面给出的内容包名为 com.yiibai.struts2。
package com.yiibai.struts2;
import com.opensymphony.xwork2.ActionS
public class HelloWorldAction extends ActionSupport{
public String execute() throws Exception {
System.out.println("Inside action....");
return "success";
public String getName() {
public void setName(String name) {
this.name =
在前面的例子中,我们已经看到,这是一个相同的类。我们有标准的“名称”属性的getter和setter方法​​,并返回字符串“success”的执行方法。
让我们创建以下JSP文件helloWorld.jsp,在eclipse项目在WebContent文件夹。
&%@ page contentType="text/ charset=UTF-8" %&
&%@ taglib prefix="s" uri="/struts-tags" %&
&title&Hello World&/title&
Hello World, &s:property value="name"/&
创建页面:
我们还需要在WebContent文件夹中创建 index.jsp。该文件将作为初始动作URL,用户可以在其中点击告诉Struts 2框架调用 HelloWorldAction类定义的方法呈现 helloWorld.jsp视图。
&%@ page language="java" contentType="text/ charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%&
&%@ taglib prefix="s" uri="/struts-tags"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"&
&title&Hello World&/title&
&h1&Hello World From Struts2&/h1&
&form action="hello"&
&label for="name"&Please enter your name&/label&&br/&
&input type="text" name="name"/&
&input type="submit" value="Say Hello"/&
Hello 动作定义在上面的视图文件将被映射到HelloWorldAction类和其执行方法使用struts.xml文件。
现在,我们需要注册我们的拦截器,然后调用它默认的拦截器在前面的例子中调用。要注册一个新定义的拦截,直接放在的&interceptors&...&/interceptors&标签下&package&的标签插件struts.xml文件。您可以跳过这一步为默认的拦截器,就像我们在我们前面的例子。但在这里,让我们注册和使用它,如下所示:
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&constant name="struts.devMode" value="true" /&
&package name="helloworld" extends="struts-default"&
&interceptors&
&interceptor name="myinterceptor"
class="com.yiibai.struts2.MyInterceptor" /&
&/interceptors&
&action name="hello"
class="com.yiibai.struts2.HelloWorldAction"
method="execute"&
&interceptor-ref name="params"/&
&interceptor-ref name="myinterceptor" /&
&result name="success"&/HelloWorld.jsp&/result&
&/package&
应该指出的是,可以注册多个拦截器&package&标签内,同一时间,可以调用多个拦截里面的&action&标签。可以调用相同的拦截器与不同的动作。
web.xml文件需要在 WEB-INF文件夹下创建 WebContent 如下:
&?xml version="1.0" encoding="UTF-8"?&
&web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="/xml/ns/javaee"
xmlns:web="/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0"&
&display-name&Struts 2&/display-name&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&filter-name&struts2&/filter-name&
&filter-class&
org.apache.struts2.dispatcher.FilterDispatcher
&/filter-class&
&filter-mapping&
&filter-name&struts2&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&/web-app&
右键点击项目名称,并单击& Export & WAR File 文件创建一个WAR文件。然后部署在Tomcat 的webapps目录下这个WAR。最后,启动Tomcat 服务器和尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。这会给你以下画面:
现在,在给定的文本框中输入任何单词,并单击“Say Hello“ 按钮执行已定义的动作。现在,如果检查生成的日志,会发现下面的文本下方:
Pre-Processing
Inside action....
Post-Processing
堆叠多个拦截器:
可以想像,配置多个拦截器每个动作很快就会变得非常难以控制。出于这个原因,拦截器与拦截器栈管理。下面是一个例子,直接从在struts-default.xml文件:
&interceptor-stack name="basicStack"&
&interceptor-ref name="exception"/&
&interceptor-ref name="servlet-config"/&
&interceptor-ref name="prepare"/&
&interceptor-ref name="checkbox"/&
&interceptor-ref name="params"/&
&interceptor-ref name="conversionError"/&
&/interceptor-stack&
上面的栈被调用basicStack,可用于在配置中,如下所示。此配置节点放置在&package.../&节点下。每个&interceptor-ref.../&标记引用一个拦截器或拦截器栈已配置在当前的拦截器栈。因此,这是非常重要的,以确保该名称是唯一的所有拦截器和拦截器栈配置配置初始的拦截器和拦截器栈时。
我们已经看到了如何应用拦截的动作,将拦截器栈是没有什么不同。事实上,我们完全使用相同的标签:
&action name="hello" class="com.yiibai.struts2.MyAction"&
&interceptor-ref name="basicStack"/&
&result&view.jsp&/result&
上述注册的“basicStack”所有6个拦截器完成注册的栈 Hello 动作。应该指出的是,拦截器执行的顺序在配置中。例如,在上述情况下,异常将被执行,servlet 配置等。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具java自定义拦截器中需要一个方法,得到登录者和登录者调用过的类和方法,在将这些信息写入txt中如何实现_百度知道
java自定义拦截器中需要一个方法,得到登录者和登录者调用过的类和方法,在将这些信息写入txt中如何实现
具体如何实现,不要把java自带的什么post之类的也查出来,请给出代码,是用到log4j吗调用过的类和方法都是自己写的
我有更好的答案
用log4j等什么写入都可以。但“登录者和登录者调用过的类和方法”
应该只是将当前用户、调用的方法写入文件中
我知道是当前用户调用的方法,我主要是想知道怎么得到用户调用哪些类哪些方法的信息,log4j的哪些方法可以实现,请给出具体代码,非常感谢
其他类似问题
为您推荐:
java的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁6478人阅读
J2EE(34)
所谓的拦截器就是指实现了Interceptor接口的类,该接口中定义了三个方法:init(),destroy(),intercept()。init()用于在服务器启动的时候,初始化这个拦截器。destroy()用于清理分配给拦截器的资源,intercept()是用来起拦截作用的,这个方法还有一个ActionInvocation类型的参数invocation,并且返回一个字符串。ActionInvocation类中有一个方法,是invoke(),这个方法很重要,它的作用是首先判断一下有没有其他的拦截器了,如果有,则继续进入下一个拦截器,如果没有那么就进入Action中执行业务逻辑。intercept()方法的执行过程也很特殊,在invoke()函数之前的代码先执行,执行到invoke()时,判断一下,进入下一个拦截器,或是进行Action的业务处理,等到执行完所有请求转发的Action时,会再回到intercept()方法,继续执行invoke()后面的内容。
注意上面红颜色的部分,为什么是执行完所有的请求转发的Action呢?这是因为执行完当前的Action,可能会请求转发或是重定向到另一个Action中或是结果页面,若是重定向的话,那么就不是在一个请求过程中了,就会重新发一次请求,请求另一个Action,因为一个拦截器只会对一个特定的Action起作用,所以重定向,就完全是另一次请求过程了。然而在拦截器中,若是重定向到另一个Action的话,那么当前的Action就算完成了它的业务逻辑,就会返回执行invoke()方法之后的内容,然后,再进行另一次请求过程。如果是请求转发的话,那么Action之间是在一个请求过程中,等到所有的请求转发的Action执行完之后,才会去执行invoke()后面的内容。
下面,举两个例子对比一下:
有一个jsp页面,两个Action:Action1和Action2
第一次:Action1和Action2之间是请求转发关系
第二次:Action1和Action2之间是重定向关系
Login.jsp:
&form action=&/struts2/test/action1& method=&post&&
姓名:&input type=&text& name=&username&/&&br/&
密码:&input type=&password& name=&password&/&&br/&
&input type=&submit& value=&提交&/&
&/form&拦截器:MyInterceptor.java:
package com.suo.
import com.opensymphony.xwork2.ActionI
import com.opensymphony.xwork2.interceptor.I
public class MyInterceptor implements Interceptor {
public void destroy() {
// TODO Auto-generated method stub
System.out.println(&destroy invoke !&);
public void init() {
// TODO Auto-generated method stub
System.out.println(&init invoke !&);
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println(&before invoke !&);
String result=invocation.invoke();
System.out.println(&after invoke !&);
}Action1.java:
package com.suo.
import com.opensymphony.xwork2.ActionS
public class Action1 extends ActionSupport {
public String getUsername() {
public void setUsername(String username) {
this.username =
public String getPassword() {
public void setPassword(String password) {
this.password =
public String execute()
System.out.println(&action1 invoke !&);
return SUCCESS;
Action2.java:
package com.suo.
import com.opensymphony.xwork2.ActionS
public class Action2 extends ActionSupport {
public String getUsername() {
public void setUsername(String username) {
this.username =
public String getPassword() {
public void setPassword(String password) {
this.password =
public String execute()
System.out.println(&action2 invoke !&);
return SUCCESS;
在struts.xml中配置拦截器:
&interceptors&
&interceptor name=&myInterceptor& class=&com.suo.interceptor.MyInterceptor&&&/interceptor&
&/interceptors&
在action中,引用这个拦截器,注意,这里Action之间是请求转发的关系:
&action name=&action1& class=&com.suo.actions.Action1&&
&result name=&success& type=&chain&&&!--注意这里是请求转发类型--&
&param name=&actionName&&action2&/param&
&interceptor-ref name=&myInterceptor&&&/interceptor-ref&&!--这里是引用自定义的拦截器--&
&interceptor-ref name=&defaultStack&&&/interceptor-ref&
&!--注意,每一个action都有一个默认的拦截器,如果指定了自定义的拦截器,那么默认的拦截器就失去作用了,所以这里要再加上默认的拦截器--&
&action name=&action2& class=&com.suo.actions.Action2&&
&result name=&success&&/WEB-INF/result/action.jsp&/result&
启动服务器,可以看到输出的结果是:
before invoke !
action1 invoke !
action2 invoke !
after invoke !
若是将Action间的类型换成redirectAction,那么输出的结果是:
before invoke !
action1 invoke !
after invoke !
action2 invoke !
补充:还可以给拦截器传递参数,进行初始化的工作。如下:
&interceptors&
&interceptor name=&myInterceptor& class=&com.suo.interceptor.MyInterceptor&&
&param name=&suo&&piao&/param&&!--传递一个参数--&
&/interceptor&
&/interceptors&然后在拦截器中定义该参数的get/set方法,即可:
注意,这个参数的赋值,要早于init()方法的调用,因为初始化参数的作用,就是想在初始化的时候用到这个参数,所以要早于init()方法。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:613560次
积分:8123
积分:8123
排名:第1656名
原创:224篇
转载:16篇
评论:207条
(1)(3)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(6)(1)(6)(2)(3)(16)(5)(28)(3)(3)(1)(23)(24)(8)(1)(4)(2)(5)(8)(28)(4)(8)(12)(12)(2)(3)(9)

我要回帖

更多关于 struts自定义拦截器 的文章

 

随机推荐