2013-11-22 3 views
6

404 Seiten funktionieren ordnungsgemäß auf meiner Website für alle URLs, wenn sie nicht in .jsp endet. In diesem Fall bekomme ich die generische jboss 404-Seite statt meiner gestylten Spring 404-Seite.Wie machen Sie ungültige URLs, die auf .jsp enden, mit der Spring 404-Seite?

Ich habe folgendes in meiner web.xml:

<error-page> 
    <error-code>404</error-code> 
    <location>/WEB-INF/error/404.jsp</location> 
</error-page> 

mit voller web.xml Editiert:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <servlet> 
     <servlet-name>mainServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>mainServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      /WEB-INF/spring/root-context.xml, 
      /WEB-INF/spring-security.xml 
     </param-value> 
    </context-param> 

    <welcome-file-list> 
     <welcome-file></welcome-file> 
    </welcome-file-list> 

    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class> 
      org.springframework.web.filter.DelegatingFilterProxy 
     </filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter> 
     <filter-name>encodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
     <init-param> 
      <param-name>forceEncoding</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>encodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <error-page> 
     <error-code>400</error-code> 
     <location>/WEB-INF/error/400.jsp</location> 
    </error-page> 

    <error-page> 
     <error-code>403</error-code> 
     <location>/WEB-INF/error/403.jsp</location> 
    </error-page> 

    <error-page> 
     <error-code>404</error-code> 
     <location>/WEB-INF/error/404.jsp</location> 
    </error-page> 

    <error-page> 
     <error-code>405</error-code> 
     <location>/WEB-INF/error/405.jsp</location> 
    </error-page> 

    <error-page> 
     <exception-type>java.lang.Exception</exception-type> 
     <location>/WEB-INF/error/error.jsp</location> 
    </error-page> 

    <context-param> 
     <param-name>defaultHtmlEscape</param-name> 
     <param-value>true</param-value> 
    </context-param> 
</web-app> 

Antwort

3

Das Problem ist wahrscheinlich, dass Ihre web.xml direkt auf Ihrem jsp zeigt Seiten statt auf einen Federregler zu verweisen, der dann auf die entsprechende Ansicht zeigen kann.

Ich würde gerne Ihre rootContext.xml sehen, um zu sehen, wie Sie Ihren View Resolver eingerichtet haben. Ursache vielleicht Frühling wird verwirrt ... Es gibt nur ein paar Möglichkeiten, die der App Container (JBoss) würde den Fehler zu behandeln, und das ist, wenn entweder die Anfrage nicht entspricht das Spring-Kontext-Servlet oder wenn es keinen Fehler gibt Handler für den generierten Fehlertyp (ist es möglich, dass der Versuch, "asdlfasdf.jsp" zu behandeln, einen anderen Typ von Ausnahme auslöst, der nicht protokolliert wird und dann an JBoss übergeben und als 404 behandelt wird?).

Aber so haben Sie etwas zu vergleichen - Hier ist, wie ich mein ein:

ich eine einzige error.jsp Seite in meinen Ansichten Verzeichnis und die Aussicht Resolver ähnlich der folgenden ein:

Dann habe ich eine Base PageController-Klasse, die ich für alle meine anderen "Benutzer zugewandten" Controller-Klassen erweitern. Diese Klasse hat eine Methode, die die „/ error/404“ Griffe „/ error/403“ -Stil Fehlerseite Muster:

@RequestMapping(value = "/error/{code}") 
public String errorPage(Principal principal, Model model, @PathVariable("code") int code) { 
    model.addAttribute("code", code); 
    return "error"; 
} 

Dann stelle ich die web.xml ähnlich wie bei Ihnen auf, nur um die Umleitung Feder Controller Endpunkte zusammen mit dem entsprechenden Code:

<error-page> 
    <error-code>404</error-code> 
    <location>/error/404</location> 
</error-page> 

<error-page> 
    <error-code>403</error-code> 
    <location>/error/403</location> 
</error-page> 

Nun, ich weiß nicht, ob dies der beste Weg ist, aber es funktioniert wirklich gut für mich. Der Webcontainer leitet diese Fehlertypen an die/error/code-Seite weiter, die gerade eine Controller-Methode aufruft, und dann erzeugt die Controller-Methode die error.jsp-Seite (indem der View-Name "error" zurückgegeben wird).

Da es den Fehlercode in dem Modell setzt, habe ich eine einzige jsp, die mehrere Fehlertypen behandelt, ich habe nur eine Bedingung, die eine andere Benutzermeldung auf dem Fehlercode abhängig macht. Mit anderen Worten: „Seite nicht gefunden :(“ vs „Sie sind nicht diese Seite zu sehen autorisieren!“

Und dann mache ich das in meiner Feder Sicherheits Config sicher ein nicht authentifizierter Benutzer machen kann die Fehlerseite sehen (Sie haben wahrscheinlich diesen Teil schon bekommen, da Sie die jSP-Seiten sehen):

<http pattern="/error/**" security="none" /> 

ich dies kombiniere mit den Annotation Stil Exception-Handler aller Ausnahme meiner Server zu tun Handling (Umgang mit Daten-Anfragen mit einer json Fehlerreaktion und html/view-Anforderungen mit HTML-Fehlerseiten), da Sie einfach eine Controller-Methode mit Anmerkungen versehen können, um Exception oder RuntimeException zu behandeln.Ich würde empfehlen Sie auch diese Methode zu überprüfen, weil es sehr mächtig ist und macht es drastisch einfacher zu protokollieren und Exceptions zu behandeln:

@ExceptionHandler(Exception.class) 
public ModelAndView exceptionHandler(Exception e){ 
    ModelAndView modelAndView = new ModelAndView(); 
    modelAndView.getModelMap().addAttribute("code", HttpStatus.INTERNAL_SERVER_ERROR); 
    modelAndView.setViewName("error"); 

    logger.error("Error handling page request.", e); 
    return modelAndView; 
} 

Dies ist auch eine gute Möglichkeit, dass Sie eine Chance haben, um zu protokollieren Ausnahmen, die durch Ihre Controller gehen, ohne die Ausnahmebehandlung in jeden einzelnen zu übernehmen.

Ich habe zwei Basisklassen erstellt ... eine für meine Seitencontroller und eine für meine Restdatencontroller. Der Basispage-Controller gibt die jsp-Ansicht zurück, die eine nette Fehlerseite für den Benutzer darstellt. Der Basisruhedatencontroller gibt eine json-Nachricht mit der Fehlerinformation im Modell zurück, und dann druckt jsp den vollständigen Stapel oder nur einen allgemeinen Fehler, abhängig davon, ob der Server im Entwicklungs- oder Produktionsmodus läuft.

+0

Vielen Dank, Hinzufügen der Fehler-Controller, anstatt direkt auf die JSP-Seiten verlinkt. – oojoe

Verwandte Themen