使用拦截器进行粗粒度的权限管理
1. 首先要在struts的配置文件中进行拦截器的配置
<package name="sys" extends="struts-default" namespace="/">
<interceptors>
<!-- 声明自己的拦截器,起名叫check,对应的class属性为自己编写的拦截器路径 -->
<interceptor name="check" class="com.scm.actions.sys.AuthorInterceptor" />
<!-- 定义拦截器栈,这里需要注意:在定制自己拦截器的同时,必须要把struts的默认栈加如里面,如果不加入,相当于把默认的覆盖了,会出现异常! -->
<interceptor-stack name="myCheck">
<interceptor-ref name="check" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<!-- 定义默认拦截器 -->
<default-interceptor-ref name="myCheck" />
<!-- 定义全局结果,用于在拦截器中返回登录页面或者错误提示页面 -->
<global-results>
<result name="login" type="redirect">/round.html</result>
<result name="error">/scm_templates/Samples/index.html</result>
</global-results>
</package>
2. 编写拦截器类
package com.scm.actions.sys;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.scm.domain.SysYonghu;
/**
* 拦截器需要继承AbstractInterceptor,或者是实现Interceptor接口(AbstractInterceptor也是实现的Interceptor)
*/
@SuppressWarnings("serial")
public class AuthorInterceptor extends AbstractInterceptor {
/*不清楚为什么,在拦截器中注入业务层或者数据访问层的对象始终为null,
但是注入action对象却可以,所以这里我注入action对象,然后在action中
转去调用业务层的方法..*/
private YongHuAction yonghuAction;
//getter and setter...
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("=======检查action=======");
// 获得拦截到的action名称
String actionName =invocation.getInvocationContext().getName();
ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
//如果拦截到的action是请求登录的action,则放行.
if (actionName.equals("logins")) {
return invocation.invoke();
} else {
//session中取得当前用户.
SysYonghu yonghu = (SysYonghu) session.get("current_user");
//如果当前用户为空,转到登录页面.
if(yonghu==null){
session.put("tip", "请登录...");
return Action.LOGIN;
}
//调用action中的方法, 判断有无访问此动作的权限
boolean result=yonghuAction.isHave(actionName, yonghu);
if(result){
return invocation.invoke();
}else{
session.put("quanxian_tip", "您没有该资源的权限!");
return Action.ERROR;
}
}
}
}
3. 在使用的时候,如果有多个struts配置文件,只需要继承”sys”即可.如果其他配置文件中又定义了拦截器.那么这个拦截器将失效.
不足之处:拦截器只能拦截访问的action,如果直接访问jsp或其他视图,拦截器无法拦截. 所以应该配合filter使用;其实spring有自己的安全框架.可以把权限分的很细.希望有机会能用到.
分享到:
相关推荐
* 粗粒度权限管理使用 Filter 实现 * 使用 Java、JavaScript、JSP 及 XML 等技术解决系统前台页面响应速度、前台页面异步刷新等问题 项目管理知识 * 项目开发过程中,运用 Java、JavaScript、JSP 及 XML 等技术 * ...
- 使用Struts2的拦截器实现细粒度权限管理 - 使用Filter实现粗粒度权限管理 - **模块列表**: - 知识管理、人力资源、客户关系、个人事务等众多功能模块 - **职责描述**: - 参与功能分析和设计讨论 #### 六...
通过Struts2的拦截器和Filter实现不同粒度的权限控制,同时避免了对Spring的过度依赖,保持了代码的灵活性。 【技术细节】: - **Struts2**:一个MVC框架,负责请求调度和视图渲染。 - **Spring**:提供了依赖注入...
- **JC6协同管理平台 6.0**:开发者在项目中担任开发工程师,利用Struts、Spring和Hibernate进行开发,实现了细粒度和粗粒度权限管理,并且强调了不依赖Spring的DAO实现,以减少耦合。 5. **技能与技术**: - **...
和使用容器声明式事务管理。持久化层使用hibernate来实现,使用泛型DAO把...在实现细粒度权限管理时使用了Struts2中提供的拦截器实现对Action方法的拦截,当发现用户具有某个权限时,才允许Action方法继续执行。粗粒度
使用Struts2的拦截器实现权限控制,提供细粒度的访问控制;Filter则用于粗粒度的权限管理和URL过滤。JavaScript、JSP和XML则分别用于前端交互、视图呈现和配置文件。 在饶忠堂先生的项目经验中,我们可以看到JavaEE...