`
zjnbshifox
  • 浏览: 315730 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

简单的struts权限拦截器

    博客分类:
  • Java
阅读更多
自己做一个简单的东东,使用ssh,说实话strut2的拦截器感觉还是比较灵活,由于系统比较简单,权限验证就全部由一个拦截器完成
public class AuthorizeInterceptor implements Interceptor {
	private static final long serialVersionUID = 1L;
	private static final Log log = LogFactory.getLog(AuthorizeInterceptor.class);
	public static final String USR_KEY = "nbrc.user";
	public static final String LOGIN_URL = "login";
	@Override
	public String intercept(ActionInvocation inv) throws Exception {
		log.info("AuthorizeInterceptor进入拦截器");
		Object action = inv.getAction();
		if(action instanceof AuthorizeAction){ 
                //需要验证的action全部实现AuthorizeAction接口
			log.info("需要验证的action");
			User u = (User) inv.getInvocationContext().getSession().get(USR_KEY);
			if(u==null){
				log.info("用户信息不存在");
				return LOGIN_URL;
			}else{
				AuthorizeAction author = (AuthorizeAction) action;
				author.setUser(u);
                                //把用户信息放入action上下文
				if(author.validateUser()){
                                //action的validateUser方法判断用户是否有权限
					log.info("验证用户通过");
					return inv.invoke();
				}else{
					log.info("验证不通过,用户没有权限");
					return LOGIN_URL;
				}
			}
		}else{								
			log.info("不需要用户验证的action");
			return inv.invoke();
		}
	}
	@Override
	public void destroy() {		
	}

	@Override
	public void init() {		
	}
}

后来发现,这样做有一个不好的地方,就是验证是action级别的,而不是方法级别的,粒度太大了,我自己的代码又比较乱,最近在看annotation相关的资料,心中一动,就想把验证的改成用annotation来实现,只需要在方法上标注可以调用该方法的角色,就可以了,拦截器的代码如下:
public class AuthorizeInterceptor implements Interceptor {
	private static final long serialVersionUID = 1L;
	private static final Log log = LogFactory.getLog(AuthorizeInterceptor.class);
	public static final String USR_KEY = "nbrc.user";
	public static final String USR_LOG_CNT="nbrc.logincount";
	public static final String USR_LAST_LOG="nbrc.lastlogin";
	public static final String LOGIN_URL = "login";
	@Override
	public String intercept(ActionInvocation inv) throws Exception {
		log.info("AuthorizeInterceptor进入拦截器");
		Object action = inv.getAction();
		User u = (User) inv.getInvocationContext().getSession().get(USR_KEY);
		String method  = inv.getProxy().getConfig().getMethodName();
		Method m = action.getClass().getMethod(method);		
		String[] roles = null;
		if(m.isAnnotationPresent(AllowRoles.class)){
			AllowRoles ar = m.getAnnotation(AllowRoles.class);
			 roles = ar.roleNames();
			 if(isAllowed(roles,u)){
				 log.info("验证用户通过");
				 return inv.invoke();				 
			 }else{
				 log.info("验证不通过,用户没有权限");
				return LOGIN_URL;
			 }
		}else{
			 log.info("没有Annotation,直接运行");
			return inv.invoke();
		}
	}
	private boolean isAllowed(String[] roles, User usr) {
		if(roles[0].equals("*") && usr!=null){
			log.info("允许用户的权限:*");
			return true;
		}
		if(usr!=null){
			String priv = usr.getPriv();
			for(String r : roles){
				if(r.equals(priv)){
					log.info("允许用户的权限:"  + r);
					return true;
				}
			}
		}
		return false;
	}
	@Override
	public void destroy() {		
	}

	@Override
	public void init() {		
	}
}


annotation的定义如下:
@Retention(RetentionPolicy.RUNTIME)
public @interface AllowRoles {
	public String[] roleNames();
}

匿名可访问的方法可以不用标注,如果是"*",表示需要登录的用户才能访问
	@AllowRoles(roleNames="dangwei")
	public String execute(){
		//TODO:method here
	}
	
分享到:
评论

相关推荐

    Struts2拦截器实现权限控制demo

    1. 创建权限拦截器:首先,我们需要编写一个实现了`Interceptor`接口的类,例如`AuthorizationInterceptor`。在这个类中,我们可以检查用户的登录状态、角色等信息,以确定他们是否有权限执行请求的操作。 2. 注册...

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

    - XML配置:在`struts.xml`文件中,使用`<interceptor>`元素定义拦截器,`<interceptor-stack>`元素组合多个拦截器,`<package>`元素下的`interceptors`属性指定拦截器栈。 ```xml <!-- 可以添加其他内置或...

    struts2拦截器实现权限控制

    在`struts.xml`中,可以创建一个或多个拦截器栈,并将权限拦截器包含在内。 4. 应用拦截器:在Action配置中,通过`<interceptor-ref>`标签引用拦截器栈,确保在执行Action之前会经过权限拦截器的验证。 此外,还...

    struts2 拦截器

    3. **权限验证**:拦截器可以实现用户登录检查,防止未授权的访问。 4. **数据校验**:在Action执行前,拦截器可以对输入数据进行校验,确保数据的合法性。 5. **业务逻辑增强**:如事务管理,可以在拦截器中进行...

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

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

    struts2 拦截器实例

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

    struts2拦截器应用小例子

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

    struts2拦截器

    标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...

    Struts2拦截器源程序

    总结来说,Struts2拦截器是框架的核心部分,它们提供了一种灵活的方式,以实现各种功能,如日志记录、性能监控、权限控制等,同时保持代码的整洁和模块化。通过对`98struts201`文件的深入研究,我们可以更好地掌握...

    struts1.2拦截器使用插件

    2. **注册拦截器**:在`struts-config.xml`配置文件中,通过`<interceptors>`标签定义拦截器栈,然后通过`<action>`标签的`interceptor-ref`属性引用拦截器栈。 3. **配置拦截器栈**:在`struts-config.xml`中,...

    Struts2 拦截器

    拦截器是在Action调用之前和之后执行的一段代码,可以用来做日志记录、权限检查、事务管理、性能监控等。这些操作无需在每个Action中重复编写,而是通过配置就可以全局应用。Struts2的拦截器基于AOP(面向切面编程)...

    利用struts2拦截器做的简单登录

    本文将深入探讨如何利用Struts2的拦截器实现简单的登录功能。拦截器是Struts2框架的核心组件之一,它允许我们在动作执行前后插入自定义逻辑,比如权限验证、日志记录等。 首先,我们来理解一下Struts2拦截器的工作...

    Struts2拦截器原理分析

    在文章"Struts2拦截器原理分析实例"中,作者通过一个具体的应用场景,展示了如何配置和使用拦截器来实现特定的功能,比如日志记录或权限验证。通过阅读这篇博客,我们可以更直观地理解拦截器的工作方式和价值。 ...

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

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

    Struts2拦截器源码

    例如,你可以创建一个新的拦截器来实现登录检查、权限控制或性能监控,然后将其添加到拦截器栈中。通过理解和研究Struts2的拦截器源码,我们可以更好地利用这个强大工具,提高应用的可扩展性和灵活性。同时,这也为...

    Struts1 拦截器(SAIF)的使用

    拦截器在Struts1中扮演着重要角色,它允许开发者在动作执行前后插入自定义的逻辑,比如日志记录、权限验证、事务管理等。SAIF插件是Struts1中一个特定的拦截器实现,用于增强框架的功能。 **1. Struts1 拦截器原理*...

    浅谈Struts2拦截器的原理与实现.docx

    通过上述步骤,开发者可以轻松地为Struts2应用添加拦截器,实现诸如权限验证、日志记录、性能监控等额外功能,提高了代码的可维护性和可扩展性。在实际项目开发中,拦截器的应用非常广泛,是Struts2框架中不可或缺的...

    Struts2学习案例(拦截器)

    在Struts2中,拦截器是基于Java的动态AOP(面向切面编程)实现的,它可以在Action调用前后插入额外的逻辑,比如日志记录、权限验证、事务管理等。拦截器通过配置文件或者注解与Action关联,形成一个拦截器栈,每个...

    创建自己struts2拦截器

    Struts2是一个强大的MVC框架,它通过使用拦截器(Interceptor)来实现业务逻辑与表现层的解耦,提供了一种灵活的扩展机制。在Struts2中,拦截器是AOP(面向切面编程)的一种实现,它可以监控、修改或增强方法调用的...

    struts2.0拦截器、crud例子与用法

    拦截器可以用来实现日志记录、权限检查、事务管理等通用功能。当一个请求到达时,Struts2会根据配置文件决定哪些拦截器需要被调用,并按照预定义的顺序执行。请求首先通过一系列拦截器,然后才到达Action,处理完...

Global site tag (gtag.js) - Google Analytics