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")); }
1 Kommentar. Hinterlasse eine Antwort
Very good website you have here but I was wanting to
know if you knew of any discussion boards that
cover the same topics discussed here? I’d really like
to be a part of group where I can get feedback from other knowledgeable individuals that share the same
interest. If you have any recommendations, please let me know.
Kudos!
Feel free to visit my web-site – Homepage