2013-06-20 27 views
0

我正在使用的工具只能發送GET請求,並且需要使用請求中包含的信息處理繁重的操作。這些操作然後返回一個包含我將用於重定向的URL的String。使用servlet上的doGet()方法處理繁重的操作

經過一番研究,我發現doGet()方法用於預處理請求,而doPost()可用於後期處理。

有沒有什麼辦法可以使用doGet()方法執行這些繁重的操作?如果我必須使用doPost()方法,我怎樣才能將我的請求變成POST請求?

謝謝。

編輯:我已經嘗試在doGet方法中處理這些繁重的操作。但似乎servlet不會等到生成用於重定向的url字符串。我已經讀過嘗試在性能方面同步doGet()方法是一件壞事。

編輯2 - 關於我要做的事情:我正在使用的工具是Oracle解決方案。您可以在客戶端啓動自定義操作,包括Web應用程序。啓動自定義操作將嚮應用程序發送一個GET請求,其中包含有關從中啓動應用程序的頁面的所有信息(用戶,所選項目等),然後應用程序使用此信息處理我所討論的繁重操作。操作包括使用相同的ID在Oracle客戶端上創建新會話,根據所選項目進行查詢,創建XML數據,甚至使用位於Oracle服務器上的外部程序。最後,它會返回一個可下載PDF報告的下載URL,並使用此URL重定向應用程序。

這裏的servlet代碼:

package com.servlets; 

import java.io.IOException; 
import javax.naming.InitialContext; 
import javax.servlet.ServletConfig; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import com.actions.agileSessionHandler; 
import com.actions.BOMComparisonReport; 

public class DefaultServlet extends HttpServlet { 

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 

     agileSessionHandler handler = new agileSessionHandler(...); 
     BOMComparisonReport report = new BOMComparisonReport(...); 
     handler.setSessionObject(request); 
     String url = report.generateBOMReport(...); 
     request.setAttribute("redirectURL", url); 
     this.getServletContext().getRequestDispatcher("/WEB-INF/BOMCompDefault.jsp").forward(request, response); 
    } 

} 
+0

你在文獻中看到過這些嗎?我不會將這兩種方法之間的差異描述爲預處理和後處理。你可能誤解了**冪等** HTTP方法的工作原理嗎? –

+0

向我們展示Servlet代碼。 – NINCOMPOOP

回答

0

如果你想「轉」的要求爲POST請求時,你可以簡單地調用doPost方法從doGet,但如果你想要的,不會改變任何東西POST功能。

如果您的工具正在發送大量的請求參數,那麼所有的參數將被附加在URL中,這是不安全的。

如果是GET請求,則可以成功管理的url的長度也與容器不同。

正如新白癡告訴的,冪等意味着一次又一次地執行相同的操作,而不會引起任何副作用

方法GET是冪等性的,因爲它只是要求資源和一遍又一遍地請求資源不會導致任何問題,但POST由表單提交和多次輸入表單數據會導致嚴重問題。 試着考慮一下當您的貨幣交易發生多次單次在線購買時的例子

簡單的資源鏈接是GET請求,您可以將它們加入書籤並一遍又一遍地重複請求。

GET請求的安全性較低,因爲所有參數都在url中可見,而POST請求更安全,因爲它們未顯示在url中的任何位置。

大部分時間,GET url可以是2048個字符,這意味着您可以發送有限的數據。 在POST方法的情況下,沒有任何限制的數據要被髮送

+0

這不會奇蹟般地改變哪個HTTP方法被調用。 –

+0

我想過這個解決方案,但根據我讀過的內容,它已經被高度棄用了。 – user2505969

+0

@TomG我明白,這就是爲什麼我已經相應地編輯它。 –

0

IMHO沒有的重操作的基礎上POSTGET方法分類。 GET是冪等的,而POST不是。 GET是冪等的含義,因此多次應用相同的操作應該產生相同的結果,在POST中它有副作用。

GET顧名思義就是用來從服務器獲取某些東西,而POST應該用於將數據發佈到服務器以供進一步處理。雖然,沒有人可以阻止你實施非冪等GET方法。

按照Wikipedia

GET請求指定資源的表示。請注意,不應將GET用於導致副作用的操作,例如將其用於在Web應用程序中執行操作。其中一個原因是GET可能被機器人或抓取工具任意使用,而不需要考慮請求應該導致的副作用。

POST將數據提交到被處理(例如,從一個HTML表格)所標識的資源。數據包含在請求的正文中。這可能會導致創建新資源或更新現有資源或兩者。

有了讓你可以有限的數據使用的查詢字符串,並再次它們限制了服務器的URL不能是無限延伸的。數據也顯示在瀏覽器窗口中。

我讀過這是一個不好的事情,試圖同步您的doGet()方法的性能。

你想做什麼?每個請求將有自己的線程執行doGet()方法。

1

我已經嘗試在doGet方法中處理這些繁重的操作。但似乎servlet沒有等到我用重定向的URL字符串產生

聽起來好像你發射一個新的線程,完全忘記它。這在Java EE環境中是一個非常糟糕的主意。不要這樣做。只需在同一個線程中處理即可(即根本不要創建new Thread())。如果你真的打算異步做,那麼你應該使用例如在EJB上使用方法@Asynchronous,然後利用輪詢或推送來通知客戶有關進度/結果。

無論您是在GET還是POST請求中執行此操作都無關緊要。關鍵是,GET請求是冪等的,可收藏的,可重複執行的,每次都有完全相同的結果。想一想SQL SELECT查詢。 POST請求不是。它們將用於操縱服務器端的數據。考慮執行SQL UPDATEDELETE查詢。您不希望您的數據在每次F5新聞發佈中被修改或刪除,或者即使有一個searchbot出現索引GET鏈接時,對吧?

相關問題