這種場景是javax.servlet.http.HttpServletRequestWrapper存在的原因之一。你可以繼承它並覆蓋它的行爲。
一個javax.servlet.Filter是做到這一點的好去處:
@WebFilter(urlPatterns = "/same/as/your/servlet")
public class ParameterFilter implements Filter {
/*
* Treat this as a guide only - it's not tested in any way
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
final HttpServletRequestWrapper wrappedRequest = new HttpServletRequestWrapper((HttpServletRequest)
request) {
@Override
public Map<String, String[]> getParameterMap() {
return request.getParameterMap()
.entrySet()
.stream()
.filter(mapEntry -> !mapEntry.getKey().equals("terms"))
.collect(Collectors.toMap(mapEntry -> mapEntry.getKey(), mapEntry -> mapEntry.getValue()));
}
@Override
public Enumeration<String> getParameterNames() {
return new Vector(request.getParameterMap()
.keySet()
.stream()
.filter(key -> !key.equals("terms"))
.collect(Collectors.toList())).elements();
}
@Override
public String getParameter(String name) {
return name.equals("terms") ? null : super.getParameter(name);
}
@Override
public String[] getParameterValues(String name) {
return name.equals("terms") ? null : super.getParameterValues(name);
}
@Override
public String getQueryString() {
final String[] queryTuples = super.getQueryString().split("&");
return String.join("&",
Arrays.stream(queryTuples)
.filter(pv -> !pv.matches("terms=?"))
.collect(Collectors.toList()).toArray(new String[queryTuples.length]));
}
};
chain.doFilter(wrappedRequest, response);
} else {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
您可以將此或多或少精心製作的,這取決於你的需求。
爲什麼-1?我已經通過stackoverflow查看以前的帖子,並沒有找到一個工作的解決方案。他們沒有(我知道)方法附加到請求或響應對象,您可以直接使用從URL中刪除屬性,所以我認爲這個問題是有效的。我知道你可以在發送請求之前用JS做到這一點,但這不是我想要做的。 –