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>
分享到:
相关推荐
在Java Web开发中,Struts2是一个非常流行的MVC...总之,自定义Struts2拦截器是一项强大的技术,可以增强应用程序的控制和扩展性。通过分析提供的源代码,你可以深入学习这一概念,并将其应用于你的Java Web项目中。
在Struts2中,拦截器(Interceptors)扮演着核心角色,增强了框架的功能和灵活性。这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP...
Struts2是一个强大的MVC...总的来说,自定义Struts2拦截器可以极大地扩展框架的功能,使应用程序更加健壮和安全。通过拦截器,我们可以方便地实现如用户权限控制、数据校验等通用功能,提高代码的可复用性和可维护性。
总结,自定义Struts2拦截器主要涉及以下几个步骤:创建Web项目、导入依赖库、编写拦截器类、配置Struts2.xml并运行应用。理解并掌握这一过程,开发者可以灵活地扩展Struts2的功能,满足各种复杂的业务需求。在实际...
总之,Struts2的拦截器机制极大地增强了框架的功能性和灵活性,使得开发者可以轻松地添加自定义逻辑,提高代码的可维护性和可扩展性。在实际项目中,合理利用拦截器可以解决许多常见的问题,提高Web应用程序的质量。
- **拦截器的核心功能**:Struts2拦截器可以动态地拦截发送到指定Action的请求,并在Action执行前后插入自定义的逻辑处理。 - **代码重用原则**:通过拦截器机制,可以将多个Action中需要重复指定的代码提取出来,...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...
自定义Struts时,你需要创建自己的XML配置文件,比如`mystruts.xml`,这个文件将替代或扩展默认的配置,用来加载自定义的Action和拦截器。 2. **Action**: - Action是业务逻辑的载体,它接收用户请求并执行相应的...
在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...
#### 三、Struts2内置拦截器与自定义拦截器 Struts2提供了许多内置的拦截器,比如`defaultStack`拦截器堆栈,包含了多个常用的拦截器,如模型驱动(ModelDriven)、参数拦截器(Parameters)、验证器(Validation)...
在Struts2中,拦截器是实现业务逻辑控制和增强功能的重要机制,它们扮演着类似于AOP(面向切面编程)的角色,允许在动作执行前后插入自定义逻辑。在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在动作执行前后插入自定义的逻辑,如日志、权限检查、数据验证等。本示例将探讨如何在Struts2中使用拦截器。 首先,我们需要理解Struts2拦截器的...
拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...
在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...
拦截器是Struts2框架的核心组成部分,它们在请求处理流程中起到了关键的作用。在本文中,我们将深入探讨Struts2拦截器的工作原理。 ### 一、拦截器概念 拦截器是基于Java的动态代理机制实现的,它允许我们在Action...
拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...
下面我们将详细介绍如何创建自定义的Struts2拦截器。 1. **理解Struts2拦截器工作原理** Struts2中的拦截器是一个实现了`Interceptor`接口或者继承了`AbstractInterceptor`抽象类的Java类。当一个请求到达时,...
Struts2自定义拦截器的配置是Struts2框架中一个非常重要的功能,它允许开发者在Action执行前后插入自定义的逻辑,以实现如权限验证、日志记录、性能监控等多种需求。以下是对标题和描述中涉及的知识点的详细说明: ...
在实际开发中,我们可以通过扩展Struts2的拦截器实现自定义功能。例如,你可以创建一个新的拦截器来实现登录检查、权限控制或性能监控,然后将其添加到拦截器栈中。通过理解和研究Struts2的拦截器源码,我们可以更好...
拦截器(Interceptor)是Struts2的核心组件之一,它允许开发者在动作执行前后插入自定义逻辑,提供了灵活的扩展机制。这篇博客“Struts2 拦截器的执行顺序(二十九)”可能探讨了Struts2拦截器链的工作原理和它们的...