Servlet

作者: 哓晓的故事 | 来源:发表于2019-01-14 14:47 被阅读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请求过滤器:
    • 认证/授权
    • 追加/修改请求流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()
    
    1. 包装器 Wrapper
      使用装饰器模式ServletRequestWrapperHttpServletRequestWrapperServletResponseWrapperHttpServletResponseWrapper 提供装饰,而满足压缩等功能

    相关文章

      网友评论

          本文标题:Servlet

          本文链接:https://www.haomeiwen.com/subject/qpoddqtx.html