2010-10-15 11 views
8

Tengo un caso en el que necesito redirigir mi objeto de solicitud HTTP a otros controladores/clases para su posterior procesamiento. El problema es que en algunos controladores, me gustaría obtener un mejor control sobre los parámetros que estoy reenviando a la siguiente clase: modificarlos, editarlos, eliminarlos. Entonces, me gustaría saber si hay una buena práctica/patrón para lograr este control básico en los parámetros de solicitud de HTTP.¿la mejor manera de eliminar un parámetro HttpServletRequest en un controlador/clase?

Respuesta

17

La buena práctica es envolver el objeto de solicitud en otro objeto utilizando un filtro de servlet. Como HttpServletRequest es una interfaz, puede escribir su propia implementación de la misma. Su implementación puede contener la solicitud que recibió y delegar todos y cada uno de sus propios métodos al objeto de solicitud original, pero también puede modificar los valores de devolución como lo considere oportuno. Por lo tanto, sus métodos getParameter() etc. podrían llamar al mismo método en el objeto de solicitud original y modificar el resultado como mejor le parezca antes de devolverlo.

class MyHttpServletRequestWrapper implements HttpServletRequest { 
    private HttpServletRequest originalRequest; 

    public MyHttpServletRequestWrapper(HttpServletRequest originalRequest) { 
     this.originalRequest = originalRequest; 

    public String getAuthType() {return originalRequest.getAuthType();} 
    public String getQueryString() {return originalRequest.getQueryString();} 
    // etc. 

    public Map getParameterMap() { 
     Map params = originalRequest.getParameterMap(); 
     params.remove("parameter-to-remove"); 
     params.put("parameter-to-add", "<a value>"); 
     //etc. 
    } 
} 

Su filtro de servlet:

class MyFilter implements Filter { 
    public void init(FilterConfig config) { 
     // perhaps you might want to initialize something here 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
     HttpServletRequest originalRequest = (HttpServletRequest) request; 
     HttpServletRequest newRequest = new MyHttpServletRequest(originalRequest); 
     chain.doFilter(newRequest, response); 
    } 
} 

También puede subclase javax.servlet.request.HttpServletRequestWrapper, lo que le ahorrará un montón de trabajo.

Consulte este post para más.

+2

Aunque la publicación a la que enlaza contiene más información, debe especificar que esto debe hacerse usando un filtro (si eso es lo que quiere decir). – Vetle

+0

muchas gracias. Usaré los filtros y la clase contenedora para el objeto HttpRequest. –

2

Si lo que busca es un sencillo de una sola línea, esta expresión regular técnica funcionó para mí:

myURL = myURL.replaceAll("[&?]clear=([^&]$|[^&]*)", ""); 

Si lo necesita en Javascript, que es de hecho muy similar - que es agradable!

var myUrl = (""+window.location).replace(/&?clear=([^&]$|[^&]*)/i, ""); 

claro es el nombre del parámetro a ser eliminado.

Cuestiones relacionadas