Spring MVC和Jetty:防止jsessionid在RedirectView中用于重定向到外部站点

Mor*_*oth 5 redirect spring jetty spring-mvc sessionid

在带有Jetty的Spring MVC 2.5中 - 可能有任何servlet容器 - 我希望使用RedirectView通过MagicAndView中视图名称的魔术"redirect:"前缀重定向到外部站点.

不幸的是,RedirectView使用response.encodeRedirectURL(),因此我的(其他想要的)会话ID被附加到URL.将会话ID携带到外部站点不仅存在安全风险,"; jsessionid = gagnbaba"字符串也可能被解释为其他站点上的ContextPath/PathInfo的一部分,从而导致URL错误.

除了实现我自己的ExternalRedirectView之外的任何"弹性"选项......还要破解ViewResolver来解释"externalRedirect:"前缀?(不需要cookie.)

莫里茨

Mor*_*oth 2

现在这是我在上面的评论中计划的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也已经有了自己的 ViewResolver,其中添加了新的 externalRedirect: magic vier 名称前缀的功能,现在显示为:

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 
Run Code Online (Sandbox Code Playgroud)

[...]感谢所有阅读本文并思考它的人。