servlet mapping
Closed this issue · 4 comments
weijie0 commented
可以讲讲servlet这块儿的转发以及兼容实现吗?
我看了servlet的代码太多了,尴尬
wangzihaogithub commented
简单写了下, 要觉得少再说
-
Servlet是一个接受Request实体类, 并填充Response实体类的过程. 整个过程是为了处理一次http交互, 这个过程分为5种类型( 参考DispatcherType ), 注: 一次http交互, 可能会经历多次执行类型;
-
servlet中大部分类型, 都会遵守这样的流程: filterChain(N Filter) -> Servlet(1);
通过ServletRequest#getDispatcherType可以获得当前的执行类型.
3.执行类型逻辑如下
public enum javax.servlet.DispatcherType {
FORWARD (
执行: 根据url或name找到servlet, 并执行 filterChain(N Filter) -> Servlet(1)
触发: 由RequestDispatcher#forward
特性: 可以对request,Response进行任何操作
INCLUDE (
执行: 根据url或name找到servlet, 并执行 filterChain(N Filter) -> Servlet(1)
触发: RequestDispatcher#include
特性: 不能修改Response的header, status code , 重置body. 只能写入body.
REQUEST(
执行: 根据url找到servlet, 并执行 filterChain(N Filter) -> Servlet(1)
触发: 收到客户端的请求后
特性: 可以对request,Response进行任何操作 (正常的流程)
ASYNC(
执行: 返回AsyncContext(本质是个装有tcp长连接的实体类)
触发: ServletRequest#startAsync
特性: 无阻塞并同时释放了当前线程, 不会关闭tcp连接, 并且返回AsyncContext, 用户可以将AsyncContext装在集合中, 在定时任务或者单线程中操作AsyncContext同时批量处理大量的请求), 如果一直不调用AsyncContext#complete, 则客户端阻塞(如果不是异步客户端), 服务端非阻塞.
ERROR(
执行: 根据Response的status code 或 Exception 或 url找到servlet, 不执行Filter-> 执行Servlet(1)
触发: ErrorPageManager#handleErrorPage
特性: 当的filter或者servlet都没有捕获异常, 那么会转发到错误页servlet去构造时错误页面的响应
备注: 当进入DispatcherType 执行流程后, 会被容器的try,catch代码包裹.
}
weijie0 commented
感谢作者说明👍
weijie0 commented
com.github.netty.core.metrics
这个包用到了吗,感觉删了也没报错呢
而且可以用这个代替吗
io.dropwizard.metrics
metrics-core
4.1.14
wangzihaogithub commented
这个包在master分支上已经删了了, 目前没用到这个包。
当初是有做监控的计划, 但后期没空做,就把这个包删了。
…------------------ 原始邮件 ------------------
发件人: "wangzihaogithub/spring-boot-protocol" <notifications@github.com>;
发送时间: 2020年11月4日(星期三) 下午5:27
收件人: "wangzihaogithub/spring-boot-protocol"<spring-boot-protocol@noreply.github.com>;
抄送: "王子豪"<842156727@qq.com>;"Comment"<comment@noreply.github.com>;
主题: Re: [wangzihaogithub/spring-boot-protocol] servlet mapping (#6)
com.github.netty.core.metrics
这个包用到了吗,感觉删了也没报错呢
而且可以用这个代替吗
io.dropwizard.metrics
metrics-core
4.1.14
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or unsubscribe.