簡體   English   中英

Spring wevmvc應用中URI匹配

[英]URI matching in Spring wevmvc application

我有一個非常基本的 web mvc 程序。 我目前掃描所有帶有 Controller 注釋的類,並掃描所有聲明的方法以查看它們是否具有自定義注釋。 我收集了所有具有自定義注釋的路徑,以便我可以在過濾器中執行自定義魔術。 到目前為止一切都很好,但是我必須匹配過濾器中的路徑,這就是我的問題所在。我還沒有找到一個庫/util/工具可以做到這一點。 我想要實現的是一種非侵入式的方式來自定義注釋請求映射,這樣我就可以做一些過濾魔術。 過濾器所做的不是此時的問題,而是將傳入的請求 URI 與注釋定義的 URI 進行匹配。 這里的問題是定義的路徑有參數的占位符,但傳入的請求已經填充了它們。 這意味着定義的路徑可以是 /mypath/{param1} 而傳入的 URI 是 /mypath/somevariable 所以我不能使用精確匹配。 我知道我可以做一些事情,例如用 / 拆分 URI,用 * 替換變量部分,並使用 ANT 路徑匹配器或類似的東西。 但我認為重新發明輪子和做已經完成的工作沒有意義。 應用程序容器(或 web 容器或任何正式名稱)可以將傳入請求路由到正確的處理程序這一事實意味着它已經完成,並且用於執行此操作的工具已經可用或存在。 在寫這篇文章時,我想到了另一個問題。 我想知道我是否應該嘗試找到現有的工具,或者是否有其他更明智的方法來做到這一點,因為容器已經完成(或將要完成)URI 匹配。 這些不是我想出的,我很確定這些可能已經被考慮過了。我還沒有找到解決方案,但也可能是我只是缺少正確的搜索詞。 這發生在我提出問題並且有人發表評論之前,我已經得到了遺漏的詞,這讓我找到了解決方案。

看來我誤解或理解錯誤 ANT 路徑(很可能是過去使用 ANT 構建系統時的“創傷”和一般懶惰的結合)。 ANT 路徑匹配正是我一直在尋找的工具,到目前為止它似乎對我的目的有用。 這是一個小代碼片段,顯示了我的目標(我當場修改了我的原始代碼,對於任何重大錯誤,我們深表歉意):

@Component
@Order(Ordered.HIGHEST_PRECEDENCE - 1)
public class AuthorizationFilter extends OncePerRequestFilter
{
    private static final Logger LOG = LoggerFactory.getLogger(AuthorizationFilter.class);

    Private List<String> collectedEndpointPaths;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException
    {
        LOG.trace("Checking authorization for [{}] {}", request.getMethod(), request.getRequestURI());
        for (String path : collectedEndpointPaths) {
            if((new AntPathMatcher()).match(path,z request.getRequestURI())) {
                // Do my magic
            }
        }
        filterChain.doFilter(request, response);
    }

}

暫無
暫無

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

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