当人们请求在csp文件夹中找不到的servlet时它将显示"404未找到"响应
未找到
在此服务器上找不到请求的URL。
有没有一种方法可以检查servlet是否存在,以创建自定义404页面?
就像吉尔说的那样。您可以使用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 %srn"
"Server: G-WANrn"
"Date: %srn"
"Content-Type: text/html; charset=UTF-8rn"
"Content-Length: %urnrn";
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。它只会使用回复缓冲区中的任何内容进行回复。
内容类型和连接处理程序都可以在提供资源之前检查资源是否存在。
但是连接处理程序的HDL_HTTP_ERRORS
状态允许您截获HTTP错误,以更改G-WAN生成的默认回复。它在记录的G-WAN API处理程序状态中进行了定义。
这很可能就是你想要的。