如何做基于struts2的权限管理

如题所述

1 实现权限控制拦截器
本示例应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源;否则,系统直接转入登陆页面。对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用。因为大部分Action里的权限检查代码都大同小异,故将这些权限检查的逻辑放在拦截器中进行将会更加优雅。

检查用户是否登陆,通常都是通过跟踪用户的Session来完成的,通过ActionContext即可访问到Session中的属性,拦截器的intercepte(ActionInvocation invocation)方法的invocation参数可以很轻易地访问到请求相关的ActionContext实例。
权限检查拦截器类的代码如下:
//权限检查拦截器继承AbstractInterceptor类
public class AuthorityInterceptor extends AbstractInterceptor
{
//拦截Action处理的拦截方法
public String intercept(ActionInvocation invocation) throws Exception
{
//取得请求相关的ActionContext实例
ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
//取出名为user的Session属性
String user = (String)session.get("user");
//如果没有登陆,或者登陆所用的用户名不是scott,都返回重新登陆
if (user != null && user.equals("scott") )
{
return invocation.invoke();
}
//没有登陆,将服务器提示设置成一个HttpServletRequest属性
ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统");
//直接返回login的逻辑视图
return Action.LOGIN;
}
}
上面拦截器代码非常简单,先通过ActionInvocation参数取得用户的Session实例的引用,然后从中取出user属性,通过判断该属性值来确定用户是否登陆系统,从而判断是否需要转入登陆页面。

2 配置权限控制拦截器
一旦实现了上面的权限检查拦截器,就可以在所有需要实现权限控制的Action中复用上面的拦截器。
为了使用该拦截器,首先在struts.xml文件中定义该拦截器,定义拦截器的配置片段如下:
<!-- 用户拦截器定义在该元素下 -->
<interceptors>
<!-- 定义了一个名为authority的拦截器 -->
<interceptor name="authority" class="lee.AuthorityInterceptor"/>
</interceptors>
定义了该拦截器之后,可以在Action中应用该拦截器,应用该拦截器的配置片段如下:
<!-- 定义一个名为viewBook的Action,其实现类为ActionSupport -->
<action name="viewBook">
<!-- 返回success视图名时,转入/WEB-INF/jsp/viewBook.jsp页面 -->
<result>/WEB-INF/jsp/viewBook.jsp</result>
<!-- 拦截器一般配置在result元素之后! -->
<interceptor-ref name="defaultStack"/>
<!-- 应用自定义拦截器 -->
<interceptor-ref name="authority"/>
</action>

上面名为viewBook的Action,没有指定class属性,默认使用ActionSupport类,配置该Action时,只是指定了一个Result,指定返回success字符串时,系统将转入/WEB-INF/jsp/viewBook.jsp页面。但并为未配置login视图对应的JSP页面。
考虑到这个拦截器的重复使用,可能在多个Action都需要跳转到login逻辑试图,故将login Result定义成一个全局Result。下面是配置login Result的配置片段:
<!-- 定义全局Result -->
<global-results>
<!-- 当返回login视图名时,转入/login.jsp页面 -->
<result name="login">/login.jsp</result>
</global-results>

经过上面的配置,如果浏览者在浏览器中直接发送viewBook请求,将会转入如图所示的页面。
这种通过拦截器进行权限控制的方式,显然具有更好的代码复用。
如果为了简化struts.xml文件的配置,避免在每个Action中重复配置该拦截器,可以将该拦截器配置成一个默认拦截器栈(这个默认拦截器栈应该包括default-stack拦截器栈和权限检查拦截器)。
定义自己的默认拦截器栈的配置片段如下:
<interceptors>
<!-- 定义权限检查拦截器 -->
<interceptor name="authority" class="lee.AuthorityInterceptor"/>
<!-- 定义一个包含权限检查的拦截器栈 -->
<interceptor-stack name="mydefault">
<!-- 定义拦截器栈包含default-stack拦截器栈 -->
<interceptor-ref name="default-stack"/>
<!-- 定义拦截器栈包含authority拦截器 -->
<interceptor-ref name=" authority"/>
</interceptor- stack >
</interceptors>

