• 登陆拦截器总结


    这是struts2中的登陆拦截器的实现流程

    首先,启动服务器后,用户在地址栏输入地址,如果地址是以action结尾的,服务器中的前端控制器会对该action进行拦截,然后交给ActionProxy代理进行处理,主要目的是进行

    增强,因为,最开始是用户进行登录,所以我们的目标类是StaffAction,将该action实例压入ValueStack栈中,下一步我们将进入到拦截器模块,我们使用的是自定义大的拦截器栈loginStack,该拦截器栈中包含默认的拦截器栈defaultStack和我们自定义小的拦截器栈loginInterceptor.由于我们将默认拦截器栈defaultStack放在拦截器栈loginInterceptor之前,我们需要先执行默认拦截器栈defaultStack,打开拦截器栈defaultStack源码,里面的拦截器从上向下执行,第一个拦截器是modelDriven,我们在写staffAction类的时候需要实现ModelDriven接口重写接口中的getModel方法,获得javaBean实例对象,即crmStaff,如果该对象不为null,我们将其压入ValueStack栈顶。接下来从值栈栈顶开始封装数据(即将属性进行设置值),这里用到的是params,如果loginName和loginPwd均为空,我们对其进行封装数据.下一步是conversionError拦截器,出现异常,进行拦截并提示信息,最后是校验和workflow拦截器,如果workflow拦截器判断有错误信息,则默认返回input,没有错误就放行,在我们自定义的loginInterceptor拦截器中进行判断,不拦截login,其他均拦截,采用doInteceptor方法进行拦截,判断session中是否有数据,如果有数据,则放行,没有数据,则进行拦截,返回到登陆页面。

    StaffAction类

    package com.itheima.crm.staff.web.action;
    
    import com.itheima.crm.staff.domain.CrmStaff;
    import com.itheima.crm.staff.service.StaffService;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    
    public class StaffAction extends ActionSupport implements ModelDriven<CrmStaff> {
    
        private CrmStaff staff = new CrmStaff();
        @Override
        public CrmStaff getModel() {
            // TODO Auto-generated method stub
            return staff;
        }
        //默认按照名称注入进来
        private StaffService staffService;
        public void setStaffService(StaffService staffService){
            this.staffService = staffService;
        }
        /**
         * 员工登陆
         * @return
         */
       public String Login(){
           //查询员工
           CrmStaff findStaff = staffService.login(staff);
           //是否成功
           if(findStaff !=null){
               //成功
               //3.1 session作用域保存数据
               ActionContext.getContext().getSession().put("loginStaff", findStaff);
              //3.2重定向到首页--xml中配置
               return "success";
           }
           //不成功
           this.addFieldError("", "用户名或密码错误");
           //返回,请求转发
           return "login";  
       }
       
       public String home(){
           return "home";
       }
    }

    struts.xml如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <!-- 1 常量 -->
        <!-- 1.1开发模式 -->
        <constant name="struts.devMode" value="true"></constant>
        <!-- 1.2标签主题,简单风格 -->
        <constant name="struts.ui.theme" value="simple"></constant>
        
        <!-- 2 公共项 -->
        <package name="common" namespace="/" extends="struts-default">
           <!--2.2 配置登陆拦截器 -->
           <interceptors>
              <!-- 1,注册  -->
              <interceptor name="loginInterceptor" class="com.itheima.crm.web.interceptor.LoginInterceptor"></interceptor>
               <!-- 2,自定义拦截器栈 -->
               <interceptor-stack name="loginStack">
                  <interceptor-ref name="defaultstack"></interceptor-ref>
                  <!-- 自定义拦截器必须进行login不进行拦截,因此,我们需要进行注入 -->
                   <interceptor-ref name="loginInterceptor">
                      <param name="excludeMethod">login</param>
                   </interceptor-ref>
               </interceptor-stack> 
           </interceptors>
            <!-- 3,申明默认 -->
            <default-interceptor-ref name="loginStack"></default-interceptor-ref>
            <!-- 全局结果集 -->
            <global-results>
               <result name="login">/WEB-INF/pages/login.jsp</result>
            </global-results>
           <!-- 2.1 配置公共访问action 
                总结:action.class 默认值:ActionSupport
                action.method 默认值:execute
                result默认值为:success
                -->
            <action name="UIAction_*_*">
              <result>/WEB-INF/pages/{1}/{2}.jsp</result>
              <!--1, <interceptor-ref name="defaultstack"></interceptor-ref>
                     <interceptor-ref name="loginInterceptor"></interceptor-ref> 
                   2,<interceptor-ref name="loginStack"></interceptor-ref> 
              -->
              <interceptor-ref name="loginStack"></interceptor-ref>  
            </action>
        </package>
        
        <!-- 3 加载其他配置文件 -->
        <include file="struts/struts-staff.xml"></include>
        
    </struts>

    登陆拦截器类LoginInterceptor如下:

    package com.itheima.crm.web.interceptor;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
    
    
    public class LoginInterceptor extends MethodFilterInterceptor {
    
        @Override
        protected String doIntercept(ActionInvocation invocation) throws Exception {
            // TODO Auto-generated method stub
            //判断session作用域是否有用户信息,如果有放行,如果没有拦截
            Object obj = ActionContext.getContext().getSession().get("loginstaff");
            if(obj==null){ 
                //获得当前运行的action, 没有此处也行,只是为了得到友好提示
                 Object action = invocation.getAction();
                 if(action instanceof ActionSupport){
                     ActionSupport actionSupport = (ActionSupport) action;
                     actionSupport.addFieldError("", "用户名与密码不匹配");
                 }
                //没有登陆,需要登陆
                return "login";
            }
            //登陆,放行
            return invocation.invoke();
        }
    
    }

    注:由于目前struts2差不多已经被淘汰了,我们大多会使用spring MVC spring boot,所以这里只做简单介绍

  • 相关阅读:
    书单
    parzen 窗的matlab实现
    Oracle-07
    图片加载不出来
    省市区三表建立及数据插入
    a链接与button按钮混用
    省市区三级联动,获取地区编号,JSON格式
    纯JS省市区三级联动
    JDK与JRE的区别
    web-03-jQuery
  • 原文地址:https://www.cnblogs.com/zjf-293916/p/7471312.html
Copyright © 2020-2023  润新知