繁体   English   中英

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

[英]JSF/Mojarra ExternalContext.redirect() creates a HttpSession

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

因此,我深入研究了 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 ,这对我来说似乎毫无意义。

谁能解释为什么有这样一张支票的原因?

这确实不是正确的行为。 它应该简单地检查response是否是HttpServletResponse的实例。 它还应该在调用其sendRedirect()方法之前完成该操作,该方法在当前形式下可能会在 Portlet 环境中引发ClassCastException且桥实现不佳。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM