2012-05-20 3 views
0

У меня возникла проблема с перехватом и изменением URL-адреса запроса, чтобы связать его с правильным URL-адресом. Я использую рамки рамки и хочу перенаправить пользователя на их правильный субдомен. Для примера. если пользователь принадлежит abc.sitename.com, а запрос отправлен с сайта xyz.sitename.com, он должен быть перенаправлен на abc.sitename.com со всем сообщением о запросе. Для getparameter я сделал это, просто получив URL-адрес запроса и запросив запрос и перенаправляя пользователя из пользовательского класса перехвата до выполнения разрешения для жизненного цикла. Но все параметры post очищаются, поскольку они перенаправляются. Другим решением было направить решение, но это может занять пользователь в контексте, и мне нужно переопределить его как:Перехват и изменение URL-адреса запроса Использование структуры Stripes

resolution = new OnwardResolution<ForwardResolution>(reponseUrl) { 
        @Override 
        public void execute(HttpServletRequest request, 
          HttpServletResponse response) throws Exception { 
         request = ctx.getRequest(); 
         response = ctx.getResponse(); 
         String path = reponseUrl; //getUrl(request.getLocale()); 
         // Set event name as a request attribute 
         String oldEvent = (String) request.getAttribute(StripesConstants.REQ_ATTR_EVENT_NAME); 
         //request.setAttribute(StripesConstants.REQ_ATTR_EVENT_NAME, event); 
         log.info("check: {}", path); 
         // Revert event name to its original value 
         request.setAttribute(StripesConstants.REQ_ATTR_EVENT_NAME, oldEvent); 
         // Figure out if we're inside an include, and use an include instead of a forward 
         RequestDispatcher dispatcher = request.getRequestDispatcher(path); 
         //request.getRequestDispatcher(path).forward(request, response); 
         dispatcher.forward(request, response); 

        } 
       }; 

Но зовут в прикладном контексте пути, в то время как он должен вызвать полный URL. Другое решение. Если я использую разрешение переадресации и задаю параметр includerequest, true выполнит задание, но поместит весь параметр запроса в url, что делает его неприемлемым.

Запрос url должен быть изменен до выполнения разрешения, так как после него это будет бесполезно, я пробовал его. есть ли способ установить URL запроса в HTTPServeletRequest.

Я также пытался перехватить во время ActionBeanResolution, это лучшее место для такой деятельности. Моя основная проблема - параметры POST. Я не могу перенаправить (поскольку они очищаются, или если параметр include включает параметр reuest, они отображаются в URL-адресе). Форвардное разрешение вперед в контексте. Если есть способ переслать его на новый URL, он выполнит эту работу.

Заранее спасибо.

ответ

0

@JB Nizet and @Pointy Спасибо за ваше время и ответы. Я решил решить проблему. @Pointy Я изменяю субдомен пользователя, которому требуется перенаправление, но также я не хочу потерять параметры сообщения в этом запросе. Надеюсь, теперь это имеет смысл.

Вот что я сделал (в шагах):

  • Сначала я подумал, когда мне нужно сделать перенаправление и нужно сохранить пост параметра.
  • Сохраните все данные сообщения в сеансе (временно).
  • Если у меня есть какое-либо значение времени в сеансе, я помещаю его в новый запрос и удаляет значение из сеанса.

Код: Для установки параметров пост в сессии:

resolution = new RedirectResolution(reponseUrl); 
      Iterator<Map.Entry<String, String[]>> requestParamter = ctx.getRequest().getParameterMap().entrySet().iterator(); 
      List<IdName> requestParams = new ArrayList<IdName>(); 
      while(requestParamter.hasNext()){ 
       IdName param = new IdName(); 
       Map.Entry<String, String[]> entry = requestParamter.next(); 
       param.setName(entry.getKey()); 
       param.setParameterValues(entry.getValue()); 
       log.trace("intercept - Adding Key: {} with value: {} to redirect request parameter.", entry.getKey(), entry.toString()); 
       requestParams.add(param); 
      } 
      ctx.setRedirectRequestParameter(requestParams); 

Для получения его обратно:

if(ctx.getRedirectRequestParameter() != null && !ctx.getRedirectRequestParameter().isEmpty()){ 
       //Removes parameter which are already in request from redirect request parameter. 
       Map<String, String[]> additionalParams = new TreeMap<String, String[]>(); 
       Map requestParameterMap = ctx.getRequest().getParameterMap(); 
       ListIterator<IdName> oldRequestParams = ctx.getRedirectRequestParameter().listIterator(); 
       while(oldRequestParams.hasNext()){ 
        IdName oldRequestParam = oldRequestParams.next(); 
        log.trace("Lopping requestparameter key: {} ", oldRequestParam.getName()); 
        if (!requestParameterMap.containsValue(oldRequestParam.getName())) { 
         additionalParams.put(oldRequestParam.getName(), oldRequestParam.getParameterValues()); 
        } 
       } 
       HttpServletRequest newRequest = new MyperksHttpServletRequestWrapper(ctx.getRequest(), additionalParams); 
       ctx.setRequest(newRequest); 
       ctx.setRedirectRequestParameter(null); 
      } 

Я также создал класс-оболочку, которая добавляет новый параметр для запроса, которые создают новую оболочку запроса, которая объединит дополнительные параметры в объект запроса без преждевременно считывая параметры из исходного запроса. Для deatil об этом классе любезно перейдите по ссылке: PrettyFaceRequestWrapper.

2

Невозможно перенаправить использование POST. Конец истории.

Просто убедитесь, что к а пользователя никогда не видит ссылку или форму, указывающую на А.

Перенаправление запросов GET (в случае, если пользователь вводит URL хуг непосредственно в адресной строке), и перенаправлять на какой странице ошибки или на домашней странице для запросов POST, так что никогда не должно произойти в любом случае.

+0

Хорошо, но мы можем отправить запрос с сообщением. Я просто не могу правильно использовать метод RequestDispatcher forward в рамке. Когда я устанавливаю «http: //xyz.sitename.com», он добавляет «/» к нему, создавая «/http:/xyz.sitename.com». вы столкнулись с такой проблемой .. и спасибо за ответ .. –

+0

Переадресация может пересылаться только на ресурс того же приложения, на том же сервере. Это интра-приложение. И это абсолютно прозрачно для браузера, который останется на том же URL-адресе. Это не имеет никакого отношения к перенаправлению. –

+0

Есть ли способ установить URL-адрес запроса в HTTPServletRequest .. я выяснил это. Если это возможно, это устранит проблему. –

Смежные вопросы