2

当人们请求在 csp 文件夹中找不到的 servlet 时,它将显示“404 Not Found”响应

未找到

在此服务器上找不到请求的 URL。

有没有一种方法可以检查 servlet 是否存在,以创建自定义 404 页面?

4

2 回答 2

0

Content-Type 和 Connections 处理程序都可以在提供资源之前检查资源是否存在。

但是连接处理程序HDL_HTTP_ERRORS的状态允许您拦截 HTTP 错误以更改由 G-WAN 生成的默认回复。它在记录的 G-WAN API Handler States中定义。

这很可能是您正在寻找的。

于 2013-02-13T08:03:05.553 回答
0

就像吉尔说的那样。您可以使用 HDL_HTTP_ERRORS 来拦截 HTTP 错误。为了更清楚,这里有一个示例连接处理程序,它将 404 错误替换为自定义错误消息。

#include "gwan.h" 
int init(int argc, char *argv[])
{
   u32 *states = (u32*)get_env(argv, US_HANDLER_STATES);
   *states =  (1 << HDL_HTTP_ERRORS);
   return 0;
}

int main(int argc, char *argv[])
{
   if((long)argv[0] != HDL_HTTP_ERRORS)
      return 255; // Continue if not an error

   // get the HTTP reply code
   int *status = (int*)get_env(argv, HTTP_CODE);
   if(!status || *status != 404)
      return 255; // Continue if not a 404 error

   static char custom_err[] = 
      "<!DOCTYPE HTML><html><head><title>404 Not Found</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><link href=\"/imgs/errors.css\" rel=\"stylesheet\" type=\"text/css\"></head>"
      "<body><h1>Not Found</h1>"
      "<p>This is a custom 404 not found error. What makes you think that this link exist?!!</p></body></html>";

   static char header[] = 
      "HTTP/1.1 %s\r\n"
      "Server:  G-WAN\r\n"
      "Date: %s\r\n"
      "Content-Type:  text/html; charset=UTF-8\r\n"
      "Content-Length: %u\r\n\r\n";

   int len = sizeof(custom_err)-1;
   char *date = (char*)get_env(argv, SERVER_DATE);
   // Set our http reply headers
   build_headers(argv, header,
             http_status(*status),
             date, // current server date
             len); // Reply length

   // Set our reply using our custom error
   set_reply(argv, custom_err, len, *status);

   return 2; // End request then send reply
}

void clean(int argc, char *argv[]) {}

如果您从 servlet 返回 404 错误,请注意。确保你做一个

xbuf_empty(get_reply(argv));

清空回复缓冲区的内容。如果回复缓冲区中有任何内容,它将不会到达 HDL_HTTP_ERRORS。它只会回复回复缓冲区中的任何内容。

于 2013-02-13T18:30:19.343 回答