2017-08-15 9 views
-1

質問。次のパラメータを持つクライアントURLを持つ場合contactVia=email&interestedIn=petRock&terms=onコールがサーブレットに到達すると、(現在の)属性terms=onをどのように削除できますか?クライアントレスポンスURLパラメータを削除する

だから、応答URLはcontactVia=email&interestedIn=petRock

コンテキストになります。呼び出しフォームのテキストボックスの値は自動的に応答URLに追加されます。私はrequest.removeAttribute();と編集request.getParameterMap();で条件を削除しようとしました。

しかし、removeAttributeは効果がなく、マップは不変です。 提案がありますか?

+0

なぜ-1ですか?私はstackoverflow以前の投稿を見て、実際の解決策を見つけることができていない。彼らはURLから属性を削除するために直接使用できるリクエストまたはレスポンスオブジェクトにアタッチされているメソッドがないので、その質問は有効であると思います。あなたがリクエストを送る前にJSでこれを行うことができますが、これは私がこの場合にしたいことではありません。 –

答えて

1

このようなシナリオは、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はこれを行うには良い場所です。

関連する問題