このようなシナリオは、javax.servlet.http.HttpServletRequestWrapperが存在する理由の1つです。サブクラス化してその動作を上書きすることができます。
@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() {
}
}
あなたは、あなたのニーズに応じて、この多かれ少なかれ精巧加えることができます。
javax.servlet.Filterはこれを行うには良い場所です。
なぜ-1ですか?私はstackoverflow以前の投稿を見て、実際の解決策を見つけることができていない。彼らはURLから属性を削除するために直接使用できるリクエストまたはレスポンスオブジェクトにアタッチされているメソッドがないので、その質問は有効であると思います。あなたがリクエストを送る前にJSでこれを行うことができますが、これは私がこの場合にしたいことではありません。 –