Je deviens fou et je ne comprends pas quel est le problème:
J'ai la structure suivante:
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>
Mon contrôleur:
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;
}
}
Je n'ai aucun problème pour accéder à /index.html
http: // localhost: 8080/SpringMVC/index.html fonctionne parfaitement.
cependant, lorsque je navigue vers http: // localhost: 8080/SpringMVC/login.html , j'ai l'erreur 404.
HTTP Status 404 - /SpringMVC/login.jsp
type Status report
message /SpringMVC/login.jsp
description The requested resource (/SpringMVC/login.jsp) is not available.
Je ne veux pas déplacer login.jsp au même niveau que index.jsp, mais pourquoi ai-je ce problème?
HTTP 404 signifie que la ressource est introuvable.
Statut HTTP 404 - /SpringMVC/login.jsp
Il semble que vous envoyiez une requête HTTP /SpringMVC/login.jsp
mais que votre méthode de contrôleur soit liée à .html
; vous devez donc modifier votre requête HTTP en /SpringMVC/login.html
.
En raison du nom (login), votre configuration Spring Security est incorrecte.
Je vais simplement ajouter ceci ici, car cela résout mon problème 404. Il s'est avéré que mon problème était la valeur url-mapping
dans web.xml
. Utilisation de Spring WebMVC version org.springframework:spring-webmvc:4.1.6.RELEASE
J'utilisais ce qui suit (qui n'a pas fonctionné):
<url-pattern>/rest</url-pattern>
J'aurais dû utiliser la valeur suivante (qui fonctionne):
<url-pattern>/rest/*</url-pattern>
ou
<url-pattern>/</url-pattern>
Référence: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html
créez un dossier sous WEB-INF "jsps" pour toutes vos vues et sous "jsps" un dossier "sécurité" pour votre cas. sur ces fichiers. Il est nécessaire pour la sécurité des applications. Pensez à une situation dans laquelle vos JSP donnent des informations personnelles sur votre client et que l'accès doit être accordé/vérifié par votre contrôleur. Si vos fichiers JSP proviennent de WEB-INF, ils sont accessibles avec une demande directement sur eux.
configurez votre résolveur de vue comme ceci:
<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>
ensuite, placez vos JSP de connexion dans "WEB-INF/jsps/security" et renvoyez "security/login" depuis votre loginPage.
Désormais, le résolveur de vues recherche les vues sous "WEB-INF/jsps". Comme votre méthode retourne "security/login", le résolveur de vue attend un répertoire sous jsps appelé "security" et un fichier JSP sous celui-ci, appelé "login.jsp" (suffixe = jsp).
Je soupçonne que ModelAndView mv = new ModelAndView("/security/login");
est où le problème est. Assurez-vous que votre répertoire racine contient un dossier 'security' et qu'il contient un fichier login.jsp. Ou essayez de déplacer le dossier de sécurité dans WebContent
Indiquez le paramètre init contextConfigLocation de votre DispatcherServlet.
<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>
J'utilise Spring MVC avec Eclipse et un système MacOS X et j'ai rencontré une erreur 404 lorsque le contrôleur a renvoyé le nom JSP correct. J'ai plus tard découvert que le fichier jsp problématique ne contenait pas de droit x(execution) sur le système de fichiers. J'ai alors `chmod + x some.jsp 'et le problème est résolu.
En ajoutant ceci et juste ici au cas où quelqu'un d'autre serait confronté au même problème. Mon application fonctionnait bien auparavant, puis j'ai mis à niveau la version Spring et, par la même occasion, la version de sécurité Spring. Lorsque j'ai essayé d'accéder à ma page de connexion html, je faisais face à ce problème. J'avais apporté toutes les modifications de configuration nécessaires en raison du changement de version de Spring-Security de 3 à 4. J'ai mentionné ce lien et cela a été très utile.
Je faisais face à ce problème en raison de la configuration ci-dessous dans mon fichier web-servlet.xml
<mvc:resources mapping="/app/*.html" location="/app/*.html" cache-period="0"/>
<mvc:resources mapping="/app/**/*.html" location="/app/**/*.html" cache-period="0"/>
Cela a fonctionné après avoir modifié les deux valeurs d'emplacement en "/app/"
. Il semble que la version la plus récente de la source corresponde à la chaîne entière ou vérifie si l'emplacement demandé commence par la valeur d'emplacement configurée ci-dessus.
J'ai trouvé le code ci-dessous dans org.springframework.web.servlet.resource.PathResourceResolver:
if (locationPath.equals(resourcePath)) {
return true;
}
locationPath = (locationPath.endsWith("/") || locationPath.isEmpty() ? locationPath : locationPath + "/");
if (!resourcePath.startsWith(locationPath)) {
return false;
}
La seconde si la condition était évaluée à false dans mon cas et donc la réponse HTTP 404
Un autre conseil: si vous faites face à une telle erreur, essayez d'activer le plus haut niveau de journalisation Springframework. Vous pourrez peut-être connaître la raison de l'erreur à partir de là.
Cette réponse est peut-être obsolète pour la question ci-dessus, mais elle aidera les personnes qui commencent tout juste avec le printemps. Je me débattais également avec une erreur 404 WEB-INF/welcome.jsp not found.
Ici, le problème concerne l'importation de ModelAndView
Remplacer
import org.springframework.web.servlet.ModelAndView;
Avec
import org.springframework.web.portlet.ModelAndView;