代码之家  ›  专栏  ›  技术社区  ›  Vivek Kodira nehamishra25

是否可以添加到请求的可用参数(HttpServletRequest)

  •  9
  • Vivek Kodira nehamishra25  · 技术社区  · 16 年前

    我想截获过滤器/servlet中的请求,并向其中添加一些参数。但是,请求不会公开“setParameter”方法,并且在处理时参数映射会抛出一个表示已锁定的错误。有没有别的办法我可以试试?

    6 回复  |  直到 16 年前
        1
  •  13
  •   Bruno De Fraine    16 年前

    子类 HttpServletRequestWrapper 并覆盖 getParameter

        2
  •  6
  •   Panagiotis Korros    16 年前

    我通常将原始HttpServletRequest包装成一个新的CustomHttpServletRequest,作为原始请求的代理,然后将这个新的CustomHttpServletRequest传递给过滤器链。

    这是过滤器的一个示例:

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletRequest customRequest = new CustomHttpServletRequest(httpRequest);
        customRequest.addParameter(xxx, "xxx");
        chain.doFilter(customRequest, response);
    }
    
        3
  •  1
  •   m_pGladiator    16 年前

    然后用原始参数+新参数构造另一个请求并再次发送。

    HttpServletRequest是不可变的,无法更改它。

        4
  •  1
  •   kolobok    9 年前

    您可以将HttpServletRequest包装到新的HttpServletRequestWrapper对象中,并覆盖一些方法。

    http://www.ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ .

    要在筛选器中添加参数,请执行以下操作:

    public class MyFilter implements Filter {
    ...
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if (request instanceof HttpServletRequest) {
            HttpServletRequest httprequest = (HttpServletRequest) request;
            Map<String, String[]> extraParams = new HashMap<String, String[]>();
            extraParams.put("myparamname", String[] { "myparamvalue" });
            request = new WrappedRequestWithParameter(httprequest, extraParams);
        }
        chain.doFilter(request, response);
    }
    ...
    
    class WrappedRequestWithParameter extends HttpServletRequestWrapper {
        private final Map<String, String[]> modifiableParameters;
        private Map<String, String[]> allParameters = null;
    
        public WrappedRequestWithParameter(final HttpServletRequest request, final Map<String, String[]> additionalParams) {
            super(request);
            modifiableParameters = new TreeMap<String, String[]>();
            modifiableParameters.putAll(additionalParams);
        }
    
        @Override
        public String getParameter(final String name) {
            String[] strings = getParameterMap().get(name);
            if (strings != null) {
                return strings[0];
            }
            return super.getParameter(name);
        }
    
        @Override
        public Map<String, String[]> getParameterMap() {
            if (allParameters == null) {
                allParameters = new TreeMap<String, String[]>();
                allParameters.putAll(super.getParameterMap());
                allParameters.putAll(modifiableParameters);
            }
            // Return an unmodifiable collection because we need to uphold the interface contract.
            return Collections.unmodifiableMap(allParameters);
        }
    
        @Override
        public Enumeration<String> getParameterNames() {
            return Collections.enumeration(getParameterMap().keySet());
        }
    
        @Override
        public String[] getParameterValues(final String name) {
            return getParameterMap().get(name);
        }
    }
    }
    
        5
  •  0
  •   bpapa    16 年前

    为什么不将变量存储为请求范围属性,而不是尝试将它们附加到请求参数中?

        6
  •  -1
  •   Manuel EVENO Manuel EVENO    16 年前

    否则,可以使用强类型的setAttribute()方法。因此,可以使用getAttribute()方法。。。