问题标签 [servlet-mapping]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
287 浏览

spring - Spring Boot 不提供静态资源

如果控制器中有具有合适路径模板的方法,则 Spring Boot 不会提供静态资源。我目前正在阅读《Spring Boot in Action》一书(2015 年)。第二章有一个示例项目。

该项目具有以下结构:

并使用以下依赖项:

我使用2.4.5弹簧启动版本。

src/main/resources/templates/readingList.html标题:

src/main/java/haven/ReadingListController.java

如果我提出GET类似的请求/andrewreadersBooks方法将工作三次。先为/andrew,然后为/style.css,再为/favicon.ico

如果我更改两条路径,例如这样

或完全删除这两种方法,然后按预期检索资源。(在这里我有点惊讶为什么更改 GET 的路径还不够。我开始收到 style.css 和 favicon.icon 的 405 错误。.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported]

这个答案帮助了我。我将以下行添加到application.properties

为什么默认属性不够用?我看过几个教程,每个人都说只需将静态资源放在其中一个路径中,一切都会好起来的。本书中适用于作者的代码对我来说并不完全相同。也许有些事情发生了变化?2015 年图书。这三个属性实际上是做什么的?

更新

我在本指南中的项目中添加了 spring 安全性。

从这一点开始,分为三组:

  • /并且/home- 随时可供所有人使用
  • /login- 用于身份验证,每个人都可以使用,而且总是如此
  • /{reader}- 对于授权用户

添加了两个类
src/main/java/haven/MvcConfig.java

src/main/java/haven/WebSecurityConfig.java

src/main/resources/templates/home.html

src/main/resources/templates/login.html

当我发出请求时,例如/peter服务器要求进行身份验证,重定向到/login. 但它不是login.html从资源中显示页面,而是将其提供/login给控制器。控制器将页面提供给readingList.html读者名称为“login”的用户。此外,此页面正在尝试拉取资源style.cssfavicon.ico. 但是当然,用户仍然没有经过身份验证,spring security 又重定向了两次到/login.

换句话说,在添加 spring security 之前,控制台输出是:

但现在:

当然我只希望看到

并且只有在授权之后,如果添加了弹簧安全。

看起来控制器优先于资源。即使在网络安全之后!但如果我正确理解克雷格·沃尔斯,它应该正好相反。否则,无法获取资源,具有请求模式/{reader}

也许这会有所帮助。
早些时候,当我使用 web.xml(在另一个项目中)时,我在 servlet 映射方面遇到了类似的问题,使用 url 模式/*

如果没有这种模式,资源会在没有任何额外信息的情况下正常提取。但是如果你添加它,那么像/style.cssor/script.js或的资源请求/image.png会被发送到控制器进行处理,而不是仅仅返回这个资源。然后我以为我不明白什么。我有两种方法,使用类似的东西<url-pattern>/blablabla/*</url-pattern>(当然没有将资源放在“blablabla”文件夹中)或完全匹配任何请求(幸运的是,它们的数量有限)。现在我又看到了,但是在 spring boot 项目中......

更新

正如@PiotrP.Karwasz 建议的那样,我尝试按照此处所示更改优先级。它有后果,但没有解决问题。我创建了一个没有弹簧安全的新项目。现在我的项目结构是这样的:

src/main/java/haven/MvcConfig.java

不再requestMappingHandlerMapping有没有参数的方法。我猜新方法可能会以类似的方式工作。也许我错了。

奇怪的是默认优先级是:

RequestMappingHandlerMapping没有字段order,但在超类AbstractHandlerMapping中有

是2147483647。反正class里面的方法requestMappingHandlerMappingWebMvcConfigurationSupport一行

优先级高于ResourceHandlerRegistry.
因此,事实上,默认情况下资源的优先级非常低。但不应该反过来吗?
但是,从现在开始我可以获取资源,但是任何其他请求将始终返回404响应。即使对于/or /home。但是,如果我将 的优先级设置ViewControllerRegistry为大于或等于ResourceHandlerRegistry,则/and/home请求也可以工作,但不是所有其他的。例如:

如果我在方法readerBooks处理任何请求RequestMappingHandlerMapping时将优先级设置为更高或等于其他会导致原始问题。有一个例外:如果我提出请求,标头将包含 ,但正文将作为. 对于任何其他请求,响应是with的内容,因为它最初是在优先级更改之前。/style.cssContent-Type: text/css;charset=UTF-8reading-list.htmlreading-list.htmlContent-Type: text/html;charset=UTF-8

我在这方面完全是新手。这个问题有简单的解决方案吗?我几乎完全确定,即使有可能以某种方式正确设置优先级并处理请求,就像我现在尝试做的那样,它也只是“治疗症状”。

我已经设置了这样的优先级:

启动日志logging.level.web=DEBUG

第一个请求是/style.css

第二个要求是/

第三个请求是/home

第四个要求是/andrew

我第二次设置这样的优先级:

除了对第二个和第三个请求的响应之外,什么都没有改变。似乎当一个资源具有最高优先级时,它会阻止其他人处理请求。
第二个要求是/

第三个请求是/home

我需要显示一些其他日志吗?也许最初没有正确配置某些东西?

0 投票
1 回答
37 浏览

java - 无法使用 tomcat、servlet 和 spring 加载我的网页

所以我一直在尝试从我创建的基于 spring/servlet 的 java 应用程序中加载我的网页,并且每次都收到 HTTP Status 404 – Not Found 错误但是我很肯定我已经连接了所有的 xml servlet 映射和 Java正确编码。除了加载 404 的前端网页并说The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.没有错误并且我为 xml 设置的路径似乎很好之外,没有弹出后端错误,所以我不确定为什么我的代码在映射路径时遇到问题到实际的jsp文件本身。到目前为止,这是我的项目结构和代码

在此处输入图像描述

web.xml

spring-mvc-demo-servlet.xml

HelloWorldController.java

如果有人可以帮助我了解我做错了什么,或者甚至可能将我重定向到另一个有用的堆栈帖子,那就太好了,谢谢!