JSF/Mojarra ExternalContext.redirect()创建一个HttpSession
我在JSF中使用“无状态”/“瞬态”视图,我注意到调用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
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();
}