wake-up-neo.com

Spring MVC 404-Fehler

Ich werde verrückt und kann nicht verstehen, was das Problem ist:

Ich habe folgende Struktur: 

SpringMVC
  +WebContent
      -web-inf
        -web.xml
        -springMVC-servlet.xml
      -index.jsp
      -security
           -login.jsp 

web.xml

<display-name>springMVC</display-name> 
<servlet> 
  <servlet-name>springMVC</servlet-name> 
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping>
  <servlet-name>springMVC</servlet-name>
  <url-pattern>*.html</url-pattern>
</servlet-mapping> 
  <servlet-mapping>
  <servlet-name>springMVC</servlet-name>
  <url-pattern>*.do</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
  <servlet-name>springMVC</servlet-name> 
  <url-pattern>/index.html</url-pattern>
</servlet-mapping>
<welcome-file-list> 
  <welcome-file>index.html</welcome-file> 
</welcome-file-list>

springMVC-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation=" http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context-3.0.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" 
        xmlns:mvc="http://www.springframework.org/schema/mvc"  
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:p="http://www.springframework.org/schema/p" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://www.springframework.org/schema/beans"> 

    <context:annotation-config/> 
    <context:component-scan base-package="com.Vanilla.springMVC"/> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" > 
       <property name="prefix"> 
          <value>/</value> 
       </property> 
       <property name="suffix"> 
       <value>.jsp</value> 
       </property> 
    </bean> 

</beans>

Mein Controller:

package com.Vanilla.springMVC;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.portlet.ModelAndView;

@Controller
public class DefaultController {

    @RequestMapping(value="/index.html", method=RequestMethod.GET)
    public ModelAndView index(){
        ModelAndView mv = new ModelAndView("index");
        return mv;
    }

    @RequestMapping(value="/login.html", method=RequestMethod.GET)
    public ModelAndView loginPage(){
        ModelAndView mv = new ModelAndView("/security/login");
        return mv;
    }
}

Ich habe kein Problem, zu /index.html zu navigieren

http: // localhost: 8080/SpringMVC/index.html funktioniert einwandfrei.

wenn ich jedoch zu http: // localhost: 8080/SpringMVC/login.html navigiere, habe ich den Fehler 404.

HTTP Status 404 - /SpringMVC/login.jsp    
type Status report
message /SpringMVC/login.jsp
description The requested resource (/SpringMVC/login.jsp) is not available.

Ich möchte login.jsp nicht auf der gleichen Ebene wie index.jsp verschieben, aber warum habe ich dieses Problem?

9
danny.lesnik

HTTP 404 bedeutet, dass die Ressource nicht gefunden wurde.

  • Dies bedeutet, dass der Controller oder eine direkt aufgerufene Ressource (wie eine CSS-Datei) nicht gefunden wird
  • NOT bedeutet, dass die in der Steuerung referenzierte JSP nicht gefunden wurde (dies wäre ein 500-Server-Serverfehler).

HTTP-Status 404 - /SpringMVC/login.jsp 

Es sieht so aus, als würden Sie eine HTTP-Anfrage /SpringMVC/login.jsp senden, aber Ihre Controller-Methode ist an .html gebunden. Daher müssen Sie Ihre HTTP-Anfrage in /SpringMVC/login.html ändern.

Aufgrund des Namens (Login) ist Ihre Spring Security-Konfiguration möglicherweise nicht korrekt.

2
Ralph

Ich füge das hier einfach hinzu, weil es meine 404-Ausgabe gelöst hat. Es stellte sich heraus, dass mein Problem der url-mapping-Wert in web.xml war. Spring WebMVC-Version verwenden org.springframework:spring-webmvc:4.1.6.RELEASE

Ich habe folgendes verwendet (was nicht funktioniert hat):

<url-pattern>/rest</url-pattern>

Ich hätte den folgenden Wert verwenden sollen (was funktioniert):

