权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了。
用反射和自定义注解来实现基于struts2的方法级别的权限控制的主要思想是这样的。
1.先定义一个用于识别在进行action调用的时候标注该方法调用是否需要权限控制,需要什么样的权限的注解类。该注解类一般会包括两个属性,一个是需要的权限,一个是对应的action。
2.然后就是在需要进行权限控制的action方法上加上该注解类,并标明其应该拥有的权限和对应的action。这样一来在进行action调用的时候可以实现一个 自己定义的interceptor来拦截所有的请求,这样在拦截到请求的时候就可以通过ActionInvocation获取到对应的action类的类文件和对应请求的方法名称,然后利用反射来取得action类文件里面对应的请求方法Method,这样就可通过该Method来判断其是否拥有对应的权限控制注解,即看其是否需要进行权限控制,如果需要进行权限控制,就取得该注解并取得其对应的action名称和需要的权限,然后通过session取得当前的用户,并判断当前用户是否拥有对应的某种权限,如果其拥有该权限则继续往下执行,否则,转到自己处理无权限的机制上去。
下面是一段示例代码:
Authority注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Authority {
String action();
String privilege();
}
用于拦截请求判断是否拥有权限的拦截器AuthorityInterceptor:
import java.lang.reflect.Method;
import java.util.Date;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class AuthorityInterceptor implements Interceptor {
/**
*
*/
private static final long serialVersionUID = -4637261955156527951L;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
String methodName = invocation.getProxy().getMethod();
Method currentMethod = invocation.getAction().getClass().getMethod(methodName);
//如果该方法请求是需要进行验证的时候执行以下逻辑
if (currentMethod.isAnnotationPresent(Authority.class)) {
// String currentUser = Util.getCurrentUser(ServletActionContext.getRequest());
//这里可以从session里面取得当前的用户
String currentUser = (String)ServletActionContext.getRequest().getSession().getAttribute("currentUser");
//取得权限验证的注解
Authority authority = currentMethod.getAnnotation(Authority.class);
//取得当前请求的注解的action
String actionName = authority.action();
//取得当前请求需要的权限
String privilege = authority.privilege();
/**
* 然后可以在此判断当前用户是否拥有对应的权限,如果没有可以跳到指定的无权限提示页面,如果拥有则可以
* 继续往下执行。
* ...............
* if (拥有对应的权限) {
* return invocation.invoke();
* } else {
* return "无权限";
* }
*/
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
System.out.println("用户" + currentUser + "在" + new Date() + actionName);
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
return invocation.invoke();
}
}
需要进行权限控制的Action:
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 4679109342743365308L;
@Override
@Authority(action="test", privilege="find")//请求该方法的时候需要拥有对test的find权限
public String execute() throws Exception {
// TODO Auto-generated method stub
return super.execute();
}
//请求该方法需要拥有对test的test权限
@Authority(action="test", privilege="test")
public String test() {
return "test";
}
}
在struts2的配置文件里面配置自定义的权限控制拦截器:
<!-- 定义拦截器 -->
<interceptors>
<!-- 申明自定义的权限控制拦截器 -->
<interceptor name="authorityInterceptor" class="com.test.AuthorityInterceptor"/>
<!-- 把自定义的权限控制拦截器和默认的拦截器栈加到新的自定义的拦截器栈 -->
<interceptor-stack name="myInterceptors">
<interceptor-ref name="authorityInterceptors"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 指定新的自定义的拦截器栈为默认的拦截器栈,这样自定义的权限控制拦截器就可以发挥作用了 -->
<default-interceptor-ref name="myInterceptors"></default-interceptor-ref>
分享到:
相关推荐
本文将详细介绍如何利用Java反射和自定义注解来实现在Struts2框架中的方法级别权限控制。 #### 二、核心概念简介 **1. Struts2框架** Struts2是一个基于Java的开源Web应用程序框架,它继承了Struts1的优良特性,...
Struts2提供了File和Files注解,可以方便地获取上传的文件,并支持多文件上传。 接下来是Servlet,它是Java Web应用的基础,提供了处理HTTP请求的能力。在Servlet中实现文件上传,我们需要覆盖doPost方法,解析请求...
3. **注解方式**:除了XML配置,Struts2也支持使用注解在Action类或方法上直接声明拦截器,这样可以更方便地控制权限。 4. **共享数据**:在拦截器中,可以利用ActionContext或ThreadLocal等机制来传递和共享数据,...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它在Web开发领域具有广泛的应用。作为一个初学者,掌握Struts2对于深入理解Web框架的工作原理以及提高开发效率至关重要。本资源...
总之,《Struts2技术内幕——深入解析Struts2架构设计与实现原理》配合《struts2基础.chm》,将帮助读者全面掌握Struts2的架构设计、核心组件、配置方式、插件使用以及源码解读,对于想要在Java Web领域深入发展的...
在Struts2中,Annotation注解的引入为开发者提供了更加灵活和便捷的配置方式,使得无需在XML配置文件中进行繁琐的设置,可以直接在类或方法上通过注解来进行配置。本文将深入探讨Struts2中的Annotation配置,以及...
### JavaEE框架——Struts2入门 #### 一、Struts2框架简介 Struts2是Struts1的下一代版本,也是Apache软件基金会所维护的一个开源项目,它是一款基于MVC设计模式的Web应用框架。Struts2的核心是采用拦截器机制来...
《轻量级Java+EE企业应用实战——Struts 2 + Spring + Hibernate整合开发》是针对Java企业级应用开发的一本实战指南,旨在帮助开发者掌握使用Struts 2、Spring和Hibernate三大框架进行高效集成开发的技术与技巧。...
要处理文件上传,Action类需要继承`org.apache.struts2.interceptor.FileUploadInterceptor`,或者使用`@ultipart_config`注解(Struts2.3及以上版本)。同时,Action类中需要定义一个或多个字段来接收上传的文件,...
在这个基于注解的Struts2简单工程中,我们将深入探讨如何使用注解来配置和控制应用程序的行为,而不是传统的XML配置文件。 在传统的Struts2配置中,我们通常会在`struts.xml`文件中定义Action类、结果类型和结果...
在这个项目中,Struts2使用注解如`@Action`和`@Result`来定义动作和结果。`@Action`标注在方法上表示该方法对应一个HTTP请求,而`@Result`定义了请求处理后的返回页面或逻辑。Struts2还支持拦截器,可以添加如权限...
Struts2注解登录是Java Web开发中一种简化配置的方式,它允许开发者在代码中直接定义控制器、动作和结果页面的映射,从而避免了传统方式下需要在`struts.xml`配置文件中的繁琐设置。这种做法提高了代码的可读性和可...
【基于注解的Spring+Struts2+Mybatis】是一个常见的Java Web开发框架组合,用于构建高效、可维护性高的应用程序。在这个项目中,Spring作为整体的容器管理依赖注入(DI),Struts2负责处理HTTP请求和视图展示,而...
"Struts2 技术内幕——深入解析Struts2架构设计"这本书深入探讨了Struts2的核心机制和设计理念,帮助开发者更好地理解和应用这个框架。 Struts2的核心组件包括Action、Interceptor、Result和Configuration。Action...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Struts1的基础上进行了很多改进和增强,提供了更强大的功能和更好的性能。本教程将深入探讨Struts2的核心概念、架构以及实际...
《轻量级Java EE企业应用实战——Struts 2+Spring+Hibernate整合开发》是一本深入探讨Java EE企业级应用开发的经典著作。该书重点介绍了如何利用Struts 2、Spring和Hibernate这三大流行框架进行高效集成,实现轻量...
Struts2 和 Spring 的整合是企业级 Java Web 开发中常见的技术栈,通过注解配置可以使项目更加简洁、易于维护。Struts2 提供了一种使用注解替代 XML 配置的方式,使得开发者无需编写繁琐的 struts.xml 文件,即可...
Struts 2是基于MVC设计模式的Java Web框架,主要用于处理用户的请求和控制应用程序流程。它提供了强大的拦截器机制,可以方便地进行请求过滤和业务逻辑处理。同时,Struts 2支持多种视图技术,如JSP、FreeMarker等,...
### Struts2注解详细说明 #### 一、概述 Struts2框架是Apache软件基金会下的一个开源项目,它提供了一种构建企业级Java Web应用的解决方案。自Struts2.1版本开始,引入了一个重要的插件——Convention Plugin,该...
这样,Struts2就会开始使用约定来解析和处理类及方法上的注解,使得开发者可以更专注于业务逻辑,而非繁琐的配置。 总结来说,Struts2注解开发通过`struts2-convention-plugin`插件实现了更加简洁、灵活的Java web...