一、Servlet简介

Servlet: server applet

概念:运行在服务端的小程序

Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则

将来我们自定义一个类,实现了servlet接口的java程序,称之为Servlet

Servlet是sun公司提供的一门用于开发动态web资源的技术。
  Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
                 1、编写一个Java类,实现servlet接口。
                 2、把开发好的Java类部署到web服务器中。
  
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet

二、Servlet的运行过程

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
  ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
  ②装载并创建该Servlet的一个实例对象。
  ③调用Servlet实例对象的init()方法。
  ④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
  ⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

JavaWeb之Servlet:Cookie 和 Session会话

现实生活中我们会用手机跟对方对话,拿起手机,拨号,然后对面接听,跟着互相通话,最后会话结束。

这个过程也可以用我们的B/S模式来描述:

           打开浏览器—>输入地址->发出请求->服务器收到请求->向浏览器发出响应->..重复.->关闭浏览器

这样的过程我们用 “会话” 来描述,上面就一次会话的例子。

会话管理

上述就是会话的概念。我们在平时上网是否可以看到一些网页有这样的操作:当你是第一次登入这个网站,网站会发出:”欢迎来到本网站”。 然而,当你第二次登入该网站,它就会发出:”欢迎再次回来”。 为什么服务器会知道我们已经登入过该页面呢?没错,就是在与服务器会话的过程中产生了一些数据,而这些数据被保存下来,服务器根据这些数据来判断你是否登陆过该页面,而输出不同欢迎标语。

      Cookie技术会话数据保存在浏览器客户端

      Session技术:会话数据保存在服务器端。

Cookie技术

什么是Cookie技术:

一种会话数据管理技术,该技术把会话数据保存在浏览器客户端。是一种客户端的技术。那么Cookie技术的原理是什么,它是如何工作的呢?

1)首先浏览器向服务器发出请求。

2)服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内。

3)然后把该Cookie对象放在响应头,一起(一并)发送回浏览器。

4)浏览器接收服务器响应后,提出该Cookie保存在浏览器端。

5)当下一次浏览器再次访问那个服务器,就会把这个Cookie放在请求头内一并发给服务器。

6)服务器从请求头提取出该Cookie,判别里面的数据,然后做出相应的动作。 

Session技术

什么是Session技术:

一种会话数据管理技术,该技术把会话数据保存在服务器端。

同样都是会话数据管理技术,为什么我们要发明Session技术呢?

我们先分析一下Cookie的局限性:

        1Cookie数据类型都是String,且容量有限制的。

        2Cookie不适合保存敏感数据

所以,Session技术可以解决这两种情况。

那么Session技术的原理是什么,它又是如何工作的呢?

1)浏览器发出请求到服务器。

2)服务器会根据需求生成Session对象,并且给这个Session对象一个编号,一个编号对应一个Session对象

3)服务器把需要记录的数据封装到这个Session对象里,然后把这个Session对象保存下来。

4)服务器把这个Session对象的编号放到一个Cookie里,随着响应发送给浏览器

5)浏览器接收到这个cookie就会保存下来

6)当下一次浏览器再次请求该服务器服务,就会发送该Cookie

7)服务器得到这个Cookie,取出它的内容,它的内容就是一个Session的编号!!!

8)凭借这个Session编号找到对应的Session对象,然后利用该Session对象把保存的数据取出来!

SessionAPI

1)创建/得到HttpSession对象

      request.getSession()  

     request.getSession(boolean create)  

2HttpSession作为域对象保存会话数据

    void setAttribute(java.lang.String name, java.lang.Object value)  保存数据

     getAttribute(java.lang.String name)     得到数据

     void removeAttribute(java.lang.String name)  清除数据

3session细节:

    java.lang.String getId()  得到session对象的编号

    void setMaxInactiveInterval(int interval)   设置session对象的有效时长

    void invalidate()      销毁session对象

Session细节

1)得到session编号: getId() 

2session对象生命周期:

  2.1 session对象什么创建? 

      执行request.getSession()方法时

  2.2 session对象什么销毁?

      1)默认情况下,session对象在30分钟之后服务器自动销毁。

      2)手动设置session有效时长

      void setMaxInactiveInterval(int interval) -以秒为单位。

3)配置session的有效时长(统一配置)

4)手动销毁 void invalidate()

3getSession方法的使用

      getSession(true) / getSession() : 创建或得到session对象。如果得不到session对象,创建 新的session对象。主要是用于创建session对象的。 

      getSession(false)     :得到session对象。如果得不到session对象,返回null。主要用于判断是否可以得到session对象的。

 

4session编号的cookie过期时间:

      默认情况下,cookie是在浏览器关闭时失效!!!

      修改cookie的有效时长:

      setMaxAge(正整数);

Token

Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位,

为什么要用 Token?

  1. Token 完全由应用管理,所以它可以避开同源策略
  2. Token 可以避免 CSRF 攻击,
  3. Token 可以是无状态的,可以在多个服务间共享

 Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。如果这个 Token 在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。

 使用 Token 和 Refresh Token 的时序图如下:

1)登录

 2)业务请求

3)Token 过期,刷新 Token

 

 

为什么使用JWT?

通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单。

什么是JWT

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。

优点

  1. 简洁(Compact): 可以通过URLPOST参数或者在HTTP header发送,因为数据量小,传输速度也很快
    2.自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库
    3.因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持。
    4.不需要在服务端保存会话信息,特别适用于分布式微服务。

JWT的结构

JWT是由三段信息构成的,将这三段信息文本用.连接一起就构成了JWT字符串。
就像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT包含了三部分:
Header 头部(标题包含了令牌的元数据,并且包含签名和/或加密算法的类型)
Payload 负载 (类似于飞机上承载的物品)
Signature 签名/签证

什么时候你应该用JSON Web Tokens

下列场景中使用JSON Web Token是很有用的:

  • Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
  • Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

JSON Web Token的结构是什么样的

 

JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:

  • Header
  • Payload
  • Signature

Java Web之Servlet的三大作用域对象

 

Request是一次请求

Session是一个会话

Application是多次会话(Tomcat开启到关闭)

Servlet三大域对象的应用 requestsessionapplicationServletContext

ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。

request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