• Struts2 利用拦截器 interceptor 控制登陆和访问权限


    最近学习了Struts2的登录和权限控制用到的是拦截器,需要在struts.xml中配置,每个action都默认的继承defaultStack,如果你用了别的拦截器,还需要手动引入defaultStack。因为登录和访问权限拦截是全局的,拦截返回的结果有些也是全局的,所以我定义了自己的package以便引用。我是这样写的:
    ==================================================================================================
    < package name="struts-my" extends="struts-default">
          < interceptors>
           < !--判断是否登录 和 是否有访问权限  -->
           < interceptor name="auth" class="athenticationInterceptor" />     
           < interceptor-stack name="myStack">
                < interceptor-ref name="auth">< /interceptor-ref>
                < interceptor-ref name="defaultStack">< /interceptor-ref>         
            < /interceptor-stack>         
          < /interceptors>
         
          < default-interceptor-ref name="myStack">< /default-interceptor-ref>     
          < !--  全局结果 -->
          < global-results>
           < !-- 拦截没登录返回结果 -->
                < result name="noLogin" type="redirect">/jsp/no_login.jsp< /result>
                < !-- 拦截没有权限返回结果 -->
                < result name="noPower" type="redirect">/jsp/no_power.jsp< /result>
          < /global-results> 
         < /package>
             
     < package name="default" extends="struts-my">
             < !--登录登出不需要拦截 让它们已入 defaultStack-->
          < action name="login" class="loginAction" method="login">
           < result name="input">/jsp/login.jsp< /result>
           < result name="success" type="redirect">/jsp/index.jsp< /result>
           < interceptor-ref name="defaultStack">< /interceptor-ref>
          < /action>
         
          < action name="logout" class="loginAction" method="logout">
           < result name="success">/jsp/login.jsp< /result>
           < interceptor-ref name="defaultStack">< /interceptor-ref>
          < /action>
    。。。。。。。。。
      
     
    ==================================================================================================
        需要说明的是,登录和登出是不需要拦截的(或者其它不需要拦截的),我们让它们的拦截器继承defaultStack。局部权限高于全局定义的,它们的拦截器栈就是默认的,不是自定义的。
        还有一点要说明的是我,我拦截器的名字auth引用的类是在Spring里面配置的一个bean,我用的是SSH,在类里面我用到了一些数据库的东西,我需要在Spring里注入。如果不需要可以直接写用到的类(要写路径)。
        在登陆成功后,我把“user”放到了session中,我还有一张权限表,里面存的是权限组id和访问的权限。用户表里存放权限组id,这样就可以知道用户有什么权限了。我实现拦截的类是这样写的。
    ==================================================================================================
    public class AuthenticationInterceptor extends AbstractInterceptor {
    //这个是需要用到的自定义的方法。
    private GroupPowerService groupPowerService;
    public String intercept(ActionInvocation invocation) throws Exception {
      
      Map map= invocation.getInvocationContext().getSession();
          
            if (map.get("user")==null)
            {
                return  "noLogin";
            }
            else
            {
             //得到用户的权限id 和 访问的类名
             int id = ((User)map.get("user")).getGroupId();
             //拦截的action的名字
             String action = invocation.getInvocationContext().getName();
            
             //通过用户id 和拦截的action名判断用户是否有这个权限         
             if(this.groupPowerService.hasPower(id,action))
              //继续执行 不拦截
              return invocation.invoke();
            
             return "noPower";
            }
     }
    public GroupPowerService getGroupPowerService() {
      return groupPowerService;
     }
    ==================================================================================================
    还有两个jsp页面和一个在Spring的配置文件里的一句话(这里拦截器和action一样,用到什么sevice用注入什么)就没什么可说的了。
     


    form: http://blog.sina.com.cn/s/blog_7d0c4ede0100tfdv.html

    关注公众号,分享干货,讨论技术


  • 相关阅读:
    【IT学习资源】2013.10.30
    【转载】 Bash之read命令
    【书本目录】 -- ABS(advanced bash scripts)
    【转载】vSphere的使用
    【转载】 Linux命令 -- tr 转换字符
    【转载】Oracle的日常监控脚本
    【转载】Nginx基础:6.webcache缓存服务
    大学记忆(3)[三国杀(终)]
    大学记忆(1)[记忆之殇]
    大学记忆(2)[计算机]
  • 原文地址:https://www.cnblogs.com/molashaonian/p/9097642.html
Copyright © 2020-2023  润新知