允许通过GET请求访问默认控制器映射

时间:2017-02-02 15:12:09

标签: spring-mvc spring-boot error-handling

我有一个Spring Boot网站(使用freemarker)项目,默认为" / error"已配置路径,它提供我的自定义错误页面(403.ftl,404.ftl等)。

例如,我尝试访问一个不存在的映射,例如// hostname / banana我得到了一个404响应,并显示了我的错误页面,如预期的那样。

但是,我希望能够直接在普通的GET请求中查看这些页面,例如; // hostname / error / 404并使用200状态代码正常查看页面。这是否可能而不必通过新控制器复制所有行为?

1 个答案:

答案 0 :(得分:0)

我最终做的是使用 jsp 而不是 freemarker ,我使用默认的错误页面位置来定义我自己的模板并让DefaultErrorViewResolver渲染它们。

application.properties 配置:

...
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
...

然后我在WEB-INF/views/error/的默认位置定义了我的自定义.jsp错误页面(在那里我有; 403.jsp,404.jsp,4xx.jsp,500.jsp,502。 jsp,504.jsp,5xx.jsp )。

然后我有一个基本的控制器:

@Controller
public class ShowErrorPageController {

    ...

    @Autowired
    private DefaultErrorViewResolver errorViewResolver;

    ...

    @RequestMapping(path = "/{httpStatus}", method = RequestMethod.GET)
    public ModelAndView renderErrorCode(@PathVariable Integer httpStatus, HttpServletRequest request, ModelAndView modelAndView) throws ServletException{

            ... (error handling, etc. etc.)

            HttpStatus status = HttpStatus.valueOf(httpStatus);
            Map<String, Object> model = Collections.unmodifiableMap(addErrorAttributes(request));

            modelAndView = errorViewResolver.resolveErrorView(request, status, model);

            ...

        return modelAndView;
    }

然后你可以简单地访问应用程序并请求任何错误页面(例如:http://hostname/403),它将以HTTP 200响应。这是我需要的,因为我需要通过代理渲染这些页面并且没有& #39; t想要生成任何HTTP错误代码。