登陸攔截器總結
阿新 • • 發佈:2017-09-04
得到 jsp height oid 自定義 oba 訪問 alt throw ,我們在寫staffAction類的時候需要實現ModelDriven接口,重寫接口中的getModel方法,獲得javaBean實例對象,即crmStaff,如果該對象不為null,我們將其壓入ValueStack棧頂。接下來從值棧棧頂開始封裝數據(即將屬性進行設置值),這裏用到的是params,如果loginName和loginPwd均為空,我們對其進行封裝數據.下一步是conversionError攔截器,出現異常,進行攔截並提示信息,最後是校驗和workflow攔截器,如果workflow攔截器判斷有錯誤信息,則默認返回input,沒有錯誤就放行,在我們自定義的loginInterceptor攔截器中進行判斷,不攔截login,其他均攔截,采用doInteceptor方法進行攔截,判斷session中是否有數據,如果有數據,則放行,沒有數據,則進行攔截,返回到登陸頁面。
這是struts2中的登陸攔截器的實現流程
首先,啟動服務器後,用戶在地址欄輸入地址,如果地址是以action結尾的,服務器中的前端控制器會對該action進行攔截,然後交給ActionProxy代理進行處理,主要目的是進行
增強,因為,最開始是用戶進行登錄,所以我們的目標類是StaffAction,將該action實例壓入ValueStack棧中,下一步我們將進入到攔截器模塊,我們使用的是自定義大的攔截器棧loginStack,該攔截器棧中包含默認的攔截器棧defaultStack和我們自定義小的攔截器棧loginInterceptor.由於我們將默認攔截器棧defaultStack放在攔截器棧loginInterceptor之前,我們需要先執行默認攔截器棧defaultStack,打開攔截器棧defaultStack源碼,裏面的攔截器從上向下執行,第一個攔截器是modelDriven
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; publicclass 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,所以這裏只做簡單介紹
登陸攔截器總結