JSF / Mojarra ExternalContext.redirect () создает HttpSession - PullRequest
2 голосов
/ 24 октября 2019

Я играю с "без состояния" / "переходными" представлениями в 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, мне это кажется бессмысленным.

Может кто-нибудь объяснить причину такого чека?

1 Ответ

2 голосов
/ 24 октября 2019

Это действительно не правильное поведение. Он должен был просто проверить, является ли response экземпляром HttpServletResponse. Следует также сделать это, прежде чем вызывать его метод sendRedirect(), который в его текущей форме мог бы вызвать ClassCastException в среде портлета с плохо реализованным мостом.

Техническая причина для явных проверок instanceofв javax.servlet.http.* классах это потому, что JSF также доступен для среды портлетов. Там они используют javax.portlet.* API вместо javax.servlet.http.* API. Хорошо известный пример, о котором вы, вероятно, когда-либо слышали, это " Liferay ".

...