GEDOPLAN
Jakarta EE (Java EE)Webprogrammierung

Redirect JSF-Ajax Request in ServletFilter

Jakarta EE (Java EE)Webprogrammierung

Servlet Filter sind einfache Möglichkeiten den Zugriff auf die eigene Anwendung ein zu schränken und global Prüfungen auf z.B. Benutzer durch zu führen. In einem Fehlerfall ist das Senden eines Fehlerstatus schnell zu der Hand, der den User darüber informiert das es schief gelaufen ist:

@WebFilter(filterName = "MyFilter", urlPatterns = "/pages/*")
public class HMGLDAPungleichPCFirmaFilter
    implements Filter
{

    @Inject
    private Benutzer benutzer;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException
    {

        // Benutzer prüfungen...
        // Bei Fehler/Ungültige Informationen:
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        HttpServletRequest httpRequest = (HttpServletRequest) request;

        httpResponse.sendError(400, "Da stimmt was nicht...");
    }
}

Das klappt wunderbar bis die erste Ajax Anfrage einen solchen Fehler produziert. Zwar wir der Fehlerstatus korrekt an den Browser weiter gegeben, hier müssten wir aber explizit auf einen Ajax Fehler reagieren (z.B. mittels onError-Attribut) und diesen in eine entsprechende Fehlerausgabe umwandeln. Wäre es nicht schöner wenn auch im Falle einer Ajax-Anfrage unsere Fehlermeldung vom Server generriert wird?

Auch das ist möglich. Dazu müssen wir zuerst feststellen ob es sich bei unserer Anfrage um einen Ajax-Request handelt. Hierzu greifen wir auf die Header-Werte des Requests zu und prüfen das Attribut ‘Faces-Request’ auf den Wert ‘partial/ajax’. Sollte dies der Fall sein übermittel wir nicht eine Fehler-Response sondern weisen den browserseitigen JavaScript Code an einen erneuten Request auf eine explizite Fehlerseite zu stellen die hier angezeigt wird.

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException
{

    // Benutzer prüfungen...
    // Bei Fehler/Ungültige Informationen:
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    HttpServletRequest httpRequest = (HttpServletRequest) request;

    if (isAjaxRequest(httpRequest)) {
        String rediect=redirectForAjax(httpRequest, "error.xhtml");
        PrintWriter writer = response.getWriter();
        writer.write(rediect);
        writer.close();
    }
    else {
        httpResponse.sendError(400, "Da stimmt was nicht...");
    }

}

private String redirectForAjax(HttpServletRequest request, String page)
{
    StringBuilder sb = new StringBuilder();
    sb.append("<?xml version='1.0' encoding='UTF-8'?>");
    sb.append("<partial-response><redirect url=\"").append(request.getContextPath()).append(request.getServletPath()).append(page).append("\"/></partial-response>");
    return sb.toString();
}

private boolean isAjaxRequest(HttpServletRequest request)
{
    return "partial/ajax".equals(request.getHeader("Faces-Request"));
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Bitte füllen Sie dieses Feld aus.
Bitte füllen Sie dieses Feld aus.
Bitte gib eine gültige E-Mail-Adresse ein.
Sie müssen den Bedingungen zustimmen, um fortzufahren.

Autor

Diesen Artikel teilen

LinkedIn
Xing

Gibt es noch Fragen?

Fragen beantworten wir sehr gerne! Schreibe uns einfach per Kontaktformular.

Kurse

weitere Blogbeiträge

Work Life Balance. Jobs bei Gedoplan

We are looking for you!

Lust bei GEDOPLAN mitzuarbeiten? Wir suchen immer Verstärkung – egal ob Entwickler, Dozent, Trainerberater oder für unser IT-Marketing! Schau doch einfach mal auf unsere Jobseiten! Wir freuen uns auf Dich!

Work Life Balance. Jobs bei Gedoplan

We are looking for you!

Lust bei GEDOPLAN mitzuarbeiten? Wir suchen immer Verstärkung – egal ob Entwickler, Dozent, Trainerberater oder für unser IT-Marketing! Schau doch einfach mal auf unsere Jobseiten! Wir freuen uns auf Dich!