Struts2拦截器

struts2默认的拦截器:

拦截器

名字

说明

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调用ActionsetModel方法将其放入Action内部。

Parameters Interceptor

params

将请求中的参数设置到Action中去。

Prepare Interceptor

prepare

如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

Scope Interceptor

scope

Action状态存入sessionapplication的简单方法。

Servlet Config Interceptor

servletConfig

提供访问HttpServletRequestHttpServletResponse的方法,以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

调用Actionvalidate方法,一旦有错误返回,重新定位到INPUT画面

Parameter Filter Interceptor

N/A

从参数列表中删除不必要的参数

Profiling Interceptor

profiling

通过参数激活profile

 

详细情参看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

 

自定义拦截器后会使struts默认的拦截器失效,所以一般都要手动添加上defaultStack;

拦截器栈就是将多个拦截器封装成一个栈,便于使用;

***************************************************************************************************************************

自定义拦截器

 

此实例实现功能:用户需要指定用户名登陆,登陆成功进入相应页面执行操作,否则返回到登陆页面进行登陆,当直接访问操作页面(登陆后才能访问的页面)时则不允许,须返回登陆页面。

代码如下:

一、页面

login.jsp

 

[xhtml]   view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2.   
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.   <head>    
  6.     <title>yuewei'Login</title>   
  7.     <!-- 
  8.     <link rel="stylesheet" type="text/css" href="styles.css" mce_href="styles.css"> 
  9.     -->  
  10.   </head>  
  11.     
  12.   <body>  
  13.   <form action="login.action" method="post">  
  14.   User:<input type="text" name="username"><br>  
  15.   Passoword:<input type="password" name="password"><br>  
  16.   <input type="submit" value="submit">  
  17.   </form>  
  18.      
  19. </body>  
  20. </html>  

 

welcome.jsp

 

[xhtml]   view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  3. <html>  
  4.   <head>  
  5.      
  6.     <title> yuewei's Welcome</title>  
  7.       
  8.  <!-- 
  9.  <link rel="stylesheet" type="text/css" href="styles.css" mce_href="styles.css"> 
  10.  -->  
  11.   
  12.   </head>  
  13.     
  14.   <body>  
  15.   <h1>登录成功后显示此页面</h1>  
  16.   <a href="show.action" mce_href="show.action">show</a>  
  17.   </body>  
  18. </html>  

 

show.jsp

 

[xhtml]   view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2.   
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.   <head>  
  6.       
  7.     <title>yuewei's Show</title>  
  8.       
  9.     <!-- 
  10.     <link rel="stylesheet" type="text/css" href="styles.css" mce_href="styles.css"> 
  11.     -->  
  12.   
  13.   </head>  
  14.     
  15.   <body>  
  16.     Show This Page   
  17.         登录后执行此页面<br>  
  18.   </body>  
  19. </html>  

 

 

二、Action

LoginFormAction

 

[java]   view plain copy
  1. package com.ywjava.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. public class LoginFormAction extends ActionSupport {  
  6.     public String exexcute() {  
  7.         return "success";  
  8.     }  
  9. }  

 

LoginAction

 

[java]   view plain copy
  1. package com.ywjava.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionContext;  
  4. import com.opensymphony.xwork2.ActionSupport;  
  5. import com.ywjava.utils.Constants;  
  6.   
  7. public class LoginAction extends  ActionSupport{  
  8. private String username;  
  9. private String password;  
  10. public String getPassword() {  
  11.     return password;  
  12. }  
  13. public void setPassword(String password) {  
  14.     this.password = password;  
  15. }  
  16. public String getUsername() {  
  17.     return username;  
  18. }  
  19. public void setUsername(String username) {  
  20.     this.username = username;  
  21. }  
  22.   
  23. private boolean isInvalid(String value) {     
  24.     return (value == null || value.length() == 0);     
  25. }     
  26. public String execute(){  
  27.         System.out.println(username);  
  28.         System.out.println(password);  
  29.           
  30.          if (isInvalid(getUsername()))     
  31.                 return INPUT;     
  32.         
  33.             if (isInvalid(getPassword()))     
  34.                 return INPUT;     
  35.         
  36.   
  37.     if(this.getUsername().equals("yuewei")&& this.getPassword().equals("yuewei")){  
  38.         ActionContext.getContext().getSession().put(Constants.USER_SESSION,getUsername());  
  39.         ActionContext.getContext().getSession().put(Constants.PASS,getPassword());  
  40.         return "success";  
  41.     }  
  42.     return "error";  
  43. }  
  44. }  

 

ShowAction

 

[java]   view plain copy
  1. package com.ywjava.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. public class ShowAction extends ActionSupport {  
  6.  public String execute() {  
  7.   return "success";  
  8.  }  
  9. }  

 

三、拦截器

 

[java]   view plain copy
  1. package com.ywjava.interceptot;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import com.opensymphony.xwork2.Action;  
  6. import com.opensymphony.xwork2.ActionContext;  
  7. import com.opensymphony.xwork2.ActionInvocation;  
  8. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  
  9. import com.ywjava.utils.Constants;  
  10.   
  11. public class LoginInterceptor extends AbstractInterceptor {  
  12.   
  13.     @Override  
  14.     public String intercept(ActionInvocation invocation) throws Exception {  
  15.   
  16.         // 取得请求相关的ActionContext实例  
  17.         ActionContext ctx = invocation.getInvocationContext();  
  18.         Map session = ctx.getSession();  
  19.         String user = (String) session.get(Constants.USER_SESSION);  
  20.   
  21.         // 如果没有登陆,或者登陆所有的用户名不是yuewei,都返回重新登陆  
  22.   
  23.         if (user != null && user.equals("yuewei")) {  
  24.             System.out.println("test");  
  25.             return invocation.invoke();  
  26.         }  
  27.   
  28.         ctx.put("tip""你还没有登录");  
  29.         return Action.LOGIN;  
  30.   
  31.     }  
  32.   
  33. }  

 

四 struts.xml

 

[c-sharp]   view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.1.dtd">  
  5. <struts>  
  6.     <package name="authority" extends="struts-default">  
  7.       
  8.         <!-- 定义一个拦截器 -->  
  9.         <interceptors>  
  10.             <interceptor name="authority"  
  11.                 class="com.ywjava.interceptot.LoginInterceptor">  
  12.             </interceptor>  
  13.             <!-- 拦截器栈 -->  
  14.             <interceptor-stack name="mydefault">  
  15.                 <interceptor-ref name="defaultStack" />  
  16.                 <interceptor-ref name="authority" />  
  17.             </interceptor-stack>  
  18.         </interceptors>  
  19.   
  20.         <!-- 定义全局Result -->  
  21.         <global-results>  
  22.             <!-- 当返回login视图名时,转入/login.jsp页面 -->  
  23.             <result name="login">/login.jsp</result>  
  24.         </global-results>  
  25.   
  26.         <action name="loginform"  
  27.             class="com.ywjava.action.LoginFormAction">  
  28.             <result name="success">/login.jsp</result>  
  29.         </action>  
  30.           
  31.         <action name="login" class="com.ywjava.action.LoginAction">  
  32.             <result name="success">/welcome.jsp</result>  
  33.             <result name="error">/login.jsp</result>  
  34.             <result name="input">/login.jsp</result>  
  35.         </action>  
  36.   
  37.         <action name="show" class="com.ywjava.action.ShowAction">  
  38.             <result name="success">/show.jsp</result>  
  39.             <!-- 使用此拦截器 -->  
  40.             <interceptor-ref name="mydefault" />  
  41.         </action>  
  42.           
  43.     </package>  
  44. </struts>  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2 中,可以使用拦截器来实现权限控制。具体来说,可以编写一个自定义的拦截器,然后在 struts.xml 配置文件中将其配置为需要进行权限控制的 Action 的拦截器。以下是一个简单的权限拦截器示例: ```java public class AuthInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // 获取当前用户 User user = (User) ActionContext.getContext().getSession().get("user"); // 判断用户是否拥有权限 if (user != null && user.hasPermission(invocation.getInvocationContext().getName())) { // 如果有权限,则继续执行 Action return invocation.invoke(); } else { // 如果没有权限,则跳转到错误页面 return "error"; } } } ``` 在上述代码中,我们首先获取了当前用户,然后判断用户是否拥有执行当前 Action 的权限。如果有权限,则继续执行 Action;否则,跳转到错误页面。 接下来,在 struts.xml 配置文件中,我们可以将该拦截器配置为需要进行权限控制的 Action 的拦截器,如下所示: ```xml <action name="myAction" class="com.example.MyAction"> <interceptor-ref name="authInterceptor"/> <result name="success">/myAction.jsp</result> <result name="error">/error.jsp</result> </action> <interceptor-stack name="authStack"> <interceptor-ref name="authInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> <interceptors> <interceptor name="authInterceptor" class="com.example.AuthInterceptor"/> </interceptors> ``` 在上述代码中,我们首先定义了一个名为 authStack 的拦截器栈,该拦截器栈包含了 authInterceptor 和 defaultStack 两个拦截器。然后,我们将 myAction Action 配置为使用 authStack 拦截器栈。最后,我们定义了一个名为 authInterceptor 的拦截器,并将其添加到了 interceptors 中。 这样一来,当用户访问 myAction Action 时,就会先执行 authInterceptor 拦截器,进行权限控制,然后再执行 defaultStack 拦截器栈中的其它拦截器。如果 authInterceptor 拦截器返回了 error,则会跳转到 error.jsp 页面;否则,会跳转到 myAction.jsp 页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值