struts2拦截器_动力节点Java学院整理

发布时间 - 2026-01-11 03:07:54    点击率:

如何使用struts2拦截器,或者自定义拦截器。特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):

<interceptor-ref name="checkbox">
 <param name="uncheckedValue">0</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>(必须加,否则出错)

也可以改为对全局Action设置自己需要的拦截器,如下:

在struts.xml里面定义全局的配置设置

 <package name="struts-shop" extends="struts-default">
 <interceptors>
  <interceptor-stack name="myStack">
  <interceptor-ref name="checkbox">
   <param name="uncheckedValue">0</param>
  </interceptor-ref>
  <interceptor-ref name="defaultStack"/>
  </interceptor-stack>
 </interceptors>
 <default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦截器堆栈)
 </package>

struts-action.xml里面配置Action如下:

 <package name="LogonAdmin" extends="struts-shop">(这里扩展struts.xml里面定义的配置就可以了)
 <action name="logon" class="logonAction">
  <result>/jsp/smeishop/admin/index.jsp</result>
  <result name="error">/jsp/smeishop/admin/logon.jsp</result>
  <result name="input">/jsp/smeishop/admin/logon.jsp</result>
 </action>
 <action name="logout" class="logoutAction">
  <result>/jsp/smeishop/admin/logon.jsp</result>
 </action>
 </package>

你的拦截器可以正常工作了

struts2自带的配置及其拦截器配置

Struts2 拦截器 [Interceptor]

拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。 

每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。 

如何自定义一个拦截器?

自定义一个拦截器需要三步:

1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。

2 在strutx.xml中注册上一步中定义的拦截器。

3 在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。 

Interceptor接口声明了三个方法:

public interface Interceptor extends Serializable {
 void destroy();
 void init();
 String intercept(ActionInvocation invocation) throws Exception;
}

Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。 

Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。 

Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。

另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为

public abstract class AbstractInterceptor implements Interceptor {
  public void init() {
 }
 public void destroy() {
 }
 public abstract String intercept(ActionInvocation invocation) throws Exception;
}

在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。 

我们尝试编写一个Session过滤用的拦截器,该拦截器查看用户Session中是否存在特定的属性(LOGIN属性)如果不存在,中止后续操作定位到LOGIN,否则执行原定操作,代码为:

public class CheckLoginInterceptor extends AbstractInterceptor {
 public static final String LOGIN_KEY = "LOGIN";
 public static final String LOGIN_PAGE = "global.login";
 public String intercept(ActionInvocation actionInvocation) throws Exception {
  System.out.println("begin check login interceptor!");
  // 对LoginAction不做该项拦截
  Object action = actionInvocation.getAction();
  if (action instanceof LoginAction) {
   System.out.println("exit check login, because this is login action.");
   return actionInvocation.invoke();
  }
  // 确认Session中是否存在LOGIN
  Map session = actionInvocation.getInvocationContext().getSession();
  String login = (String) session.get(LOGIN_KEY);
  if (login != null && login.length() > 0) {
   // 存在的情况下进行后续操作。
   System.out.println("already login!");
   return actionInvocation.invoke();
  } else {
   // 否则终止后续操作,返回LOGIN
   System.out.println("no login, forward login page!");
   return LOGIN_PAGE;
  }
 }
}

注册拦截器

<interceptors>
   <interceptor
name="login" 
class="com.jpleasure.teamware.util.CheckLoginInterceptor"/>
   <interceptor-stack name="teamwareStack">
    <interceptor-ref name="login"/>
    <interceptor-ref name="defaultStack"/>
   </interceptor-stack>
</interceptors> 

将上述拦截器设定为默认拦截器:

<default-interceptor-ref name="teamwareStack"/>

这样在后续同一个package内部的所有Action执行之前都会被login拦截。

Struts2(XWork)提供的拦截器的功能说明:

拦截器 名字 说明
Alias Interceptor alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变
Chaining Interceptor chain 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。
Checkbox Interceptor checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。
Cookies Interceptor cookies 使用配置的name,value来是指cookies
Conversion Error Interceptor conversionError 将错误从ActionContext中添加到Action的属性字段中。
Create Session Interceptor createSession 自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。
Debugging Interceptor debugging 提供不同的调试用的页面来展现内部的数据状况。
Execute and Wait Interceptor execAndWait 在后台执行Action,同时将用户带到一个中间的等待页面。
Exception Interceptor exception 将异常定位到一个画面
File Upload Interceptor fileUpload 提供文件上传功能
I18n Interceptor i18n 记录用户选择的locale
Logger Interceptor logger 输出Action的名字
Message Store Interceptor store 存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。
Model Driven Interceptor model-driven 如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。
Scoped Model Driven scoped-model-driven 如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。
Parameters Interceptor params 将请求中的参数设置到Action中去。
Prepare Interceptor prepare 如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。
Scope Interceptor scope 将Action状态存入session和application的简单方法。
Servlet Config Interceptor servletConfig 提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。
Static Parameters Interceptor staticParams 从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。
Roles Interceptor roles 确定用户是否具有JAAS指定的Role,否则不予执行。
Timer Interceptor timer 输出Action执行的时间
Token Interceptor token 通过Token来避免双击
Token Session Interceptor tokenSession 和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中
Validation Interceptor validation 使用action-validation.xml文件中定义的内容校验提交的数据。
Workflow Interceptor workflow 调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面
Parameter Filter Interceptor N/A 从参数列表中删除不必要的参数
Profiling Interceptor profiling 通过参数激活profile

注册并引用Interceptor

<package name="default" extends="struts-default">
 <interceptors>
  <interceptor name="timer" class=".."/>
  <interceptor name="logger" class=".."/>
 </interceptors>
 
 <action name="login" class="tutorial.Login">
  <interceptor-ref name="timer"/>
  <interceptor-ref name="logger"/>
  <result name="input">login.jsp</result>
  <result name="success"
   type="redirect-action">/secure/home</result>
 </action>
</package>

可以将多个拦截器合并在一起作为一个堆栈调用,当一个拦截器堆栈被附加到一个Action的时候,要想Action执行,必须执行拦截器堆栈中的每一个拦截器。

<package name="default" extends="struts-default">
 <interceptors>
  <interceptor name="timer" class=".."/>
  <interceptor name="logger" class=".."/>
  <interceptor-stack name="myStack">
   <interceptor-ref name="timer"/>
   <interceptor-ref name="logger"/>
  </interceptor-stack>
 </interceptors>
 <action name="login" class="tutuorial.Login">
   <interceptor-ref name="myStack"/>
   <result name="input">login.jsp</result>
   <result name="success"
    type="redirect-action">/secure/home</result>
 </action>
</package>

上述说明的拦截器在默认的Struts2应用中,根据惯例配置了若干个拦截器堆栈,详细情参看struts-default.xml

其中有一个拦截器堆栈比较特殊,他会应用在默认的每一个Action上。

<interceptor-stack name="defaultStack">
 <interceptor-ref name="exception"/>
 <interceptor-ref name="alias"/>
 <interceptor-ref name="servletConfig"/>
 <interceptor-ref name="prepare"/>
 <interceptor-ref name="i18n"/>
 <interceptor-ref name="chain"/>
 <interceptor-ref name="debugging"/>
 <interceptor-ref name="profiling"/>
 <interceptor-ref name="scopedModelDriven"/>
 <interceptor-ref name="modelDriven"/>
 <interceptor-ref name="fileUpload"/>
 <interceptor-ref name="checkbox"/>
 <interceptor-ref name="staticParams"/>
 <interceptor-ref name="params">
  <param name="excludeParams">dojo"..*</param>
 </interceptor-ref>
 <interceptor-ref name="conversionError"/>
 <interceptor-ref name="validation">
  <param name="excludeMethods">input,back,cancel,browse</param>
 </interceptor-ref>
 <interceptor-ref name="workflow">
  <param name="excludeMethods">input,back,cancel,browse</param>
 </interceptor-ref>
