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

标签 redirect jsf httpsession mojarra

我在 JSF 中使用“无状态”/“ transient ” View ,我注意到调用 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,并且桥接实现不佳。

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

关于redirect - JSF/Mojarra ExternalContext.redirect() 创建一个 HttpSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58537251/

相关文章:

redirect - Struts 2如何显示保存在拦截器中的消息,该消息将重定向到另一个操作?

apache - 使用.htaccess动态重定向到子文件夹,不使用域名隐藏url中的子文件夹

jsf - HttpSession 在页面刷新时过期

jquery - 处理 jquery ajax 重定向

.htaccess - 如何将网站从 https 域移动到 https 域 (301)

JSF播放视频文件

jsf - 使用 org.omnifaces.cdi.ViewScoped 时,我的 javax.servlet.Filter 在单个页面 View 上同时接收 GET 和 POST

javascript - 特立尼达的屏蔽输入字段

javascript - JavaScript 可以读取 HTTP Session 对象吗?

session - JSESSIONID 后缀的用途是什么?