JSF / Mojarra ExternalContext.redirect()创建一个HttpSession

问题描述 投票:2回答:1

我在JSF中使用“无状态” /“瞬态”视图,并且我注意到调用ExternalContext.redirect()会导致创建新的会话。

所以,我研究了Mojarra(2.2.15)代码:

// -> com.sun.faces.context.ExternalContextImpl:653

public void redirect(String requestURI) throws IOException {

    FacesContext ctx = FacesContext.getCurrentInstance();
    doLastPhaseActions(ctx, true);

    if (ctx.getPartialViewContext().isPartialRequest()) {
        if (getSession(true) instanceof HttpSession &&
            ctx.getResponseComplete()) {
            throw new IllegalStateException();
        }
        PartialResponseWriter pwriter;
        ResponseWriter writer = ctx.getResponseWriter();
        if (writer instanceof PartialResponseWriter) {
            pwriter = (PartialResponseWriter) writer;
        } else {
            pwriter = ctx.getPartialViewContext().getPartialResponseWriter();
        }
        setResponseContentType("text/xml");
        setResponseCharacterEncoding("UTF-8");
        addResponseHeader("Cache-Control", "no-cache");
//        pwriter.writePreamble("<?xml version='1.0' encoding='UTF-8'?>\n");
        pwriter.startDocument();
        pwriter.redirect(requestURI);
        pwriter.endDocument();
    } else {
        ((HttpServletResponse) response).sendRedirect(requestURI);
    }
    ctx.responseComplete();

}

请注意,此方法在JSF-2.3 GitHub master上也相同,但是MyFaces上根本不存在该检查

我不知道他们为什么包括getSession(true) instanceof HttpSession,对我来说似乎毫无意义。

任何人都可以解释为什么有支票的原因吗?

redirect jsf httpsession mojarra
1个回答
2
投票

这确实不是正确的行为。它仅应检查response是否为HttpServletResponse的实例。在调用其sendRedirect()方法之前,它也应该这样做,以目前的形式,它可能会在桥实现不佳的Portlet环境中抛出ClassCastException

instanceof类进行显式javax.servlet.http.*检查的技术原因是因为JSF也可用于Portlet环境。他们在那里使用javax.portlet.* API而不是javax.portlet.* API。您可能听说过的一个著名示例是“ javax.servlet.http.*”。

© www.soinside.com 2019 - 2024. All rights reserved.