</interceptor-stack>

每一个拦截器都可以配置参数,有两种方式配置参数,一是针对每一个拦截器定义参数,二是针对一个拦截器堆栈统一定义所有的参数,例如:

<interceptor-ref name="validation">
 <param name="excludeMethods">myValidationExcudeMethod</param>
</interceptor-ref>
<interceptor-ref name="workflow">
 <param name="excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>

或者

<interceptor-ref name="defaultStack">
 <param name="validation.excludeMethods">myValidationExcludeMethod</param>
 <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref> 

每一个拦截器都有两个默认的参数:

excludeMethods - 过滤掉不使用拦截器的方法和
includeMethods – 使用拦截器的方法。 

需要说明的几点:

1 拦截器执行的顺序按照定义的顺序执行,例如:

<interceptor-stack name="xaStack">
 <interceptor-ref name="thisWillRunFirstInterceptor"/>
 <interceptor-ref name="thisWillRunNextInterceptor"/>
 <interceptor-ref name="followedByThisInterceptor"/>
 <interceptor-ref name="thisWillRunLastInterceptor"/>
</interceptor-stack>

的执行顺序为:

thisWillRunFirstInterceptor
 thisWillRunNextInterceptor
 followedByThisInterceptor
  thisWillRunLastInterceptor
  MyAction1
  MyAction2 (chain)
  MyPreResultListener
  MyResult (result)
  thisWillRunLastInterceptor
 followedByThisInterceptor
 thisWillRunNextInterceptor
thisWillRunFirstInterceptor 

2 使用默认拦截器配置每个Action都需要的拦截器堆栈,例如:

<action name="login" class="tutorial.Login">
  <interceptor-ref name="timer"/>
  <interceptor-ref name="logger"/>
  <interceptor-ref name="default-stack"/>
  <result name="input">login.jsp</result>
  <result type="redirect-action">/secure/home</result>
</action>

可以按照如下的方式定义:

<interceptors>
  <interceptor-stack name="myStack">
  <interceptor-ref name="timer"/>
  <interceptor-ref name="logger"/>
  <interceptor-ref name="default-stack"/>
  </interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<action name="login" class="tutorial.Login">
  <result name="input">login.jsp</result>
  <result type="redirect-action">/secure/home</result>
</action> 

3 如何访问HttpServletRequest,HttpServletResponse或者HttpSession

有两种方法可以达到效果,使用ActionContext:

Map attibutes = ActionContext.getContext().getSession();

或者实现相应的接口:

HttpSession            SessionAware
HttpServletRequest     ServletRequestAware
HttpServletResponse    ServletResponseAware

Struts2自定义拦截器实例—只允许从登录页面进入系统

【1】struts.xml:      

 <!-- 定义一个拦截器 --> 
  <interceptors> 
   <interceptor name="authority" 
    class="org.interceptot.LoginInterceptor"> 
   </interceptor> 
   <!-- 拦截器栈 --> 
   <interceptor-stack name="mydefault"> 
    <interceptor-ref name="defaultStack" /> 
    <interceptor-ref name="authority" /> 
   </interceptor-stack> 
  </interceptors>
   <!-- 定义全局Result --> 
  <global-results> 
   <!-- 当返回login视图名时,转入/login.jsp页面 --> 
   <result name="login">/login.jsp</result> 
  </global-results>
  <action name="show" class="org.action.showAction"> 
   <result name="success">/main.jsp</result> 
   <!-- 使用此拦截器 --> 
   <interceptor-ref name="mydefault" /> 
  </action> 
  <!--验证登录用户信息 -->
  <action name="login" class="org.action.loginAction" method="execute">
   <result name="error">/login.jsp</result> 
   <result name="input">/login.jsp</result> 
  </action>

