Я играю с "без состояния" / "переходными" представлениями в JSF, и я заметил, что вызов ExternalContext.redirect()
вызывает создание нового сеанса.
Итак, я копался в Мохарре (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
, мне это кажется бессмысленным.
Может кто-нибудь объяснить причину такого чека?