【问题标题】:Getting an URL which led to error (404) from error-page controller in spring MVC从 Spring MVC 中的错误页面控制器获取导致错误 (404) 的 URL
【发布时间】:2012-12-03 18:02:03
【问题描述】:

说,我有一个 Spring MVC 应用程序,其中包含以下 web.xml 条目:

<error-page>
    <error-code>404</error-code>
    <location>/error/404</location>
</error-page>

以及以下错误页面控制器:

@RequestMapping({"","/"})
@Controller
public class RootController {

    @RequestMapping("error/{errorId}")
    public String errorPage(@PathVariable Integer errorId, Model model) {
        model.addAttribute("errorId",errorId);

        return "root/error.tile";
    }
}

现在用户请求了不存在的 URL /user/show/iamnotauser,它触发了错误页面控制器。如何从 RootController 的 errorPage() 方法中获取这个不存在的 '/user/show/iamnotauser' URL 以将其放入模型并显示在错误页面上?

【问题讨论】:

    标签: java spring spring-mvc error-handling


    【解决方案1】:

    诀窍是请求属性javax.servlet.forward.request_uri,它包含原始请求的uri。

    @RequestMapping("error/{errorId}")
    public ModelAndView resourceNotFound(@PathVariable Integer errorId,
                                                       HttpServletRequest request) {
        //request.getAttribute("javax.servlet.forward.request_uri");
        String origialUri = (String) request.getAttribute(
                                                   RequestDispatcher.FORWARD_REQUEST_URI);
    
        return new ModelAndView("root/error.jspx", "originalUri", origialUri);
    }
    

    如果您仍然使用 Servlet API 2.5,那么常量 RequestDispatcher.FORWARD_REQUEST_URI 不存在,但您可以使用 request.getAttribute("javax.servlet.forward.request_uri")或升级到javax.servlet:javax.servlet-api:3.0.1

    【讨论】:

    • 我们在支持 Servlet API 3.0.x 但使用 web.xml 中规范的 2.5 的服务器上。有了这个设置,上面的方法并没有产生任何有用的东西,但是 request.getAttribute("javax.servlet.error.request_uri"); 成功了
    猜你喜欢
    • 2013-07-09
    • 2014-05-15
    • 2021-06-26
    • 1970-01-01
    • 2021-09-06
    • 2018-11-10
    • 2015-05-06
    • 2019-12-29
    相关资源
    最近更新 更多