【2】自定义拦截器org.interceptot.LoginInterceptor:

package org.interceptot;
import java.util.Map; 
import com.opensymphony.xwork2.Action; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; 
public class LoginInterceptor extends AbstractInterceptor { 
 @Override 
 public String intercept(ActionInvocation invocation) throws Exception { 
  // 取得请求相关的ActionContext实例 
  ActionContext ctx = invocation.getInvocationContext(); 
  Map session = ctx.getSession(); 
  String user = (String) session.get("username"); 
  // 如果没有登陆,即用户名不存在,都返回重新登陆 
  System.out.println("user:"+user);
  if (user != null) { 
   System.out.println("test"); 
   return invocation.invoke(); 
  } 
  System.out.println("你还没有登录"); 
  ctx.put("tip", "你还没有登录"); 
  return Action.LOGIN; //返回一个叫login的result结果
 } 
} 

【3】进入主页面的Action:org.action.showAction

package org.action;
import com.opensymphony.xwork2.ActionSupport; 
public class showAction extends ActionSupport { 
 public String execute() { 
 return "success"; 
 } 
} 

【4】LoginAction:

private boolean isInvalid(String value) {  
return (value == null || value.length() == 0);  
} 
if (isInvalid(user.getUsername())) 
  return INPUT;  
 if (isInvalid(user.getPassword()))  
  return INPUT; 
 //登录成功将User放入session中
HttpServletRequest request = ServletActionContext.getRequest();
Map map=ActionContext.getContext().getSession();
map.put("username", user.getUsername());

【5】如果我们通过show.action访问main.jsp那么就会被自定义拦截器拦住,拦截器检查session中

是否有值,有证明用户已经登录,没有则为没有登录,那么就会被跳转到登陆页面。

总结

以上所述是小编给大家介绍的struts2拦截器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# struts2拦截器  # Java struts2 package元素配置及实例解析  # Java框架Struts2实现图片上传功能  # Java中的Struts2框架拦截器之实例代码  # Java框架学习Struts2复选框实例代码  # struts2简介_动力节点Java学院整理  # struts2数据处理_动力节点Java学院整理  # struts2标签总结_动力节点Java学院整理  # Java struts2请求源码分析案例详解  # 拦截器  # 自定义  # 自带  # 就会  # 不需要  # 你还  # 实现了  # 情况下  # 不存在  # 双击  # 在一  # 有两种  # 小编  # 是否存在  # 我是  # 都有  # 放在  # 多个  # 在此  # 一是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python文件异常处理策略_健壮性说明【指导】  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Android使用GridView实现日历的简单功能  如何用美橙互联一键搭建多站合一网站?  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  利用JavaScript实现拖拽改变元素大小  JS碰撞运动实现方法详解  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  新三国志曹操传主线渭水交兵攻略  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  中山网站推广排名,中山信息港登录入口?  Laravel如何生成URL和重定向?(路由助手函数)  如何用IIS7快速搭建并优化网站站点?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Linux网络带宽限制_tc配置实践解析【教程】  独立制作一个网站多少钱,建立网站需要花多少钱?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  浅析上传头像示例及其注意事项  如何获取上海专业网站定制建站电话?  浅述节点的创建及常见功能的实现  如何为不同团队 ID 动态生成多个非值班状态按钮  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  iOS UIView常见属性方法小结  文字头像制作网站推荐软件,醒图能自动配文字吗?  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Laravel如何创建自定义Facades?(详细步骤)  JS实现鼠标移上去显示图片或微信二维码  如何基于云服务器快速搭建网站及云盘系统?  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  如何在云服务器上快速搭建个人网站?  javascript中闭包概念与用法深入理解  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  如何撰写建站申请书?关键要点有哪些?  微信小程序 HTTPS报错整理常见问题及解决方案