【问题标题】:Handle 404 errors in Spring?在 Spring 中处理 404 错误?
【发布时间】:2014-05-25 09:23:18
【问题描述】:

这是我用于将未映射的请求重定向到 404 页面的代码

@RequestMapping("/**")
    public ModelAndView redirect() {

    ModelAndView mv = new ModelAndView();
    mv.setViewName("errorPage");        
        return mv;
    }

上面的代码工作正常,但问题在于 css 和 js 文件等 Web 资源 也进入这个重定向方法,它没有加载任何文件。但是我的调度程序 servlet 中已经有了这段代码,但是 spring 控制器无法识别这个资源映射。

<mvc:resources mapping="/resources/**" location="/WEB-INF/web-resources/" />

所以我在请求映射中尝试了一些 regex 表达式 来否定资源 url 像这样

@RequestMapping("/{^(?!.*resources/**)}**")
    public ModelAndView redirect() {

    ModelAndView mv = new ModelAndView();
    mv.setViewName("errorPage");        
        return mv;
    }

但这并没有按预期工作..因此,如果有人可以提供帮助,那就太好了:)

【问题讨论】:

  • 您使事情变得复杂,只需更改 URL 的处理顺序,/** 必须始终位于最后。你能添加你的配置吗?
  • 是的,即使 /resources/** 使用重定向方法,我也尝试将 /** 作为最后一个
  • 如上所述,请将您的配置添加到问题中。
  • 你的意思是 dipatcher servlet.xml ?
  • web.xml 和你的 servlet.xml...

标签: java spring spring-mvc http-status-code-404


【解决方案1】:

我找到了处理 404(未映射的链接)的解决方案,我使用了 SimpleUrlHandlerMapping 来执行此操作。

我将以下代码添加到我的 dispatcher servlet .xml

<!-- Here all your resources like css,js will be mapped first -->
    <mvc:resources mapping="/resources/**" location="/WEB-INF/web-resources/" /> 
    <context:annotation-config />

<!-- Next is your request mappings from controllers -->
    <context:component-scan base-package="com.xyz" /> 
    <mvc:annotation-driven />

<!-- Atlast your error mapping -->
    <bean id="errorUrlBean" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="mappings">
        <props>
           <prop key="/**">errorController</prop>
         </props>
       </property>
    </bean>

    <bean id="errorController" class="com.xyz.controller.ErrorController">

    </bean>

com.xyz.controller.ErrorController 类

public class ErrorController extends AbstractController  {


    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        // TODO Auto-generated method stub

        ModelAndView mv = new ModelAndView();
        mv.setViewName("errorPage");        
        return mv;
    }

}

我找到了以下原因

@RequestMapping("/**") 使用 RequestHandlerMapping

<mvc:resources mapping="/resources/**" location="/WEB-INF/web-resources/" /> 

使用 SimpleUrlHandlerMapping

RequestHandlerMapping 优先于 SimpleUrlHandlerMapping,所以这就是在我的例子中所有资源请求都进入重定向方法的原因。

所以我只是将@RequestMapping("/**") 请求更改为 SimpleUrlHandlerMapping,方法是在我的 dipatcher servlet 中将其配置为上面给出的 bean,并在最后映射它并解决了问题。

还将以下代码添加到您的 web.xml

  <error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/jsp/error.jsp</location>
  </error-page>

现在这个简单的解决方案可用于重定向所有未映射的请求,即)404 错误到错误页面:)

【讨论】:

    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2019-08-20
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多