当人们请求在 csp 文件夹中找不到的 servlet 时,它将显示“404 Not Found”响应
未找到
在此服务器上找不到请求的 URL。
有没有一种方法可以检查 servlet 是否存在,以创建自定义 404 页面?
当人们请求在 csp 文件夹中找不到的 servlet 时,它将显示“404 Not Found”响应
未找到
在此服务器上找不到请求的 URL。
有没有一种方法可以检查 servlet 是否存在,以创建自定义 404 页面?
Content-Type 和 Connections 处理程序都可以在提供资源之前检查资源是否存在。
但是连接处理程序HDL_HTTP_ERRORS
的状态允许您拦截 HTTP 错误以更改由 G-WAN 生成的默认回复。它在记录的 G-WAN API Handler States中定义。
这很可能是您正在寻找的。
就像吉尔说的那样。您可以使用 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。它只会回复回复缓冲区中的任何内容。