我的spring控制器应该接受任何URI类型的get请求,除了以/resources/*
开头的URI,因为这是调用,如果我没有错,则由spring容器完成,以加载视图中的所有静态内容页。
目前的配置是这样的
@RequestMapping(method = RequestMethod.GET, value="/*")
适用于URI /
或/example
的请求,但是如果有人在URI中输入错误,例如。 /example/random/char
它会抛出未找到的异常跟踪页面(404),这非常明显,并导致我value="/**"
@RequestMapping(method = RequestMethod.GET, value="/**")
然后,带有/
或/example
的请求无法在我的视图页面中加载我的静态内容.js, .css or .png
文件。这使我得出结论,spring在内部调用以使用URL模式加载这些文件,例如。 http://localhost:8080/resources/my.jpg
。
注意: - 我故意通过配置tomcat删除了我的项目名称。
更新 好的@dimitrisli评论让我意识到我需要详细说明我的项目。
它基本上是一个URL重定向组件。用户只需通过get请求调用我的应用程序,最后重定向到实际页面。
例如,用户请求我使用URL抛出浏览器,例如http://localhost:8080/sample
。现在,我的应用程序需要拆分URL以获取字符串sample
并在db中搜索针对它的实际URL(因此sample
是一个非常长的URL的别名)。如果URL存在,它将重定向到实际页面,否则页面不存在消息将显示。
答案 0 :(得分:1)
(根据评论更新)
这是您处理404错误的方法。
选项1
web.xml
中的在主页上包含以下内容:
<error-page>
<error-code>404</error-code>
<location>/</location>
</error-page>
或您的自定义错误特定页面:
<error-page>
<error-code>404</error-code>
<location>/my-custom-error-page</location>
</error-page>
选项2
在Controller层定义一个catch-all错误处理程序:
@ExceptionHandler(Exception.class)
public String handleAllExceptions(Exception e) {
log.error("There was an exception thrown! ", e);
return "index";
}
根据您要排除的文件夹的名称(资源)和您的描述(.js / .css / .png)我假设您指的是您的网络项目的静态内容。
您需要在dispatcher servlet xml
中明确定义静态内容,如下所示(遵循项目的静态数据目录约定):
<mvc:resources mapping="/resources/**" location="/resources/" />
<mvc:resources mapping="/css/**" location="/resources/css/" />
<mvc:resources mapping="/images/**" location="/resources/images/" />
<mvc:resources mapping="/js/**" location="/resources/js/" />
<mvc:resources mapping="/fonts/**" location="/resources/fonts/" />
答案 1 :(得分:0)
听起来您需要在项目中添加resource handler。这将允许/resources
文件夹中的文件通过。这是另一个post关于它的一些示例代码供参考。
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
另一种选择可能是实现一个拦截器,在拦截器进入控制器方法之前捕获所有URI。这将允许您添加一些逻辑,以确保在实际到达控制器之前数据库中存在的东西,而不是让单个控制器方法执行所有操作。扩展HandlerInterceptorAdapter可能需要深入研究。