1. 程式人生 > >登陸攔截器總結

登陸攔截器總結

得到 jsp height oid 自定義 oba 訪問 alt throw

這是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,所以這裏只做簡單介紹

登陸攔截器總結