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

我的目标是所有低于URI的文件都应该起作用

https:// rest / xyz? =名称

https:// rest / xyz? =名称

https:// rest / xyz? =名称=值

https:// rest / xyz? =名称=值

为实现此目的,我创建了自定义过滤器,该过滤器将覆盖传递给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是可行的方法。我什至不确定您将如何使用它,因为我的理解是它特定于AppServer。附带说明一下,本文详细介绍了如何使用HttpServletRequest获得不区分大小写的查询参数,而无需自己动手。

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

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

以上是 不区分大小写的查询字符串请求参数 的全部内容, 来源链接: utcz.com/qa/398760.html

回到顶部