簡體   English   中英

不區分大小寫的查詢字符串請求參數

[英]Case-insensitive query string request parameters

我的目標是以下所有URI都應該有效

https://開頭休息/ XYZ? sort = name

https://開頭休息/ XYZ? 排序 =名稱

https://開頭休息/ XYZ? filter = name = value

https://開頭休息/ XYZ? Filter = name = value

為此,我創建了自定義過濾器來覆蓋傳遞給FilterChain的HttpServletRequest。 以下是此方法的鏈接:

http://forum.springsource.org/archive/index.php/t-87433.html

我的代碼:

import java.io.IOException;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; 

public class HttpCustomParamFilter implements Filter
{
    private static class HttpServletRequestCustomeWrapper extends HttpServletRequestWrapper
    {
        private String[] parameterValues;

        @Override
        public String[] getParameterValues(String name)
        {
            Map<String, String[]> localParameterMap = super.getParameterMap();

            // Handle case insensitivity of http request paramters like start, count, query, sort, filter etc.
            if (localParameterMap != null && !localParameterMap.isEmpty())
            {
                parameterValues = new String[localParameterMap.size()];
                for (String key : localParameterMap.keySet())
                {
                    if (name.equalsIgnoreCase(key))
                        parameterValues = localParameterMap.get(key);
                    else
                        parameterValues = null;
                }
            }
            return parameterValues;
        }

        public HttpServletRequestCustomWrapper(final ServletRequest request)
        {
            super((HttpServletRequest) request);
        }


    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        // override the request passed to the FilterChain
        chain.doFilter(new HttpServletRequestCustomWrapper(request), response);
        }

    @Override
    public void init(FilterConfig filterConfig)
            throws ServletException
    {
        // TODO Auto-generated method stub

    }

    @Override
    public void destroy()
    {
        // TODO Auto-generated method stub

    }

}

在這段代碼中,我重寫了getParameterValues(String name)方法並實現了請求參數的大小寫不敏感,但不確定我是否需要覆蓋任何其他方法。

我的疑惑:

  • 我是否需要覆蓋其他方法,如getParameter()和getParameterNames()?

  • 內部實施受此影響的是什么?

  • 哪個類我可以看到getParameter(),getParameterNames()和getParameterValues()的代碼實現?

首先,讓我說出我的平安:我不認為修改HttpServletRequestWrapper是要走的路。 我甚至不確定你將如何使用它,因為我的理解是它是特定於App Server的。 作為旁注, 本文詳細介紹了如何使用HttpServletRequest獲取不區分大小寫的查詢參數,而無需自行編譯。

但是,本着回答你的問題的精神:

  1. 你需要覆蓋getParameter()和getParameterNames()嗎? 你可以,因為它會讓你有能力操縱案件。 事實上,我認為使查詢參數不區分大小寫的最安全的方法是僅覆蓋那些方法。 使getParameter()調用對字符串名稱執行不區分大小寫的等號。 不確定你會用getParameterNames()做什么,也許會返回所有可能的情況,但這似乎是多余的。
  2. 這會影響哪些內部實施? 我不確定。 HttpServletRequest幾乎是所有內容的核心,如果您的代碼不是100%可靠,那么無法告訴您可以引入什么。 例如,Spring有一個SecurityContextHolderAwareRequestWrapper,這是否意味着你剛剛打破了Spring Security? 沒有很多測試就沒有告訴。
  3. 我可以在哪個類中看到getParameter(),getParameterNames()和getParameterValues()的代碼實現? 根據JavaDocs,HttpServletRequestWrapper是HttpServletRequest接口的唯一實現。 此類的實際實現取決於您的應用程序容器。 例如,在我的應用程序中它的weblogic.servlet.internal.ServletRequestImpl,因為我使用Web Logic。 希望您使用的是具有現成代碼的開源應用服務器。 我發現這個的方法是在我的一個Controller處理程序方法中放置一個中斷,該方法定義了HttpServletRequest並在調試器中查看它的getClass()響應。

暫無
暫無

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

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