首頁 Java java教程 在Java的Struts中判斷是否調用AJAX及用攔截器對其優化

在Java的Struts中判斷是否調用AJAX及用攔截器對其優化

Jan 09, 2017 pm 02:22 PM

Strut2判斷是否為AJAX呼叫
1.   AJAX與傳統Form表單
實際上,兩者一般都是透過HTTP的POST請求。差別是瀏覽器提交Form表單後,期望伺服器回傳一個完整的HTML頁面。而AJAX呼叫是由XMLHttpRequest物件(不同瀏覽器可能不一樣)發出,瀏覽器期望伺服器回傳HTML片段即可,具體是JSON、XML等都沒有要求。回到瀏覽器後如何使用,也是由JS腳本自己決定的。
 
2. 請求是不是AJAX
那麼對於伺服器端,如何判斷一個HTTP請求是不是AJAX呼叫?這需要看HTTP的Header。
 
我們可以透過Header中的x-request-with來判斷。儘管不同瀏覽器發送AJAX請求的物件不同,但是如果使用jQuery發送AJAX請求的話,jQuery內部實作ajax的時候,已經加入了標識。 jQuery原始碼中是這樣的:xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
所以,如果專案的前台頁面都是透過jQuery發送AJAX請求的話,這樣判斷是安全的。
 
下面是HTTP請求所攜帶的Header資訊。
 
普通Form表單提交

===MimeHeaders ===
accept = */*
referer =http://localhost:8080/user2/toQueryPage.action
accept-language = zh-CN
user-agent = Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C;.NET4.0E)
accept-encoding = gzip, deflate
host = localhost:8080
connection = Keep-Alive
cache-control = no-cache
登入後複製

AJAX調用(IE)

===MimeHeaders ===
x-requested-with = XMLHttpRequest
accept-language = zh-cn
referer =http://localhost:8080/user2/toQueryPage.action
accept = application/json, text/javascript,*/*; q=0.01
content-type =application/x-www-form-urlencoded
accept-encoding = gzip, deflate
user-agent = Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C;.NET4.0E)
host = localhost:8080
content-length = 57
connection = Keep-Alive
cache-control = no-cache
登入後複製

   

 
3.   在Action中獲得HTTP請求頭
在Action類中,通過ServletRequestAware接口獲得HttpServletRequest對象,再通過getHeader方法得到我們想要的頭資訊。

public abstract class BaseAction
    <ParamVo extends BaseParamVo, ResultVo extends BaseResultVo>
      extends ActionSupport
        implements ServletRequestAware {
    
  private static final String AJAX_RESULT_NAME = "ajaxResult";
  private static final String XHR_OBJECT_NAME = "XMLHttpRequest";
  private static final String HEADER_REQUEST_WITH = "x-requested-with";
    
  /**
   * Request对象,用来判断请求是否是AJAX调用
   */
  private HttpServletRequest request;
    
  private ParamVo paramVo;
    
  private ResultVo resultVo;
    
  @Override
  public String execute() {
    String resultPage = SUCCESS;
    try {
      resultVo = doExecute(paramVo);
    }
    catch (BaseException e) {
      resultPage = ERROR;
    }
      
    if (XHR_OBJECT_NAME.equals(request.getHeader(HEADER_REQUEST_WITH))) {
      resultPage = AJAX_RESULT_NAME;
    }
      
    return resultPage;
  }
}
登入後複製

   

 Struts2性能調優攔截器
當我們在工作中需要實現某些小需求時,不妨先進行下簡單的調查,看看正在使用的開源框架是否已經了我們需要的功能,具備這樣就不用重複發明輪子了。
 以下以效能測試為例,看看如何調查Struts2框架是否具備此功能。

1.   struts-default.xml

因為Struts2的許多核心功能都是基於內部攔截器來實現的,所以我們首先要看看它是否有性能調優相關的攔截器。這就需要查看strut2-core-2.3.1.2.jar中的預設設定檔struts-default.xml了。

<span style="white-space:pre"> </span><interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
      <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
      <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
      <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
      <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
      <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
      <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
      <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
      <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
      <interceptornameinterceptorname="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
      <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
      <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
      <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
      <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
      <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
      <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
      <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
      <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
      <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
      <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
      <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
      <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
      <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
      <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
      <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
      <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
      <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
      <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
      <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
      <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
      <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
      <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
登入後複製

   

Struts2像個百寶箱內建了許多攔截器,可以看到profiling很可能就是符合我們需求的攔截器,那現在就打開源碼一探究竟。
 
2.   ProfilingActivationInterceptor

org.apache.struts2.interceptor.ProfilingActivationInterceptor.java

public class ProfilingActivationInterceptor extendsAbstractInterceptor {
   
  private String profilingKey = "profiling";
  private boolean devMode;
    
  @Inject(StrutsConstants.STRUTS_DEVMODE)
  public void setDevMode(String mode) {
    this.devMode = "true".equals(mode);
  }
   
  @Override
  public String intercept(ActionInvocationinvocation) throws Exception {
    if (devMode) {
      Object val =invocation.getInvocationContext().getParameters().get(profilingKey);
      if (val != null) {
        String sval = (val instanceof String ?(String)val : ((String[])val)[0]);
        boolean enable = "yes".equalsIgnoreCase(sval)|| "true".equalsIgnoreCase(sval);
        UtilTimerStack.setActive(enable);
        invocation.getInvocationContext().getParameters().remove(profilingKey);
      }
    }
    return invocation.invoke();
   
  }
   
}
登入後複製

   

<package name="ajax-default" extends="velocity-default">
    <result-types>
      <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
    </result-types>
      
    <interceptors>
      <interceptor-stacknameinterceptor-stackname="ajaxInterceptorStack">
      <interceptor-refnameinterceptor-refname="defaultStack" />
      <interceptor-ref name="profiling"/>
      </interceptor-stack>
    </interceptors>
      
    <default-interceptor-refnamedefault-interceptor-refname="ajaxInterceptorStack" />
      
    <global-results>
      <result name="comAjaxResult" type="json">
        <param name="excludeNullProperties">true</param>
        <param name="root">result</param>
        <param name="ignoreHierarchy">false</param>
      </result>
    </global-results>
  </package>
登入後複製

   

效能攔截器就會開啟Timer工具類,並列印出Action的執行消耗時間。

3.   struts.xml

因為profiling攔截器沒有包含到預設的defaultStack中,所以我們要先將它追加到我們自訂的攔截器堆疊中。

function searchAllUser(){
  jQuery.ajax({
    type:"post",
    url: "searchAllUser.action",
    processData:true,
    dataType:&#39;json&#39;,
    data:jQuery("#userQueryForm").serialize() + "&profiling=yes",
    success:function(data) {
    if (data.status == 1) {
       alert("创建成功");
       generateTableFromJson("result", data.resultRows);
    } else {
       alert("创建失败");
    }
    }
  });
}
登入後複製
   

4.   userview.js

現在就可以修改AJAX呼叫參數,追加上profiling參數就可以開始效能調優了。

rrreee

   




 

5.   最終效果

 在Java的Struts中判斷是否調用AJAX及用攔截器對其優化列印結果就是下面如此。除了總執行時間外,Action方法的執行時間和Result的渲染時間都會分別列出。



更多在Java的Struts中判斷是否調用AJAX及用攔截器對其優化相關文章請關注PHP中文網!

🎜🎜🎜
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

See all articles