一旦定义了上面的mydefault拦截器栈,这个拦截器栈包含了权限检查拦截器和系统默认的拦截器栈。如果将这个拦截器栈定义成默认拦截器,则可以避免在每个Action需要重复定义权限检查拦截器。
下面是定义默认拦截器的配置片段:
<default-interceptor-ref name="mydefault"/>
一旦在某个包下定义了上面的默认拦截器栈,在该包下的所有Action都会自动增加权限检查功能。对于那些不需要使用权限控制的Action,将它们定义在另外的包中——这个包中依然使用系统原来的默认拦截器栈,将不会有权限控制功能。
温馨提示:内容为网友见解,仅供参考
无其他回答

struts2 spring ibatis 的权限怎么做
直接用spring security3.0来控制。--看我的个人资料里面,大家捧捧场。

Struts2的系统怎么做到同一帐号不能多人登陆?
你可以不修改程序。而去写一个Interceptor,在里面拦截每个请求。这样更方便。PS:上面的代码里用到struts2 封装的一些session。。等 如果用的不习惯 可以换一下,就写成原始获取session的方法也行。

struts2的拦截器有哪些
Struts2的拦截器主要有以下几种:1. 权限验证拦截器(Authentication Interceptor):负责验证用户的访问权限。例如,用户登录状态检查、角色检查等。该拦截器可防止未经授权的用户访问受保护的页面和功能。当请求的资源被配置为需要验证时,这个拦截器将验证用户信息,如果验证失败则阻止访问并可能重定向到登录页面...

各位java前辈:1.在struts2中,在jsp页面是如何获取Action中值的?需要...
struts是采用ognl模型,就是对象关系模型,想要得到action中的值,首先的一点这个值要有set和get方法,在你请求action的时候,会重新生成一个action对象--》调用set方法给这个属性赋值,在jsp上展示用的是get方法,例如你有一个属性name需要展示,set、get方法写好后,在你请求的action中给name赋值,页面就...

有没有人在struts2的action这一层做事务控制
action不应该封装业务逻辑,但是action是controller,比如在 一个action里面可能会由几个Business Service的方法组成一个流程,如果仅对service的方法实现事务控制,那如果流程中某一个service 的方法出现了问题,流程中之前调用的其他service怎么回滚呢。

struts2的includeJars配置问题
首先,struts2进行权限验证是用拦截器做的 一个简单的登录拦截器示例如下:package com.zdf.interceptor;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import com.zdf.entity.Admin;SuppressWarnings("serial"...

struts2实现权限的拦截器,为什么先进拦截器 而不是Action?
如果你非要用action进行请求转发也可以实现单这样代码就耦合了 如果你用拦截器实现就相当于是组件的方式将权限模块和业务分离,并且代码重用性高 可根据需要进行灵活的组装和配置

我要怎么让spring来代理struts2的action,就像struts一样,做个这个的...
这非常简单,比struts1更容易,只要在引入spring的插件包,在struts2的配置文件的action元素中的class属性值设置为spring中管理的bean的名称即可,即当你指定spring为struts2的对象工厂(当然有很多框架都可以作为对象工厂),那么struts2中配置文件里的action的class如过为类完全名字,则用这个类,如果不是则...

用maven构建的项目,使用了spring3和Struts2,然后发布运行的时候就报错了...
首先,struts2进行权限验证是用拦截器做的 一个简单的登录拦截器示例如下:package com.zdf.interceptor;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import com.zdf.entity.Admin;SuppressWarnings("serial"...

在线等!关于struts2中拦截器权限控制的问题,没登录的时候一直不跳到登录...
必然的啊,因为你在进入登陆的Action前执行的拦截器,而这时还没有执行你的登陆方法,因此取得的username为空.登陆拦截是拦截登陆方法以外的Action,登陆的Action千万别拦截,否则永远没办法登陆了 另外,团IDC网上有许多产品团购,便宜有口碑

相似回答