簡體   English   中英

修改HttpServletRequest的路徑參數

[英]Modify Path Param of an HttpServletRequest

我有一個處理該URL的方法:

http://IP:PORT/auth/myapp?Username=username

並且可以從遠程訪問。 但是我無法更改使用我的應用程序的外部系統,它會在HTTP標頭中發送用戶名。 我的意思是他們訪問了該URL:

http://IP:PORT/auth/myapp

我認為我可以獲得如下相關的HTTP標頭:

Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
    String headerName = (String)headerNames.nextElement();
    if (headerName.equals("UNAME")) {
        String username = request.getHeader(headerName);
    }   
}

我無法修改應用程序的整個部分,因此必須將該信息作為路徑參數添加到現有請求中。 我的意思是將該請求更改為:

http://IP:PORT/auth/myapp?Username=username

我怎樣才能做到這一點?

PS:這段代碼可以解決我描述的問題嗎?

if (request.getParameter("Username") == null) {
    Enumeration headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
        String headerName = (String) headerNames.nextElement();
        if (headerName.equals("UNAME")) {
            String username = request.getHeader(headerName);
            response.sendRedirect(request.getRequestURI() + "&Username="+username);
        }
    }
}

如果您正在應用程序其他部分中使用HttpServletRequest.getParameter('username')訪問“用戶名”查詢參數,則可以嘗試使用HttpServletRequestWrapper

class MyRequestWrapper extends HttpServletRequestWrapper{

    public String getParameter(String name){
        // if name equals username, call super.getHeader('username')
        //else super.getParameter(name);
    }
}

您可以擴展此類並重寫getParameter()方法。 在您的實現中,如果參數名稱為username,則從標頭獲取值,否則調用super方法。

我認為有兩種解決方案:

  1. 在映射到每個請求的應用程序上使用過濾器。 過濾器將檢查標頭並添加參數(如果存在UNAME標頭)
  2. 在Web應用程序前面使用Apache Rewrite模塊。 重寫模塊會將參數添加到url(檢查“ Module Apache mod_rewrite”)

更新:正如mohit所說,使用了帶有過濾器的HttpRequestWrapper

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
        FilterChain filterChain) throws IOException, ServletException {
        //create the MyCustomWrapperRequest object to wrap the HttpServletRequest
        MyCustomWrapperRequest request = new MyCustomWrapperRequest((HttpServletRequest)servletRequest);
        //continue on in the filter chain
        filterChain.doFilter(request, servletResponse);
}

並在MyCustomWrapperRequest中重寫getParameter()函數

它是一回合,但是如果您還有HttpServletResponse對象,則可以將重定向請求發送到http:// IP:PORT / auth / myapp?Username = username URL

暫無
暫無

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

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