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

【讨论】:

感谢您节省我的时间。我的代码是:&lt;!-- Spring Rest inicializacion --&gt; &lt;servlet&gt; &lt;servlet-name&gt;springrest&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;init-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;/WEB-INF/spring/mvcContext.xml&lt;/param-value&gt; &lt;/init-param&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;springrest&lt;/servlet-name&gt; &lt;url-pattern&gt;/rest/*&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; 我实际上花了一个多小时来调试它,它最终得到了解决,我喜欢这些热门问题的一段时间后得到的答案,并且实际上解决了其他一些可能的问题,这真的很有帮助.【参考方案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错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 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

DispatcherServlet 的 Spring MVC 中来自 REST 端点的 404 错误