簡體   English   中英

我可以在Java Servlet過濾器中攔截和更改HTTPServletRequest的請求url嗎?

[英]Can I intercept and change the request url of a HTTPServletRequest within a Java Servlet filter?

我有一個Java Web應用程序,可以管理許多俱樂部的數據。 我希望該應用程序根據輸入的URL顯示俱樂部信息。

例如。 如果輸入“ localhost:8080 / MyApp / Club1” ...則應用程序應去除請求URL(Club1)的末尾,在俱樂部的數據庫中進行查找,並將其添加到會話中。 然后,所有數據庫請求都可以根據會話中的俱樂部來查找數據。

如果輸入“ localhost:8080 / MyApp / Club2”,則會在該會話中注冊club,並且所有數據庫請求都針對club 2。

我認為我可以執行此操作的方式是使用一個Servlet過濾器,該過濾器調用HTTPServletRequest()。getRequestURL(),並從請求url中刪除俱樂部名稱,以便從數據庫中查找俱樂部。

但是,然后我將請求URL更改為http:// localhost:8080 / MyApp ,以使應用程序正常運行。 但是,我認為我無法做到這一點?

任何人都知道如何執行此操作,或者是否有更好的方法?

我認為過濾器不是執行此操作的正確方法。 您要描述的基於俱樂部成員資格更改行為的邏輯是服務層內部的邏輯,可以在其中重復使用。

更好的方法是忘記過濾器,只對Servlet進行編程。 傳遞俱樂部名稱作為參數,使用它在該俱樂部的URL映射中進行查找,並使您的servlet使用RequestDispatcher重定向到該俱樂部的URL。 我沒有看到使用Filter攔截它的心跳的任何優勢。

如果您使用的是Spring,建議將其放入服務中,並讓Web MVC層處理請求的映射和路由。

這是其中一種情況,如果它太困難且難以完成所需的操作,則可能是您嘗試了錯誤的事情。 有更簡單的方法可以做到這一點,並且過濾器甚至都沒有關閉。

看看urlrewritefilter 這是一個Servlet過濾器,可以在Servlet看到請求之前對其進行修改。 它通常用於將查詢參數與路徑參數進行轉換。

如果您使用google搜索,則會在一些非常引人注目的Java應用程序的堆棧跟蹤中看到它:)

核心J2EE模式-攔截過濾器

簡介:創建可插拔過濾器以標准方式處理通用服務,而無需更改核心請求處理代碼。 篩選器攔截傳入的請求和傳出的響應,從而允許進行預處理和后處理。 我們能夠毫不干擾地添加和刪除這些過濾器,而無需更改現有代碼。

在servlet的do_GET / do_POST ,您可以將URI的第一部分解釋為一個俱樂部,如果尚不存在,則將其添加到會話中(使用應用程序范圍),然后委托給僅查看URI其余部分的其他代碼。並在適當的時候使用會期俱樂部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM