拦截验证每个请求的权限

来源:互联网 发布:linux oracle删除监听 编辑:程序博客网 时间:2024/05/16 18:08

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

1 0
原创粉丝点击