2010-10-15 4 views
8

Mam przypadek, gdy trzeba przekierować moje żądania HTTP obiektu do innych kontrolerów/klas do dalszego przetwarzania. Problem polega na tym, że w niektórych kontrolerach chciałbym uzyskać lepszą kontrolę nad parametrami, które przesyłam do następnej klasy: modyfikować, edytować, usuwać. Chciałbym więc wiedzieć, czy istnieje dobra praktyka/wzorzec do osiągnięcia tego podstawowego sterowania na parametrach żądania HTTP.najlepszy sposób na usunięcie parametru HttpServletRequest w kontrolerze/klasie?

Odpowiedz

17

Dobrą praktyką jest owinąć obiektu żądania w innym obiekcie przy użyciu filtra serwletów. Ponieważ HttpServletRequest jest interfejsem, możesz napisać własną implementację. Twoja implementacja może wstrzymać otrzymane żądanie i przekazać dowolne i wszystkie własne metody do pierwotnego obiektu żądania, ale także zmodyfikować zwracane wartości zgodnie z potrzebami. Tak więc metody getParameter() itd. Mogą wywoływać tę samą metodę na obiekcie pierwotnego żądania i modyfikować wynik, jak się Państwo spodziewali, przed zwróceniem go.

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. 
    } 
} 

Twój filtr 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); 
    } 
} 

Można również podklasy javax.servlet.request.HttpServletRequestWrapper, który pozwoli Ci zaoszczędzić sporo pracy.

Zobacz ten post więcej.

+2

Mimo że po połączeniu do zawiera więcej informacji, należy określić, że należy to zrobić przy użyciu filtra (jeśli to, co masz na myśli). – Vetle

+0

wielkie dzięki. użyję filtrów i klasy opakowania dla obiektu HttpRequest. –

2

Jeśli po prostej jednej liniowej, to regex technika pracował dla mnie:

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

Jeśli jest to potrzebne w JavaScripcie, to rzeczywiście bardzo podobne - co jest bardzo miłe!

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

jasne to nazwa parametru, który ma zostać usunięty.