前面做的尽管在界面内看不见没有权限的链接 但能够直接在地址栏输入链接进行訪问。所以我们这里要使用拦截器拦截每一个訪问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实现没被安装到(初始化的)权限表中,所以会直接跳到无权訪问的错误页面。
。。
。
。下一篇我们在探讨怎么把这些主要的权限 赋予每一个人。