Spring MVC и Jetty: не допускайте использования jsessionid в RedirectView при перенаправлении на внешний сайт - PullRequest
5 голосов
/ 26 мая 2010

В Spring MVC 2.5 с Jetty - возможно, с любым контейнером сервлета - я хочу перенаправить на внешний сайт с помощью RedirectView с помощью волшебного префикса «redirect:» для имени представления в ModelAndView.

К сожалению, RedirectView использует response.encodeRedirectURL (), поэтому мой (с другой стороны, требуемый) идентификатор сеанса добавляется к URL-адресу.Перенос идентификатора сеанса на внешний сайт не только сопряжен с угрозой безопасности, строка «; jsessionid = gagnbaba» также может интерпретироваться как часть ContextPath / PathInfo на другом сайте, что приводит к неправильному URL-адресу.

Любые "упругие" опции, кроме реализации моего собственного ExternalRedirectView ... и также взломать ViewResolver для интерпретации префикса "externalRedirect:"?(Требовать куки не вариант.)

Мориц

1 Ответ

2 голосов
/ 09 июня 2010

Теперь вот ExternalRedirectView, как и планировалось в моем комментарии выше ... сделал это таким образом.

import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.view.RedirectView;

/** variant of RedirectView, will not add a session id to the url
 */
public class ExternalRedirectView extends RedirectView {
    public ExternalRedirectView(String url, boolean contextRelative) {
        super(url, contextRelative);
    }

    /** copied from @link{RedirectView#sendRedirect} and removed calls to
     * reponse.encodeRedirectURL()
     */
    @Override
    protected void sendRedirect( HttpServletRequest request,
            HttpServletResponse response, String targetUrl,
            boolean http10Compatible ) throws IOException {
        if (http10Compatible) {
            // Always send status code 302.
            response.sendRedirect(targetUrl);
        }
        else {
            // Correct HTTP status code is 303, in particular for POST requests.
            response.setStatus(303);
            response.setHeader("Location", targetUrl);
        }
    }
}

У меня также уже был свой собственный ViewResolver, в который я добавил функциональность для нового префикса externalRedirect: magic vier name, который теперь читает:

class MyViewResolver extends AbstractCachingViewResolver implements BeanFactoryAware {
[...]
    private static final String EXTERNAL_REDIRECT_URL_PREFIX = "externalRedirect:";
[...]
    @Override
    protected View loadView( String viewName, Locale locale ) throws Exception {
        View view;
        if (viewName.startsWith(UrlBasedViewResolver.REDIRECT_URL_PREFIX)) 
        {
            view = new RedirectView(viewName.substring(UrlBasedViewResolver.REDIRECT_URL_PREFIX.length()), true);
        }
        else if (viewName.startsWith(EXTERNAL_REDIRECT_URL_PREFIX)) 
        {
            view = new ExternalRedirectView(viewName.substring(EXTERNAL_REDIRECT_URL_PREFIX.length()), true);
        }
        else 

[...] Спасибо всем, кто прочитал и подумал об этом.

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