2011-08-18 161 views
0

首先嚐試:在servlet和jsp之間傳輸數據的最佳方式?

我生成servlet的數據,然後將其設置在請求的屬性,如下發送請求調用的RequestDispatcher把jsp:

request.setAttribute("data",data); 
request.getRequestDispatcher("/page.jsp").forward(request, response); 

現在訪問JSP中並顯示數據。

這工作正常,但每次用戶刷新頁面,它會得到一個警告,說你要重新提交表單並要求確認。這很煩人。

第二個嘗試:

會話將數據和訪問,在JSP頁面中。由於數據量很大,會話會變得非常繁重。

所以我的問題是將數據從servlet傳遞給jsp的最佳方式是什麼? 這裏的數據是對象列表。

+0

只需使用GET而不是POST來檢索*數據。另請參閱servlet標籤維基頁面http://stackoverflow.com/tags/servlets/info – BalusC

回答

2

你的第一個解決方案是好的。使用會話保存特定於單個請求的數據不是一種好的做法。用戶收到確認消息的事實與數據從servlet傳遞到JSP的方式無關。它與他們正在查看和刷新的頁面是POST請求的結果有關。

使用Redirect after Post (or Post-Redirect-Get) pattern可以避免此問題。

例如,假設您要保存新產品,並且在保存產品(使用POST請求)後,您想要顯示產品的分類頁面。它會走這條路:

  1. 提交「保存產品」形式
  2. 店的產品數據庫,ADN得到它的類ID(456)
  3. 發送重定向到URL產品分類的categoryId = 456?從數據庫
  4. 將這個數據在一個請求屬性
  5. 用戶自動進入到上述網址
  6. 獲取數據的456類別和轉發的productCategory.jsp頁面
  7. 用戶可以看到產品類別頁面,以及他剛剛保存的新產品。如果他刷新,它會在未經確認的情況下重新顯示類別,並且不會重新提交「保存產品」表單。
+0

我可以發送數據而不顯示在url中嗎?那就是(按照你的例子)發送'categoryId'到'productCategory' servlet,但不是在url中。因爲那麼用戶可以在瀏覽器網址中看到它並可以使用它。那麼有沒有解決方案? –

+0

不,你不能重定向併發布信息。要隱藏它,你需要在AJAX中完成所有這些,但它只會給你一種錯誤的安全感。任何人都可以右鍵單擊您的頁面,查看其源,修改並重新提交,即使使用POST或AJAX請求。只要確保在服務器端訪問被禁止未授權查看特定類別的用戶訪問。你可以加密/解密請求參數,但即使如此,你應該使受保護的資源真正受到保護。通過默默無聞的安全行不通。 –

+0

@Mark:用請求參數「玩」究竟有什麼問題?你想阻止特定的類別顯示給有問題的用戶嗎?然後,需要以不同的方式解決該問題(即使POST也是一個問題,因爲最終用戶也可以通過POST請求的參數「玩」)。 – BalusC

相關問題