zoukankan      html  css  js  c++  java
  • struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    •  理解  

        Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起组成一个栈.

        拦截器是一种AOP(面向切面编程)思想的编程方式.它提供一种机制是开发者能够把相对独立的代码抽离出来,配置到Action前后执行.

        Struts2拦截器,每个拦截器只有一个对象实例,属于单例模式,struts2核心功能都是通过拦截器来实现的.

    •  作用

        对action的一些公共处理代码可以放到拦截器中实现,比如权限控制,日志.

    •  执行流程

                      

     

    • 实现步骤

    1.   编写拦截器(实现interceptor接口或继承AbstractInterceptor抽象类即可, )
    2.   在struts.xml中配置拦截器
    3.   在action中使用拦截器

    下面写一个自定义拦截器的例子,判断用户是否登录,就是检查当前用户的session中的user属性是否为空,如果为空,就跳到登录页面,否则,继续执行.

      1.编写拦截器,在interceptor包下常见一个java类,名为LoginInterceptor,继承AbstractInterceptor:

    public class LoginInterceptor extends AbstractInterceptor{
    
        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
    
            //得到拦截到的action的名称,看是否是login,当是login的时候,不用进行下面的检测了,直接执行下一个拦截器
            String actionName=invocation.getProxy().getActionName();
            if("login".equals(actionName)){
                return invocation.invoke();
                        
            }
            //如果不是login.则判断是否已登录,及检测session中key为user的值是否存在,如果不存在,跳回到登录页面
            String user=(String)invocation.getInvocationContext().getSession().get("user");
            if(user==null){
                System.out.println("未登录");
                return "login";
            }
            //进行到这里.说明用户已登录,则跳转到下一个拦截器
            return invocation.invoke();
        }
    
    }

    2,在struts.xml中配置interceptor,主要特别注意的是,当使用了自定义的拦截器后,默认拦截器将不起作用,默认拦截器实在struts-default.xml中配置的,当引用了自定义拦截器,又想使用struts2提供的默认拦截器功能,需要手动配置:这里我将默认拦截器和我写的进行登录权限验证的拦截器,写到一个拦截器栈里,然后调用这个默认拦截器栈:

    <package name="default" namespace="/" extends="struts-default">
        
         <interceptors>
        <!-- 配置自定义的拦截器-->
              <interceptor name="checkLogin" class="com.wang.interceptor.LoginInterceptor"/>
        <!--配置一个拦截器栈,里面包含自己定义的拦截器和defaultStack默认拦截器-->            
          <interceptor-stack name="myStack">
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                    <interceptor-ref name="checkLogin"></interceptor-ref>
              </interceptor-stack>
         </interceptors>
        <!--引用默认的拦截器(栈)-->
            <default-interceptor-ref name="myStack"></default-interceptor-ref>
            
        <!--配置一个全局结果集-->
         <global-results> <result name="login">/login.jsp</result> </global-results> <action name="login" class="com.wang.action.LoginAction" > <result>/succ.jsp</result> <result name="error">/login.jsp</result> </action> </package>

     

    这里我使用了默认拦截器标签,即相当于在每个action标签下,使用了 <interceptor-ref name="myStack"></interceptor-ref>.jsp页面和LoginAction类这里就省略了.

    再来介绍一下方法拦截器,方法拦截器比action拦截器控制的更加精细,大体实现方式和action拦截器相同,不同的是它继承的是MethodFilterInterceptor类,重写的是doInterceptor()方法,在struts.xml的配置上也有些不同,大体是这样:

     <interceptor-ref name="methodInterceptor">
               <!--配置被拦截的方法-->
               <param name="includeMethods">methodA,methodsB</param> 
            <!--配置不被拦截的方法-->
    <param name="excludeMethods">methodsC,methodsD</param>
     </interceptor-ref>

     

  • 相关阅读:
    vmware中的虚拟系统和真实系统同时上网
    code first实现自关联(树结构数据)
    td无内容如何显示边框
    vs新建模板
    为ashx文件启用session管理
    有效防止SQL注入漏洞
    用DIV建左右自动伸缩型布局
    身份证验证算法
    CSS布局需注意的问题
    使用sharppcap抓数据包
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5190733.html
Copyright © 2011-2022 走看看