Параметры запроса строки без учета регистра

Моя цель, чтобы все ниже URI 'с должно работать

https: // Остальные / хуг?Сортировать= имя

https: // Остальные / хуг?Сортировать= имя

https: // Остальные / хуг?фильтр= Имя = значение

https: // Остальные / хуг?Фильтр= Имя = значение

Чтобы добиться этого, я создал собственный фильтр, который переопределяет HttpServletRequest, который передается в FilterChain. Ниже ссылка для этого подхода:

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 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 ()?

 fge07 июн. 2013 г., 10:49
Учитывая проблемы у вас здесь, есть только одно решениеконечно чтобы не испортить вещи: используйте композицию.

Ответы на вопрос(1)

Решение Вопроса

Во-первых, позвольте мне сказать, мой мир: я неЯ думаю, что модификация HttpServletRequestWrapper - это путь. Я даже не уверен, как вы будете использовать его, так как я понимаю этоs Сервер приложений специфичен. Как примечание стороны,Эта статья содержит подробные сведения о том, как использовать HttpServletRequest, чтобы получить параметр запроса без учета регистра без использования собственного.

Но, в духе ответа на ваши вопросы:

Вам нужно переопределить getParameter () и getParameterNames ()? Вы можете, так как это даст вам возможность манипулировать делом. На самом деле, я бы сказал, что самый безопасный способ сделать параметры запроса без учета регистра - переписать ТОЛЬКО эти методы. Сделайте так, чтобы вызов getParameter () выполнял равные без учета регистра имена строк. Не уверен, что вы будете делать с getParameterNames (), возможно, верните все возможные варианты, но это кажется излишним.На какую внутреннюю реализацию это влияет? Я не уверен. HttpServletRequest настолько важен практически для всего, что невозможно сказать, что вы могли бы представить, если ваш код не на 100% тверд. Например, у Spring есть SecurityContextHolderAwareRequestWrapper, значит ли это, что вы только что взломали Spring Security? Не надо говорить без большого тестирования.В каком классе можно увидеть реализацию кода getParameter (), getParameterNames () и getParameterValues ()? HttpServletRequestWrapper - единственная реализация интерфейса HttpServletRequest, согласно JavaDocs. Реальная реализация этого класса зависит от вашего контейнера приложения. Например, в моем приложении это weblogic.servlet.internal.ServletRequestImpl, так как я использую Web Logic. Надеюсь, вы используете сервер приложений с открытым исходным кодом, который имеет готовый код. Я нашел это для того, чтобы поставить разрыв в одном из моих методов-обработчиков Controller, для которых определен HttpServletRequest, и просмотреть его ».s getClass () ответ в отладчике.
 akhi10 июн. 2013 г., 05:49
Эй, CodeChimp, спасибо. Это один из подходов, предложенных вами в статье, где я пишу свой собственный фильтр и передаю http-запрос в spring. При переходе по весеннему коду я обнаружил, что вызывается только getParaNames, и поэтому его переопределение решает мою задачу. однако getParamter () может использоваться в какой-то другой среде, которую я не знаю, так что нене знаю, должно ли оно быть переопределено. Я видел реализацию этих методов в коде сервера приложений, как вы предложили, что в моем случае не совсем понятно.

Ваш ответ на вопрос