servlet httpservlet example ejemplo contenedor java http servlets

java - example - ¿Es posible agregar a los parámetros disponibles de una solicitud(HttpServletRequest)?



servlet http request (6)

¿Por qué no solo almacena variables como atributos de alcance de solicitud en lugar de intentar agregarlos a los parámetros de solicitud?

Quiero interceptar una solicitud en un filtro / servlet y agregarle algunos parámetros. Sin embargo, la solicitud no expone un método ''setParameter'' y el mapa de parámetros cuando se manipula arroja un error que dice que está bloqueado. ¿Hay alguna alternativa que pueda probar?


De lo contrario, puede usar el método setAttribute () que está fuertemente tipado. Por lo tanto, el método getAttribute () se puede usar ...


Normalmente envuelvo la HttpServletRequest original en una nueva CustomHttpServletRequest que actúa como un proxy para la solicitud original y luego transfiero esta nueva CustomHttpServletRequest a la cadena de filtros.

En este CustomHttpServletRequest puede reemplazar los métodos getParameterNames, getParameter, getParameterMap para devolver los parámetros que desee.

Este es un ejemplo del filtro:

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); }


Primero debe recibir la solicitud y leer todos sus parámetros. Luego crea otra solicitud con los parámetros originales + los nuevos y envíala nuevamente.

HttpServletRequest es inmutable y no hay forma de cambiarlo.


Puede ajustar HttpServletRequest en el nuevo objeto HttpServletRequestWrapper y sobrescribir algunos métodos.

El siguiente código es de http://www.ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ .

Para agregar un parámetro en el filtro:

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); } } }


La subclase HttpServletRequestWrapper y anula los métodos getParameter . La descripción de esta clase dice:

Proporciona una implementación conveniente de la interfaz HttpServletRequest que puede ser subclasificada por los desarrolladores que deseen adaptar la solicitud a un servlet.

En el filtro, ajuste la solicitud en una instancia de su subclase.