`
猪↘專屬|华
  • 浏览: 164052 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

自定义struts2的拦截器

阅读更多

struts2中已经给我们写好了很多的拦截器,但是,终归是不够的,有些拦截器达到不了我们的要求,这样,我们必须自己写一个拦截器。

在开始着手创建自定义拦截器前,切记以下原则:
拦截器必须是无状态的,不要使用在API提供的ActionInvocation之外的任何东西。

要求拦截器是无状态的原因是Struts 2不能保证为每一个请求或者action创建一个实例,所以如果拦截器带有状态,会引发并发问题。

所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。除此之外,大家可能更喜欢继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor。

首先,创建授权拦截器类struts2.AuthorizationInterceptor,代码如下:

package struts2;

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
 *
 * @author 朱湘鄂
 * @version 1.0
 * @date 2010-11-27
 */
@SuppressWarnings("serial")
public class AuthorizationInterceptor extends  AbstractInterceptor{

 @Override
  public String intercept(ActionInvocation ai) throws Exception  {
        Map session = ai.getInvocationContext().getSession();
        String role = (String) session.get( " ROLE " );
         if ( null != role)  {
            Object o = ai.getAction();
             if (o instanceof RoleAware)  {
                RoleAware action = (RoleAware) o;
                action.setRole(role);
            }
             return ai.invoke();//继续执行下面的操作
        } else  {
             return Action.LOGIN;//转向登录页面。
        }       
    }


}

 

 

我们通过检查session是否存在键为“ROLE”的字符串,判断用户是否登陆。如果用户已经登陆,将角色放到Action中,调用Action;否则,拦截直接返回Action.LOGIN字段。为了方便将角色放入Action,我定义了接口strtus2.RoleAware,代码如下:

 

package struts2;

public interface RoleAware {
 public void setRole(String role);
}

接着,创建Action类struts2.AuthorizatedAccess模拟访问受限资源,它作用就是通过实现RoleAware获取角色,并将其显示到showUser.jsp中,代码如下:

package struts2;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class AuthorizatedAccess extends ActionSupport implements RoleAware{
 private String role;
 
 public String getRole() {
  return role;
 }

 public void setRole(String role) {
  
 }

 public String execute(){
  return SUCCESS;
 }
}

 

showUser.jsp代码如下

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 <s:set name="role" value="roles.role"></s:set>
 <h1> 你的角色是: <s:property value ="role" /></h1 >
</body>
</html>

然后,创建struts2.Roles初始化角色列表,代码如下:

package struts2;

import java.util.Hashtable;
import java.util.Map;

public class Roles {
  public Map < String, String > getRoles()  {
         Map < String, String > roles = new Hashtable < String, String > ( 2 );
         roles.put( " EMPLOYEE " , " Employee " );
         roles.put( " MANAGER " , " Manager " );
          return roles;
     }
}

接下来,新建Login.jsp实例化struts2.Roles,并将其roles属性赋予<s:radio>标志,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 <h1> 登录 </h1 >
    请选择你的角色:
    <s:bean id ="roles" name ="struts2.Roles" />
    <s:form action ="Login" >
        <s:radio list ="#roles.roles" value ="'EMPLOYEE'" name ="role" label ="Role" />
        <s:submit/>
    </s:form >
</body>
</html>

 

创建Action类struts2.Login将role放到session中,并转到Action类struts2.AuthorizatedAccess,代码如下:

package struts2;

import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class Login extends ActionSupport implements SessionAware  {
    private String role;   
    private Map session;

    public String getRole()  {
        return role;
   }

     public void setRole(String role)  {
        this .role = role;
   }
  
    public void setSession(Map session)  {
        this .session = session;
   }

   @Override
    public String execute()  {
       session.put( "ROLE" , role);
        return SUCCESS;
   }

 


}

最后,配置struts.xml文件,内容如下:

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <include file="struts-default.xml"/>
 <package name ="struts2" extends ="struts-default" >
  <interceptors >
            <interceptor name ="auth" class ="struts2.AuthorizationInterceptor" />
        </interceptors > 
    <action name ="Login" class ="struts2.Login" >
            <result type ="chain"> AuthorizatedAccess </result >
        </action >
        <action name ="AuthorizatedAccess" class ="struts2.AuthorizatedAccess" >
            <interceptor-ref name ="auth" />
            <result name ="login" > /login.jsp </result >
            <result name ="success" > /showUser.jsp </result >
        </action >
 </package >
</struts>

 

 

 


 

1
0
分享到:
评论

相关推荐

    自定义拦截器struts2源代码

    在Java Web开发中,Struts2是一个非常流行的MVC...总之,自定义Struts2拦截器是一项强大的技术,可以增强应用程序的控制和扩展性。通过分析提供的源代码,你可以深入学习这一概念,并将其应用于你的Java Web项目中。

    Struts2拦截器及其用法详细说明

    在Struts2中,拦截器(Interceptors)扮演着核心角色,增强了框架的功能和灵活性。这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP...

    struts2拦截器

    Struts2是一个强大的MVC...总的来说,自定义Struts2拦截器可以极大地扩展框架的功能,使应用程序更加健壮和安全。通过拦截器,我们可以方便地实现如用户权限控制、数据校验等通用功能,提高代码的可复用性和可维护性。

    struts2自定义拦截器.pdf

    总结,自定义Struts2拦截器主要涉及以下几个步骤:创建Web项目、导入依赖库、编写拦截器类、配置Struts2.xml并运行应用。理解并掌握这一过程,开发者可以灵活地扩展Struts2的功能,满足各种复杂的业务需求。在实际...

    struts2 拦截器

    总之,Struts2的拦截器机制极大地增强了框架的功能性和灵活性,使得开发者可以轻松地添加自定义逻辑,提高代码的可维护性和可扩展性。在实际项目中,合理利用拦截器可以解决许多常见的问题,提高Web应用程序的质量。

    详解Struts2拦截器

    - **拦截器的核心功能**:Struts2拦截器可以动态地拦截发送到指定Action的请求,并在Action执行前后插入自定义的逻辑处理。 - **代码重用原则**:通过拦截器机制,可以将多个Action中需要重复指定的代码提取出来,...

    struts2 拦截器实例

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...

    自定义struts(实现拦截器)

    自定义Struts时,你需要创建自己的XML配置文件,比如`mystruts.xml`,这个文件将替代或扩展默认的配置,用来加载自定义的Action和拦截器。 2. **Action**: - Action是业务逻辑的载体,它接收用户请求并执行相应的...

    使用struts2拦截器对登陆权限验证

    在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...

    struts2拦截器的使用方法

    #### 三、Struts2内置拦截器与自定义拦截器 Struts2提供了许多内置的拦截器,比如`defaultStack`拦截器堆栈,包含了多个常用的拦截器,如模型驱动(ModelDriven)、参数拦截器(Parameters)、验证器(Validation)...

    Struts2拦截器实现权限控制demo

    在Struts2中,拦截器是实现业务逻辑控制和增强功能的重要机制,它们扮演着类似于AOP(面向切面编程)的角色,允许在动作执行前后插入自定义逻辑。在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何...

    struts2拦截器应用小例子

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在动作执行前后插入自定义的逻辑,如日志、权限检查、数据验证等。本示例将探讨如何在Struts2中使用拦截器。 首先,我们需要理解Struts2拦截器的...

    Struts2 拦截器

    拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...

    Struts2拦截器源程序

    在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...

    Struts2拦截器原理分析

    拦截器是Struts2框架的核心组成部分,它们在请求处理流程中起到了关键的作用。在本文中,我们将深入探讨Struts2拦截器的工作原理。 ### 一、拦截器概念 拦截器是基于Java的动态代理机制实现的,它允许我们在Action...

    struts2拦截器实现拦截不文明字迹

    拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...

    创建自己struts2拦截器

    下面我们将详细介绍如何创建自定义的Struts2拦截器。 1. **理解Struts2拦截器工作原理** Struts2中的拦截器是一个实现了`Interceptor`接口或者继承了`AbstractInterceptor`抽象类的Java类。当一个请求到达时,...

    struts2自定义拦截器配置心得

    Struts2自定义拦截器的配置是Struts2框架中一个非常重要的功能,它允许开发者在Action执行前后插入自定义的逻辑,以实现如权限验证、日志记录、性能监控等多种需求。以下是对标题和描述中涉及的知识点的详细说明: ...

    Struts2拦截器源码

    在实际开发中,我们可以通过扩展Struts2的拦截器实现自定义功能。例如,你可以创建一个新的拦截器来实现登录检查、权限控制或性能监控,然后将其添加到拦截器栈中。通过理解和研究Struts2的拦截器源码,我们可以更好...

    Struts2 拦截器的执行顺序(二十九)

    拦截器(Interceptor)是Struts2的核心组件之一,它允许开发者在动作执行前后插入自定义逻辑,提供了灵活的扩展机制。这篇博客“Struts2 拦截器的执行顺序(二十九)”可能探讨了Struts2拦截器链的工作原理和它们的...

Global site tag (gtag.js) - Google Analytics