2017-08-15 54 views
-1

問題。當客戶端URL具有以下參數contactVia=email&interestedIn=petRock&terms=on當呼叫到達servlet時,如何刪除(當前)屬性terms=on刪除客戶端響應網址參數

所以響應URL成爲contactVia=email&interestedIn=petRock

語境。來自調用表單的文本框中的值會自動添加到響應URL,我試圖通過request.removeAttribute();刪除條款並編輯request.getParameterMap();

但是,removeAttribute沒有效果,並且該映射是不可變的。 有什麼建議嗎?

+0

爲什麼-1?我已經通過stackoverflow查看以前的帖子,並沒有找到一個工作的解決方案。他們沒有(我知道)方法附加到請求或響應對象,您可以直接使用從URL中刪除屬性,所以我認爲這個問題是有效的。我知道你可以在發送請求之前用JS做到這一點,但這不是我想要做的。 –

回答

1

這種場景是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() { 
    } 
} 

您可以將此或多或少精心製作的,這取決於你的需求。