HttpServlet是一个抽象类,它是为了实现http协议的servlet,所有继承此抽象类的servlet必须实现以下方法中的一种:
doGet; doPost; doPut; doDelete; init 和 destroy;
没有必要去重写service方法,service处理标准的http请求,根据不同的HTTP请求类型分发给以上的doXXX方法进行处理。
RFC 2616 for HTTP 如下定义 TRACE 方法,“此方法用于调用已请求消息的远程、应用层回送(loopback)。请求的接收方是源服务器或第一个代理或接收请求中零(0)Max-Forwards 值的网关。”
TRACE :回显服务器收到的请求,主要用于测试或诊断。
黑客已使用 TRACE 方法来实现对 Web 服务器的安全性攻击。为提供优化的安全性,缺省情况下 WebSEAL 阻塞所有请求的 TRACE 方法到达 WebSEAL 服务器。
您可以通过在 WebSEAL 配置文件中设置两个条目启用 TRACE 方法(禁用阻塞)。
要为本地响应启用 TRACE 方法,请设置以下条目:
[server]
http-method-trace-enabled = yes
要为联结的响应启用 TRACE 方法,请设置以下条目:
[server]
http-method-trace-enabled-remote = yes
缺省的 WebSEAL 配置文件不为这些配置文件条目设置任何值。WebSEAL 的缺省行为(即使当未指定配置文件条目时)将阻塞所有 TRACE 方法。
Response Headers Server:Apache-Coyote/1.1:
tomcat可以分成连接器和容器两个重要的组建,(还有其他很多组件)Apache-Coyote 是Tomcat的连接器。处理http请求的请求行,请求头等信息,创建Request和Response对象,然后调用Servlet容器的invoke方法。
doGet:
^此方法由服务器调用允许一个servlet去处理一个GET请求;
^重写此方法去支持一个GET请求,同时也支持一个HEAD请求,一个HEAD请求是一个得到响应中没有返回任何主体的GET请求,只有请求头字段;
^当载入此方法时,读取请求数据,写入响应头,获取response的writer对象或者输出流对象,最终写入response数据,最好包含内容类型和编码方式;
^servlet容器必须在提交response之前写头文件,因为在HTTP协议中文件头必须在response body体之前提交;
^set方法是安全的,也就是说这个方法没有任何需要用户负责任的副作用;比如:大多数的查询都没有副作用,当你试图改变数据库的数据时,则需要使用其他方法。也就是说GET方法只用于查询某些简单的数据。
get请求缓存流程图:
最后的结果为只有当request中存储的服务器上次告诉它的最后修改时间比服务器端request的修改时间later时,服务器会响应304状态码,浏览器解析该状态码,明白请求并未改变,启用浏览器中缓存的数据。
HTTP501:
服务器不支持请求的功能,无法完成请求
服务器没有支持的方法会返回501状态码(默认的else 返回错误)
else {
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
service(ServletRequest req, ServletResponse res) 方法
内部是查看请求体内是否同时存在HttpServletRequest和HttpServletResponse的类或者它们的派生类
没有抛出non-HTTP request or response 错误 有的话 执行service(HttpServletRequest req, HttpServletResponse resp)方法 该方法内部执行 doXXX方法
http://blog.youkuaiyun.com/snail_cjc/article/details/50778855