Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF/Mojarra ExternalContext.redirect()创建一个HttpSession_Redirect_Jsf_Httpsession_Mojarra - Fatal编程技术网

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

JSF/Mojarra ExternalContext.redirect()创建一个HttpSession,redirect,jsf,httpsession,mojarra,Redirect,Jsf,Httpsession,Mojarra,我在JSF中使用“无状态”/“瞬态”视图,我注意到调用ExternalContext.redirect()会创建一个新会话 因此,我深入研究了Mojarra(2.2.15)代码: /->com.sun.faces.context.ExternalContextImpl:653 公共void重定向(字符串requestURI)引发IOException{ FacesContext ctx=FacesContext.getCurrentInstance(); doLastPhaseActions(c

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

因此,我深入研究了Mojarra(2.2.15)代码:

/->com.sun.faces.context.ExternalContextImpl:653
公共void重定向(字符串requestURI)引发IOException{
FacesContext ctx=FacesContext.getCurrentInstance();
doLastPhaseActions(ctx,真值);
if(ctx.getPartialViewContext().isPartialRequest()){
HttpSession的if(getSession(true)instanceof&&
ctx.getResponseComplete()){
抛出新的非法状态异常();
}
部分响应编写器;
ResponseWriter=ctx.getResponseWriter();
if(PartialResponseWriter的写入程序实例){
pwriter=(PartialResponseWriter)编写器;
}否则{
pwriter=ctx.getPartialViewContext().getPartialResponseWriter();
}
setResponseContentType(“文本/xml”);
setResponseCharacterEncoding(“UTF-8”);
addResponseHeader(“缓存控制”、“无缓存”);
//pwriter.WriteStreamable(“\n”);
pwriter.startDocument();
重定向(requestURI);
pwriter.endDocument();
}否则{
((HttpServletResponse)response).sendRedirect(requestURI);
}
ctx.responseComplete();
}
请注意,此方法也与on相同,但on上根本不存在检查

我想知道为什么它们包含HttpSession的
getSession(true)实例,这对我来说似乎毫无意义


有人能解释为什么会有支票吗?

这确实不是正确的行为。它应该只检查
响应
是否是
HttpServletResponse
的实例。在调用其
sendRedirect()
方法之前,它也应该这样做,该方法当前的形式可能会在一个Portlet环境中抛出一个
ClassCastException
,而这个Portlet环境中的桥实现得很差


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

我认为这是在实现“瞬态”功能时删除代码片段的一个遗漏。但我不是专家,也许你可以通过以下途径找到或接近答案。我不能说为什么需要一个会话实例来检查这是否是一个Servlet上下文。可能还有其他扩展性较小的方法来断言这一点。是的,MyFaces通过检查响应是否是
HttpServletResponse
的实例做得更好,但即使它们也没有抛出预期的异常。因此,这只是为了检查环境是Servlet还是Portlet。我创造了这个问题。谢谢:)@MicheleMariotti当我向你指出旧的mojarra github回购协议以便找到提交时,我不知道这是否仍然受到监控。你应该在@Selaron上发布新回购协议的isse谢谢,我在
// -> 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();

}