Spring MVC 404错误[重复]
Posted
技术标签:
【中文标题】Spring MVC 404错误[重复]【英文标题】:Spring MVC 404 error [duplicate] 【发布时间】:2011-08-16 19:12:04 【问题描述】:我快疯了,无法理解问题所在:
我有以下结构:
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>
我的控制器:
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;
导航到 /index.html 没有问题
http://localhost:8080/SpringMVC/index.html 完美运行。
但是当我导航到 http://localhost:8080/SpringMVC/login.html 我有 404 错误。
HTTP Status 404 - /SpringMVC/login.jsp
type Status report
message /SpringMVC/login.jsp
description The requested resource (/SpringMVC/login.jsp) is not available.
我不想将 login.jsp 移动到与 index.jsp 相同的级别,但是为什么会出现这个问题?
【问题讨论】:
将您的 login.jsp 与 index.jsp 并行或正确配置您的视图解析器 我不想将它移动到与 index.jsp 相同的级别。你能帮我正确配置我的解析器吗?我认为那里没有任何问题。 尝试返回security/login
而不是/security/login
我试过了,结果一样。
为什么你的 JSP 在WebContent
之外?
【参考方案1】:
对于上述问题,这个答案可能已经过时,但它会帮助其他刚开始使用 spring 的人。 我也在为 404 WEB-INF/welcome.jsp page not found 错误而苦苦挣扎。
这里的问题在于 ModelAndView 导入
替换
import org.springframework.web.servlet.ModelAndView;
有
import org.springframework.web.portlet.ModelAndView;
【讨论】:
【参考方案2】:在这里添加这个ans,以防其他人面临同样的问题。 我的应用程序之前运行良好,然后我升级了 Spring 版本,在此过程中还升级了 spring-security 版本。当我尝试访问我的登录 html 页面时,我遇到了这个问题。由于 spring-security 版本从 3 到 4 的更改,我已经进行了所有必要的配置更改。我参考了this link,它非常有帮助。
由于我的 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"/>
在我将两个位置值都修改为"/app/"
后,它起作用了。似乎较新版本的 spring 匹配整个字符串或检查请求的位置是否以上面配置的位置值开头。
我在 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;
在我的情况下,第二个 if 条件评估为 false,因此是 404 HTTP 响应
另一个提示,如果您遇到此类错误,请尝试启用***别的 springframework 日志记录。您可能会从那里知道错误原因。
【讨论】:
【参考方案3】:我将在此处添加此内容,因为它解决了我的 404 问题。原来我的问题是web.xml
中的url-mapping
值。使用 Spring WebMVC 版本org.springframework:spring-webmvc:4.1.6.RELEASE
我正在使用以下内容(不起作用):
<url-pattern>/rest</url-pattern>
我应该一直使用以下值(有效):
<url-pattern>/rest/*</url-pattern>
或
<url-pattern>/</url-pattern>
参考:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html
【讨论】:
感谢您节省我的时间。我的代码是:<!-- Spring Rest inicializacion --> <servlet> <servlet-name>springrest</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/mvcContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springrest</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping>
我实际上花了一个多小时来调试它,它最终得到了解决,我喜欢这些热门问题的一段时间后得到的答案,并且实际上解决了其他一些可能的问题,这真的很有帮助.【参考方案4】:
我在 Eclipse 和 MacOS X 系统中使用 Spring MVC,当控制器返回正确的 jsp 名称时遇到 404 错误。后来我发现有问题的 jsp 文件在文件系统上没有 x(execution) 权限。然后我 `chmod +x some.jsp' 问题就解决了。
【讨论】:
【参考方案5】:在 WEB-INF“jsps”下为您的所有视图创建一个文件夹,并在“jsps”下为您的案例创建一个“security”文件夹。 注意:将 JSP 文件移动到 WEB-INF 中,您可以防止直接访问这些文件。它是应用程序安全所必需的。考虑一种情况,您的 JSP 提供有关您的客户的个人信息,并且必须由您的控制器授予/检查访问权限。如果您的 JSP 存在于 WEB-INF 之外,则可以通过直接对它们发出请求来访问它们。
像这样配置您的视图解析器:
<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>
接下来,将您的登录 JSP 放入“WEB-INF/jsps/security” 并从您的登录页面返回“安全/登录”。
现在,视图解析器搜索“WEB-INF/jsps”下的视图。因为您的方法返回“security/login”,所以视图解析器需要一个名为“security”的 jsps 目录和一个名为“login.jsp”的 JSP 文件(后缀 = jsp)
【讨论】:
【参考方案6】:我怀疑ModelAndView mv = new ModelAndView("/security/login");
是问题所在。确保您的根目录中有一个目录“security”文件夹,它包含一个 login.jsp 文件。或者尝试移动 WebContent 中的安全文件夹
提供 DispatcherServlet 的 contextConfigLocation 初始化参数
<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>
【讨论】:
【参考方案7】:HTTP 404 表示找不到资源。
这意味着找不到控制器或直接访问的资源(如 CSS 文件) 确实NOT表示未找到控制器中引用的JSP(这将是500 Internal Server Error)HTTP 状态 404 - /SpringMVC/login.jsp
看起来你发送了一个HTTP请求/SpringMVC/login.jsp
但是你的控制器方法绑定到.html
,所以你需要将你的HTTP请求更改为/SpringMVC/login.html
由于名称(登录名)可能您的 Spring Security 配置不正确。
【讨论】:
我明白这一点,但我无法弄清楚问题出在什么地方? @danny.lesnik:查看扩展答案 @Ralph,我看到了,但它被映射为 /index.html,我可以理解我为什么要去 /SpringMVC/login.jsp @danny.lesnik:“但它被映射为 /index.html” - 我不明白? - 浏览器请求哪个 url? -- 从名字上看,Spring Security Interceptor 似乎正在重定向它。 -- 请将 Spring Security 配置添加到您的帖子中。 -- 或者我已经提到的,检查 Spring Security Config,它转发到 HTML 而不是 JSP。 @Ralph,我没有任何 Spring 安全配置,只有 2 页。我发布了我拥有的所有代码和配置。以上是关于Spring MVC 404错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章
gradle + spring MVC + spring boot + jsp = 404错误?
Mac intellj idea开发Spring MVC,404网页错误
我如何在 Spring Boot/MVC 中创建错误处理程序(404、500...)
转转转![Spring MVC] - 500/404错误处理-SimpleMappingExceptionResolver