Перехват и изменение URL-адреса запроса с использованием фреймворка Stripes

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

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. Я не могу перенаправить (поскольку они сбрасываются или если использовать параметр reuest, они видны в URL-адресе). Форвард разрешение вперед в контексте. Если есть способ перенаправить его на новый URL-адрес, он выполнит эту работу.

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


person Kishor Sharma    schedule 20.05.2012    source источник


Ответы (2)


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

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

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

person JB Nizet    schedule 20.05.2012
comment
Хорошо... но мы можем переслать запрос по почте. Я просто не могу правильно использовать метод пересылки RequestDispatcher в полосовой структуре. Когда я устанавливаю http://xyz.sitename.com, он добавляет / к нему, создавая /http:/xyz.sitename.com. сталкивались ли вы с такой проблемой.. и спасибо за ответ.. - person Kishor Sharma; 20.05.2012
comment
Переадресация может пересылаться только на ресурс того же приложения на том же сервере. Это вещь внутри приложения. И это совершенно прозрачно для браузера, который останется на том же URL. Это не имеет ничего общего с редиректом. - person JB Nizet; 20.05.2012
comment
Есть ли способ установить URL-адрес запроса в HTTPServletRequest.. я выяснял это.. если это возможно, это решит проблему.. - person Kishor Sharma; 20.05.2012
comment
@KishorSharma нет, в этом нет никакого смысла. Вы либо перенаправляете, говоря браузеру загрузить новый URL-адрес, либо перенаправляете на сервер, но изменение URL-адреса после того, как запрос начинается на сервере, не имеет смысла. - person Pointy; 17.06.2012

@JB Nizet и @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);
            }

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

person Kishor Sharma    schedule 18.06.2012