5

有谁知道在使用Spark micro web 框架时如何覆盖现有的 404 错误页面?

默认错误页面是:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 404 </title>
</head>
<body>
<h2>HTTP ERROR: 404</h2>
<p>Problem accessing /strangepage. Reason:
<pre>    Not Found</pre></p>
<hr /><i><small>Powered by Jetty://</small></i>
</body>
</html>

我想编辑这个自定义错误页面(或者可能将其重定向到另一条路线):

get(new Route("/404") {
   @Override
   public Object handle(Request request, Response response) {
       response.type("text/html");
       return "Error page 404";
   }
});
4

7 回答 7

4

尝试在下面使用此提示

在最后一条路线之后添加这些行,因为 Spark 关心订单

Spark.get("*", (req, res) -> {    
    if(!req.pathInfo().startsWith("/static")){
        res.status(404);
        return TEMPLATE_ENGINE.render(ModelAndView modelAndView);
    }
    return null;
});

所有请求(包括静态请求)与将在此处捕获的所有上层路由都不匹配。因此,您必须使用 IF 语句将奇怪的请求和静态请求分开。您应该在此处将错误 html 页面作为字符串返回。

所有静态请求都由另一个处理程序处理,您必须返回 NULL 以强制 Spark 正常调用另一个处理程序。

于 2015-10-16T20:12:11.397 回答
2

如果您在网络服务器上部署您的应用程序,您可以将错误映射到 spark 路由。

<filter>
    <filter-name>SparkFilter</filter-name>
    <filter-class>spark.servlet.SparkFilter</filter-class>
    <init-param>
        <param-name>applicationClass</param-name>
        <param-value>com.company.YourApplication</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>SparkFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

<error-page>
    <error-code>404</error-code>
    <location>/404</location> <!-- this is your route-->
</error-page>
于 2013-12-14T23:37:51.490 回答
2

这是一个古老的问题,但因为它仍然得到回答。

现在您可以按如下方式处理 404:

notFound("<html><body><h1>Custom 404 handling</h1></body></html>");
于 2018-04-13T18:47:50.260 回答
1

我认为您可以使用 Spark 过滤器。过滤掉不允许的路由。您可以在过滤器中呈现新模板。

这是文档中的一个示例。

before(new Filter() { // matches all routes
    @Override
    public void handle(Request request, Response response) {
        boolean authenticated;
        // ... check if authenticated
        if (!authenticated) {
            halt(401, "You are not welcome here");
        }
    }
 });
于 2014-04-05T05:11:49.150 回答
1

对于那些想要处理所有异常并显示错误消息的人来说,这里有一个声明处理程序的简单方法:

exception(Exception.class, exceptionHandler());

然后是一个简单的实现:

private ExceptionHandler exceptionHandler() {
    return (e, req, res) -> {
        res.status(500);
        res.body("<h1>Exception occurred</h1><div>" + e.getMessage() + "</div>");
    };
}
于 2016-11-30T17:10:05.087 回答
1

在 Spark 2.3 文档中:

get("/throwexception", (request, response) -> {
    throw new NotFoundException();
});

exception(NotFoundException.class, (e, request, response) -> {
    response.status(404);
    response.body("Resource not found");
});

我发现不是“/throwexception”,而是“/*”获取所有未找到的页面。如果您的 url 结构比我正在做的更复杂,这可能不起作用。我无法在我的项目中解决 NotFoundException,所以我认为您可以自己制作异常或抛出内置异常。

于 2015-10-28T20:19:04.573 回答
1

显然,这是 Spark 很长一段时间都无法解决的问题。但我能够想出一个解决方法: https ://github.com/perwendel/spark/issues/197#issuecomment-213952246

基本上是自己启动和配置嵌入式 Jetty,而不是让 Spark 为您做这些。

于 2016-04-24T13:04:37.080 回答