лучший способ удалить параметр HttpServletRequest в контроллере / классе? - PullRequest
9 голосов
/ 15 октября 2010

У меня есть случай, когда мне нужно перенаправить объект HTTP-запроса на другие контроллеры / классы для дальнейшей обработки. Проблема в том, что в каком-то контроллере я хотел бы получить лучший контроль над параметрами, которые я передаю следующему классу: изменять, редактировать, удалять их. Итак, я хотел бы знать, есть ли хорошая практика / шаблон для достижения этого базового контроля над параметрами HTTP-запроса.

Ответы [ 2 ]

17 голосов
/ 15 октября 2010

Хорошая практика - заключить объект запроса в другой объект, используя фильтр сервлета. Поскольку HttpServletRequest является интерфейсом, вы можете написать свою собственную реализацию. Ваша реализация может хранить полученный вами запрос и делегировать любые и все свои собственные методы исходному объекту запроса, но также может изменять возвращаемые значения по своему усмотрению. Таким образом, ваши методы getParameter () и т. Д. Могут вызывать один и тот же метод для исходного объекта запроса и изменять результат по своему усмотрению, прежде чем возвращать его.

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

Ваш сервлет-фильтр:

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

Вы также можете создать подкласс javax.servlet.request.HttpServletRequestWrapper, который сэкономит вам кучу работы.

Подробнее см. . .

2 голосов
/ 23 июля 2014

Если вам нужен простой однострочный, этот метод regex сработал для меня:

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

Если вам это нужно в Javascript, он действительно очень похож -nice!

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

clear - имя удаляемого параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...