java - 不区分大小写的查询字符串请求参数

标签 java spring rest spring-mvc spring-webflow

我的目标是 URI 下面的所有内容都应该有效

https://rest/xyz?排序=名称

https://rest/xyz?排序=名称

https://rest/xyz?过滤器=name=value

https://rest/xyz?过滤器=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 特定的。作为旁注,this article详细介绍了如何使用 HttpServletRequest 获取不区分大小写的查询参数,而无需自己滚动。

但是,本着回答您问题的精神:

  1. 您是否需要覆盖 getParameter() 和 getParameterNames()?你可以,因为它会给你操纵案件的能力。事实上,我认为使查询参数不区分大小写的最安全方法是仅覆盖那些方法。使 getParameter() 调用对字符串名称执行不区分大小写的等号。不确定您将使用 getParameterNames() 做什么,也许会返回所有可能的情况,但这似乎是多余的。
  2. 哪些内部实现受此影响?我不确定。 HttpServletRequest 是几乎所有内容的核心,如果您的代码不是 100% 可靠,则不知道您可以引入什么。例如,Spring 有一个 SecurityContextHolderAwareRequestWrapper,那么这是否意味着您刚刚破坏了 Spring Security?不经过大量测试就无从下手。
  3. 哪个类可以看到getParameter()、getParameterNames()、getParameterValues()的代码实现?根据 JavaDocs,HttpServletRequestWrapper 是 HttpServletRequest 接口(interface)的唯一实现。此类的实际实现取决于您的应用程序容器。例如,在我的应用程序中,它是 weblogic.servlet.internal.ServletRequestImpl,因为我使用 Web Logic。希望您使用的是具有现成可用代码的开源应用程序服务器。我发现它的方法是中断我的 Controller 处理程序方法之一,该方法定义了 HttpServletRequest 并在调试器中查看它的 getClass() 响应。

关于java - 不区分大小写的查询字符串请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16979859/

相关文章:

java - 如何解决InputStream LeftoverDataException : Initialisation of record 0x85 left 18 bytes remaining still to be read

spring ACL - 主体/SID 不是用户,而是另一个实体

java - 集成测试在 gradle 测试中失败,但在 IDE 中通过

javascript - 当我尝试将 JSON 发送到 Spring 时,不支持内容类型 'application/json;charset=UTF-8'

java - 在 REST Assured 中,如何检查响应中是否存在某个字段?

node.js - REST 发布信息未通过 multipart/form-data 收到

java - 业务层是否应该将持久化对象返回给UI层?

java - 每次Windows启动时安排任务的vbs代码是什么?

java - 如何配置 liferay tomcat 服务器以从另一个 liferay tomcat 服务器读取文件?

java - ClassFormatException io.qameta.allure.aspects.StepsAspects : Invalid byte tag in constant pool: 18