2009-05-21 14 views

Respuesta

25

No se puede, no se usa la API estándar. HttpServletRequest representan una solicitud recibida por el servidor, por lo que agregar nuevos parámetros no es una opción válida (en lo que respecta a la API).

En principio, podría implementar una subclase de HttpServletRequestWrapper que envuelva la solicitud original, e intercepte los métodos getParameter(), y pase la solicitud envuelta cuando reenvíe.

Si usted va esta ruta, se debe utilizar un Filter para reemplazar su HttpServletRequest con un HttpServletRequestWrapper:

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    if (servletRequest instanceof HttpServletRequest) { 
     HttpServletRequest request = (HttpServletRequest) servletRequest; 
     // Check wether the current request needs to be able to support the body to be read multiple times 
     if (MULTI_READ_HTTP_METHODS.contains(request.getMethod())) { 
      // Override current HttpServletRequest with custom implementation 
      filterChain.doFilter(new HttpServletRequestWrapper(request), servletResponse); 
      return; 
     } 
    } 
    filterChain.doFilter(servletRequest, servletResponse); 
} 
+2

Asumo que tienes esta aplicación desde [aquí] (http://stackoverflow.com/questions/1046721/accessing-the- raw-body-of-a-put-or-post-request). El MULTI_READ_HTTP_METHODS fue un poco confuso, y aunque ahora entiendo para qué sirve, le pido que lo elimine por completo. – Neil

15

Desde su pregunta, creo que lo que estamos tratando de hacer es almacenar algo (un objeto, una cadena ...) para avanzar luego a otro servlet, usando RequestDispatcher(). Para ello no es necesario fijar un parámetro de un atributo, pero utilizando

void setAttribute(String name, Object o); 

y luego

Object getAttribute(String name); 
+5

Los atributos y parámetros no son intercambiables y representan conceptos muy diferentes. – skaffman

+2

@skaffman pero quizás él pueda resolver lo que necesita usando atributos - no debería haber necesidad de agregar un nuevo parámetro a una solicitud en el medio del procesamiento de la solicitud –

+2

la respuesta debe ser editada para reflejar que establecer un atributo puede ser una solución al problema, en lugar de implicar el establecimiento de los atributos establece un parámetro en la solicitud. – Chii

17

Si realmente quiere hacer esto, crear una HttpServletRequestWrapper.

public class AddableHttpRequest extends HttpServletRequestWrapper { 

    private HashMap params = new HashMap(); 

    public AddableingHttpRequest(HttpServletRequest request) { 
      super(request); 
    } 

    public String getParameter(String name) { 
      // if we added one, return that one 
      if (params.get(name) != null) { 
       return params.get(name); 
      } 
      // otherwise return what's in the original request 
      HttpServletRequest req = (HttpServletRequest) super.getRequest(); 
      return validate(name, req.getParameter(name)); 
    } 

    public void addParameter(String name, String value) { 
      params.put(name, value); 
    } 

} 
+3

lo que hace el método de validación? – jomaora

+0

@Jeff, ¿puede decirnos por favor qué valida este método? –

+4

simplemente reemplácelo por - return req.getParameter (name); – Akvel

-4

Lo sentimos, pero por qué no utilizar la construcción siguiente:

request.getParameterMap().put(parameterName, new String[] {parameterValue}); 
+4

Porque obtiene esta excepción: java.lang.IllegalStateException: no se permiten modificaciones en un ParameterMap bloqueado – joaopribs

Cuestiones relacionadas