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
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.
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.
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
wielkie dzięki. użyję filtrów i klasy opakowania dla obiektu HttpRequest. –