问题标签 [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.
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
类似的请求/andrew
,readersBooks方法将工作三次。先为/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.css
和favicon.ico
. 但是当然,用户仍然没有经过身份验证,spring security 又重定向了两次到/login
.
换句话说,在添加 spring security 之前,控制台输出是:
但现在:
当然我只希望看到
并且只有在授权之后,如果添加了弹簧安全。
看起来控制器优先于资源。即使在网络安全之后!但如果我正确理解克雷格·沃尔斯,它应该正好相反。否则,无法获取资源,具有请求模式/{reader}
。
也许这会有所帮助。
早些时候,当我使用 web.xml(在另一个项目中)时,我在 servlet 映射方面遇到了类似的问题,使用 url 模式/*
:
如果没有这种模式,资源会在没有任何额外信息的情况下正常提取。但是如果你添加它,那么像/style.css
or/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里面的方法requestMappingHandlerMapping
有WebMvcConfigurationSupport
一行
优先级高于ResourceHandlerRegistry
.
因此,事实上,默认情况下资源的优先级非常低。但不应该反过来吗?
但是,从现在开始我可以获取资源,但是任何其他请求将始终返回404响应。即使对于/
or /home
。但是,如果我将 的优先级设置ViewControllerRegistry
为大于或等于ResourceHandlerRegistry
,则/
and/home
请求也可以工作,但不是所有其他的。例如:
如果我在方法readerBooks处理任何请求RequestMappingHandlerMapping
时将优先级设置为更高或等于其他会导致原始问题。有一个例外:如果我提出请求,标头将包含 ,但正文将作为. 对于任何其他请求,响应是with的内容,因为它最初是在优先级更改之前。/style.css
Content-Type: text/css;charset=UTF-8
reading-list.html
reading-list.html
Content-Type: text/html;charset=UTF-8
我在这方面完全是新手。这个问题有简单的解决方案吗?我几乎完全确定,即使有可能以某种方式正确设置优先级并处理请求,就像我现在尝试做的那样,它也只是“治疗症状”。
我已经设置了这样的优先级:
启动日志logging.level.web=DEBUG
:
第一个请求是/style.css
:
第二个要求是/
:
第三个请求是/home
:
第四个要求是/andrew
:
我第二次设置这样的优先级:
除了对第二个和第三个请求的响应之外,什么都没有改变。似乎当一个资源具有最高优先级时,它会阻止其他人处理请求。
第二个要求是/
:
第三个请求是/home
:
我需要显示一些其他日志吗?也许最初没有正确配置某些东西?
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
如果有人可以帮助我了解我做错了什么,或者甚至可能将我重定向到另一个有用的堆栈帖子,那就太好了,谢谢!