如何在Spring RequestMapping中忽略特定的URI模式?

时间:2016-08-17 06:39:53

标签: java spring spring-mvc

我的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存在,它将重定向到实际页面,否则页面不存在消息将显示。

2 个答案:

答案 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可能需要深入研究。