<url-pattern>/rest/*</url-pattern>

oder

<url-pattern>/</url-pattern>

Referenz: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

5
Nick Grealy
  1. erstellen Sie einen Ordner unter WEB-INF "jsps" für alle Ihre Ansichten und unter "jsps" einen "Sicherheitsordner" für Ihren Fall. HINWEIS: Durch das Verschieben der JSP-Dateien in WEB-INF können Sie den direkten Zugriff verhindern in diesen Dateien. Es wird für die Anwendungssicherheit benötigt. Denken Sie an eine Situation, in der Ihre JSPs persönliche Informationen über Ihren Kunden enthalten und der Zugang von Ihrem Controller genehmigt/überprüft werden muss. Wenn Ihre JSPs aus WEB-INF bestehen, können Sie mit einer entsprechenden Anfrage direkt darauf zugreifen. 

  2. konfigurieren Sie Ihren View Resolver folgendermaßen:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
       <property name="prefix" value="/WEB-INF/jsps"/>
       <property name="suffix" value=".jsp"/>
    </bean>

legen Sie anschließend Ihre Login-JSPs unter "WEB-INF/jsps/security" ab und geben Sie "security/login" von Ihrer loginPage zurück. 

Nun sucht der View-Resolver unter "WEB-INF/jsps" nach den Views. Da Ihre Methode "security/login" zurückgibt, erwartet der Ansichtsauflöser ein Verzeichnis unter jsps mit dem Namen "security" und eine JSP-Datei mit dem Namen "login.jsp" (Suffix = jsp).

2
Erhan Bagdemir

Ich vermute, dass ModelAndView mv = new ModelAndView("/security/login"); dort liegt, wo das Problem liegt. Stellen Sie sicher, dass sich im Stammverzeichnis ein Verzeichnis mit dem Namen 'security' befindet, in dem sich eine login.jsp-Datei befindet. Oder versuchen Sie, den Sicherheitsordner innerhalb von WebContent zu verschieben

Geben Sie den init-Parameter contextConfigLocation Ihres DispatcherServlet an

 <servlet>
    <servlet-name>appServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                <init-param>
                        <param-name>contextConfigLocation</param-name>
                        <param-value>/WEB-INF/springMVC-servlet.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>
        </servlet>
0
gouki

Ich verwende Spring MVC mit Eclipse und einem MacOS X-System und habe einen Fehler 404 festgestellt, wenn der Controller den richtigen JSP-Namen zurückgibt. Ich habe später herausgefunden, dass die problematische JSP-Datei kein x(execution) Recht im Dateisystem hat. Ich habe dann `chmod + x some.jsp 'und das Problem ist gelöst.

0
ZJ Lyu

Wenn Sie dies hier hinzufügen, nur für den Fall, dass ein anderer Benutzer das gleiche Problem hat: Meine App funktionierte früher einwandfrei. Danach habe ich die Spring-Version aktualisiert und dabei auch die Spring-Security-Version aktualisiert. Als ich versuchte, auf meine Login-HTML-Seite zuzugreifen, war ich mit diesem Problem konfrontiert. Ich hatte alle notwendigen Konfigurationsänderungen vorgenommen, da die Federsicherheitsversion von 3 auf 4 geändert wurde. Ich erwähnte diesen Link und es war sehr hilfreich.

Dieses Problem trat aufgrund der folgenden Konfiguration in meiner Datei web-servlet.xml auf

<mvc:resources mapping="/app/*.html" location="/app/*.html" cache-period="0"/>
<mvc:resources mapping="/app/**/*.html" location="/app/**/*.html" cache-period="0"/>

Es funktionierte, nachdem ich beide Standortwerte in "/app/" geändert hatte. Es scheint, als würde eine neuere Version von spring entweder der gesamten Saite entsprechen oder prüfen, ob der angeforderte Standort mit dem oben konfigurierten Standortwert beginnt.

Ich habe den folgenden Code in org.springframework.web.servlet.resource.PathResourceResolver gefunden:

if (locationPath.equals(resourcePath)) {
    return true;
}
locationPath = (locationPath.endsWith("/") || locationPath.isEmpty() ? locationPath : locationPath + "/");
if (!resourcePath.startsWith(locationPath)) {
    return false;
}

Die zweite if-Bedingung wurde in meinem Fall als falsch ausgewertet und daher die 404-HTTP-Antwort

Ein weiterer Tipp: Wenn Sie auf einen solchen Fehler stoßen, aktivieren Sie die Protokollierung auf höchstem Niveau. Möglicherweise erfahren Sie von dort aus den Fehlergrund.

0

Diese Antwort mag für die obige Frage veraltet sein, aber sie wird anderen helfen, die gerade mit dem Frühling beginnen. Ich hatte auch Probleme mit dem 404 WEB-INF/welcome.jsp-Fehler, der nicht gefunden wurde.

Hier ist das Problem mit dem Import von ModelAndView

Ersetzen

import org.springframework.web.servlet.ModelAndView; 

Mit

import org.springframework.web.portlet.ModelAndView;
0
user3717858