-
Web容器(web container)和Web服务器(web server)的区别
web server:接受客户端的http请求/响应,处理或者转发请求,所有的资源都是静态的(如果react一个文件8个分支,就会生成8个静态html文件,但是在java就还是一个文件)
nginx、apache、squid
web container:是一种架构/框架上的概念,隔离了servlet和通信协议层面
tomcat(运行在apache上)、weblogic、jetty
如果客户端请求动态页面,则是Tomcat服务器响应请求,将解析的JSP等网页代码解析后回传给Apache服务器,再经Apache返回给浏览器端
这是因为jsp是服务器端解释代码的,Tomcat只做动态代码解析,Apache回传解析好的静态代码,Apache+Tomcat这样整合就可以减少Tomcat的服务开销
Tomcat只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行
当客户端需要请求静态资源,只需要Apache服务器响应请求
当客户端需要动态资源,如JSP,需要Tomcat服务容器(Tomcat可以将JSP解析为Servlet)
- Servlet的生命周期
每个servlet在web容器中只会有一个实例,且只会init
和destroy
一次
初始化(init)->执行(service)->销亡(destroy)
请求调用.png
每个init的servlet都会获取一个
ServletConfig
,从中可以获取ServletContext
和initParameters
整个Web应用中只有一个
ServletContext
- 一次http请求的流程
web服务器 -> web容器 -> servlet(ServletRequest/ServletResponse) -> business
- 每个请求,在web容器都会生成一个线程去处理,而每个线程都需要绑定一个localPort
-
forward
请求分派(不会改变URL,在服务器发生),sendRedirect
重定向(会改变URL,在客户端发生) - 上下文
context
,会话session
,请求request
在一个分布式web应用中
context和config是复制在每个节点
session是通过钝化平移来实现的
会话session
:web容器在接收到用户的第一个请求时,会生成一个会话session及唯一的sessionId,后续每次客户端请求都会带上sessionId,容器就能找到对应的session。以上的逻辑都封装在request.getSession()
方法里
通过
cookie
进行传递,Cookie: JSESSIONID=XXXX
,cookie是服务端和客户端交换的一小段数据,用户不需要介入自动交换,一般cookie存活的时间和session一样长久
session-timeout
全局设置会话的超时时间(可以针对每个session设置自定义的超时时间),在指定时间内会话没有任何请求,会自动消亡
不过有时候浏览器会
禁止cookie
,response.encodeURL(/xx.do)
或者response.encodeRedirectURL(/xx.do)
这时候重新URL
在最尾部
加上;jsessionId=XXXX
来传递
安全 = 认证 + 授权 + 机密性 + 数据完整性
认证:
BASIC
基础认证 -> Base64安全性弱,HTTP规范
DIGEST
摘要认证 -> 非SSL安全性强一点,HTTP/J2EE规范
FORM
表单认证 -> 自定义登录窗口,安全性弱,J2EE规范(启用了cookie或者SSL会话跟踪使用)
CLIENT-CERT
证书认证 -> 公钥(PKC)安全性强,J2EE规范
授权:
机密性/安全性:
使用TCP + SSL = HTTPS
在传输层上加上安全通道,保证传输过程中的数据不会被窃听和修改(机密性)
- 过滤器
client -> web服务器 -> web容器 -> 过滤器filter -> servlet
request请求过滤器:
- 认证/授权
- 追加/修改请求流header和body
- 建立审计或者日志
response响应过滤器: - 压缩
- 追加/修改响应流header和body
FilterChain 中 doFilter() 是明确调用下一个谁的filter.doFilter(FilterChain)
Filter 中 doFilter(FilterChain) 是进行过滤后调用filterChain.doFilter()
-- 同理
ProxyChain 中 doProxy() 是明确调用下一个谁的proxy.doProxy(ProxyChain)
Proxy 中 doProxy(ProxyChain) 是进行过滤后调用proxyChain.doProxy()
-
包装器 Wrapper
使用装饰器模式对ServletRequestWrapper
,HttpServletRequestWrapper
,ServletResponseWrapper
,HttpServletResponseWrapper
提供装饰,而满足压缩等功能
网友评论