前面做的虽然在界面内看不见没有权限的链接 但可以直接在地址栏输入链接进行访问,所以我们这里要使用拦截器拦截每个访问action的请求
1.struts配置
<package name="default" namespace="/" extends="struts-default">
<!-- 声明拦截器 -->
<interceptors >
<interceptor name="CheckPrivilege" class="cn.itcast.oa.Utils.CheckPrivilegeInterceptor"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="MyStack">
<interceptor-ref name="CheckPrivilege"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认拦截器栈 -->
<default-interceptor-ref name="MyStack"></default-interceptor-ref>
<!-- 配置全局 result -->
<global-results>
<result name="loginUI">/WEB-INF/jsp/userAction/loginUI.jsp</result>
<result name="noPrivilegeError">/noPrivilegeError.jsp</result>
</global-results>
2.实现拦截器类
public class CheckPrivilegeInterceptor implements Interceptor {
public String intercept(ActionInvocation invocation) throws Exception {
/*
* System.out.println("拦截之前 "); String result = invocation.invoke();
* System.out.println("拦截之后 ");
*/
// 获取信息 当前登录用户 要访问的 权限
User user = (User) ActionContext.getContext().getSession().get("user");
// ***************************************
String nameSpace = invocation.getProxy().getNamespace();
String ActionNanme = invocation.getProxy().getActionName();
String privUrl = nameSpace + ActionNanme;// 对应的权限Url
// 1.是否等录 未登录就转到登录界面
if (user == null) {
if (/* 准备去登录 ,就放行 /user_loginUI /user_login */privUrl
.startsWith("/user_login")) {
return invocation.invoke();
} else
return "loginUI";
}
// 登若录 是否有权限
else {
// 有权限 放行
if (user.hasPrivilegeByUrl(privUrl)) {
return invocation.invoke();
}
// 无权限 转到提示界面
else {
return "noPrivilegeError";
}
}
}
public void destroy() {
// TODO Auto-generated method stub
}
public void init() {
// TODO Auto-generated method stub
}
}
这里还有一点问题就是 对首页的访问 home_index.action 以及注销的action 等访问也被拦截了,比如张三登录了,本应该跳到首页,但这个action实现没被安装到(初始化的)权限表中,所以会直接跳到无权访问的错误页面。。。。。下一篇我们在探讨怎么把这些基本的权限 赋予每个人。