Servlet

2019-01-14  本文已影响0人  哓晓的故事
  1. 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)

  1. Servlet的生命周期
    每个servlet在web容器中只会有一个实例,且只会initdestroy一次
初始化(init)->执行(service)->销亡(destroy)
请求调用.png
每个init的servlet都会获取一个ServletConfig,从中可以获取ServletContextinitParameters
整个Web应用中只有一个ServletContext
  1. 一次http请求的流程
web服务器 -> web容器 -> servlet(ServletRequest/ServletResponse) -> business
  1. 每个请求,在web容器都会生成一个线程去处理,而每个线程都需要绑定一个localPort
  2. forward请求分派(不会改变URL,在服务器发生),sendRedirect重定向(会改变URL,在客户端发生)
  3. 上下文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设置自定义的超时时间),在指定时间内会话没有任何请求,会自动消亡

不过有时候浏览器会禁止cookieresponse.encodeURL(/xx.do)或者response.encodeRedirectURL(/xx.do)这时候重新URL最尾部加上;jsessionId=XXXX来传递

  1. 安全 = 认证 + 授权 + 机密性 + 数据完整性

认证:
BASIC 基础认证 -> Base64安全性弱,HTTP规范
DIGEST 摘要认证 -> 非SSL安全性强一点,HTTP/J2EE规范
FORM 表单认证 -> 自定义登录窗口,安全性弱,J2EE规范(启用了cookie或者SSL会话跟踪使用)
CLIENT-CERT 证书认证 -> 公钥(PKC)安全性强,J2EE规范
授权:
机密性/安全性:
使用TCP + SSL = HTTPS在传输层上加上安全通道,保证传输过程中的数据不会被窃听和修改(机密性

  1. 过滤器
    client -> web服务器 -> web容器 -> 过滤器filter -> servlet
    request请求过滤器:
FilterChain 中 doFilter() 是明确调用下一个谁的filter.doFilter(FilterChain)
Filter 中 doFilter(FilterChain) 是进行过滤后调用filterChain.doFilter()
-- 同理
ProxyChain 中 doProxy() 是明确调用下一个谁的proxy.doProxy(ProxyChain)
Proxy 中 doProxy(ProxyChain) 是进行过滤后调用proxyChain.doProxy()
  1. 包装器 Wrapper
    使用装饰器模式ServletRequestWrapperHttpServletRequestWrapperServletResponseWrapperHttpServletResponseWrapper 提供装饰,而满足压缩等功能
上一篇下一篇

猜你喜欢

热点阅读