当前位置: 首页 > 知识库问答 >
问题:

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

赵修诚
2023-03-14

我的目标是所有下面的URI都应该工作

https://rest/xyz?sort=name

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

https://rest/xyz?过滤器=名称=值

https://rest/xyz?Filter=name=value

为了实现这一点,我创建了自定义过滤器,该过滤器覆盖了传递给过滤器链的HttpServlet请求。以下是此方法的链接:

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
    html" target="_blank">public void init(FilterConfig filterConfig)
            throws ServletException
    {
        // TODO Auto-generated method stub

    }

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

    }

}

在这段代码中,我重写了getParameterValues(字符串名称)方法,并实现了请求参数的大小写不敏感,但不确定是否需要重写任何其他方法。

我的疑虑:

>

  • 我需要重写其他方法,比如getParameter()和getParameterNames()吗?

    这会影响到什么内部实施?

    哪个类可以看到getParameter()、getParameterNames()和getParamegerValues()的代码实现?

  • 共有1个答案

    东方海
    2023-03-14

    首先,让我平静地说:我不认为修改HttpServletRequest包装器是可行的方法。我甚至不知道你会如何使用它,因为我的理解是它是特定于应用服务器的。作为旁注,本文详细介绍了如何使用HttpServletRequest来获取不区分大小写的查询参数,而无需滚动自己的参数。

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

    1. 是否需要重写getParameter()和getParameterNames()?你可以,因为这会让你有能力操纵案件。事实上,我认为使查询参数不区分大小写的最安全的方法是只覆盖那些方法。使getParameter()调用对字符串名称执行不区分大小写的等于。不确定如何使用getParameterNames(),可能会返回所有可能的情况,但这似乎是多余的
    2. 这会影响哪些内部实施?我不确定。HttpServletRequest是几乎所有内容的核心,如果您的代码不是100%可靠的,则无法说明您可以引入什么。例如,Spring有一个SecurityContextHolderAwareRequestWrapper,那么这是否意味着你刚刚打破了Spring Security?没有大量测试就无法判断
    3. 哪个类可以看到getParameter()、getParameterNames()和getParamegerValues()的代码实现?根据JavaDocs,HttpServletRequestWrapper是HttpServletRequest接口的唯一实现。此类的实际实现取决于应用程序容器。例如,在我的应用程序中,它是weblogic.servlet.internal。ServletRequestImpl,因为我使用Web Logic。希望您使用的是一个开源应用程序服务器,它有现成的代码。我发现这一点的方法是在我定义了HttpServletRequest的一个Controller处理程序方法中插入一个中断,并在调试器中查看它的getClass()响应
     类似资料:
    • 需要制作一个密码程序,用户在开始时设置密码,在程序停止前可以输入密码3次。该程序不能区分大小写。 程序按预期打印,但不区分大小写

    • 这可能是一个转储问题,我想在大小写不敏感模式下找到准确的字符串。 所以假设我有字符串“test”,并且我找到了“test”,我应该返回“test”。 我知道我可以通过简单地转换为小写和比较来做到这一点,但我只需要regex解决方案。

    • 问题内容: 我正在使用Flask-SQLAlchemy从用户数据库中查询;但是,虽然 will return doing returns 我想知道是否有一种以不区分大小写的方式查询数据库的方法,以便第二个示例仍然返回 问题答案: 你可以使用过滤器中的或功能来完成此操作: 另一种选择是使用而不是进行搜索:

    • 问题内容: 有谁知道如何使用Postgres 7.4进行不区分大小写的搜索/查询? 我在考虑RegEx,但不确定如何执行此操作,或者不确定是否有函数/标志或可以添加查询的内容? 我正在使用PHP连接并执行查询。 因此,我正在寻找匹配地址信息的方法。 例子: 有什么想法吗? 问题答案: 使用,例如: 文件资料。 或者,您可以使用或,例如:

    • 问题内容: 如何以不区分大小写的方式比较字符串? 例如,“ Go”和“ go”应视为相等。 问题答案: https://golang.org/pkg/strings/#EqualFold是您要寻找的功能。它的用法如下(来自链接文档的示例):

    • 问题内容: 如何以 不区分大小写的 方式在文件中搜索单词? 例如 如果我正在文件中搜索,如果文件包含更新,则搜索应将其选中并将其视为匹配项。 问题答案: 可以在忽略大小写的情况下检查两个字符串是否相等。它甚至可以与Unicode一起使用。有关更多信息,请参见http://golang.org/pkg/strings/#EqualFold。 http://play.golang.org/p/KDdI