<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      前后端分離[轉載] --JAVA框架-前后端分離(跨域和JWT)

      JAVA框架-前后端分離(跨域和JWT)

       

      跨域

      當我們在做前后端分離項目的時候,Tomcat往往并不是將前端頁面和后端程序統一部署的,一般我們會有一個單獨的部署靜態html的服務器,那么此時前端的服務器如果想要訪問后端的服務器時候,瀏覽器默認是會攔截這個操作的,因為瀏覽器有一種叫做同源策略(Same origin policy)的安全機制。

      同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能會受到影響。可以說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。

      同源策略是瀏覽器的行為,是為了保護本地數據不被JavaScript代碼獲取回來的數據污染,瀏覽器會先發送OPTION請求進行預檢查,判斷服務器是否允許跨域,如果允許才發送真正的請求,否則拋出異常。

      那么,我們總結一下什么叫做跨域?

      • 當一個請求url的協議、域名、端口三者之間任意一個與當前頁面url不同即為跨域。

      什么時候回產生跨域問題呢?

      • 瀏覽器在解析執行一個網頁時,如果頁面中的js代碼請求了另一個非同源的資源,則會產生跨越問題,而瀏覽器直接跳轉另一個非同源的地址時不會有跨域問題

      如何解決跨域問題呢?

      既然禁止跨域問題時瀏覽器的行為,那么只需要設置瀏覽器運行解析跨域請求的數據即可,但是這個設置必須放在服務器端,由服務器端來判斷對方是否可信任,在響應頭中添加一個字段,告訴瀏覽器,某個服務器是可信的。

      復制代碼
      public class AServlet extends javax.servlet.http.HttpServlet {
          protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
      
          }
      
          protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
              //設置允許跨域,其中*表示允許所有地址訪問
              response.setHeader("Access-Control-Allow-Origin","*");
              String s = "{\"name\":\"jack\"}";
              response.getWriter().println(s);
          }
      }
      

      還有一些其他的相關設置

      復制代碼
      //指定允許其他域名訪問
      'Access-Control-Allow-Origin:http://XXX.XXX.XXX'//一般用法(*,指定域,動態設置),注意*不允許攜帶認證頭和cookies
      //預檢查間隔時間
      'Access-Control-Max-Age: 1800'
      //允許的請求類型
      'Access-Control-Allow-Methods:GET,POST,PUT,POST'
      //列出必須攜帶的字段
      'Access-Control-Allow-Headers:x-requested-with,content-type'
      

      狀態保持問題和JWT

      在傳統項目中,我們把登錄后的用戶信息一般存放在cookie和session中,但這在前后端分離項目中出現了問題。sessionid是使用cookie存儲在客戶端的,而cookie遵守同源策略,只在同源的請求中有效。雖然我們可以在cookie中指定domain來解決,但是cookie必須針對性的設置作用域,這對于有多個不同域要共享cookie時,可操作性差,難以維護。

      另外在分布式架構中,共享session和cookie也是一大問題,必須引入第三方來完成session的存儲和共享(也可通過中間層做cookie轉發如Nginx,Node.js),這也是傳統單體服務無法支持分布式和集群的問題所在。

      為了解決以上問題,我們需要一種新的狀態保持方法:JWT(json WEB token)

      JWT的工作流程

      回顧,之所以使用session和cookie是因為HTTP的無狀態性質,導致服務器無法識別多次請求是否來自同一個用戶。

      JWT可以對用戶信息進行加密生成一個字符串,下發到客戶端,客戶端在后續請求中攜帶該字符串,服務器解析后取出用戶信息,從而完成用戶身份的識別,如下圖:

      簡而言之,JWT就是一串加密后的字符串,長這個樣子:

      中間由“.”分割成三部分,

      • Header(頭部)
        Header 部分是一個 JSON 對象,描述 JWT 的元數據,例如簽名算法等,像下面這樣:

        復制代碼
        {
          "alg": "HS256",
          "typ": "JWT"
        }
        

        alg屬性表示簽名的算法,默認是 HMAC SHA256;
        typ屬性表示這個令牌(token)的類型統一寫為JWT

      最后使用base64URL算法轉換為字符串;

      • Payload(負載)
        Payload 部分也是一個 JSON 對象,用來存放真正需要傳遞的數據,JWT 規定了7個保留字段,如下:

        復制代碼
          iss (issuer):簽發人
          exp (expiration time):過期時間
          sub (subject):主題
          aud (audience):受眾
          nbf (Not Before):生效時間
          iat (Issued At):簽發時間
          jti (JWT ID):編號
        
      • Signature(簽名)
        部分是對前兩部分的簽名,防止數據篡改。簽名時需要指定一個密鑰(secret)。密鑰只有服務器才知道,不能泄露給用戶。然后使用 Header 里面指定的簽名算法(默認是 HMAC SHA256)

      JWT的優點和缺點?

      優點

      • 滿足REST Full的無狀態要求(為了提高系統的擴展性,REST要求所有信息由請求端來提供,如此才使得JWT成為了分布式,集群構架的首選方式)

      • 在分布式,集群系統,前后端分離中使身份驗證變得非常簡單

      • 可用于其他數據交換

      • 合理的使用可減少數據庫查詢次數

      缺點:

      • 對于同樣的數據JWT整體大小超過cookie,這會增加網絡開銷

      • 服務器每次解析JWT都需要再次執行對應的算法,這將增加系統開銷

      • 在傳統單體服務,和WEBApp形式的前后端分離項目中使用JWT反而不如Session+cookie

      簡單的JWT案例

      首先我們要導入幾個jar包

      復制代碼
      import com.auth0.jwt.JWT;
      import com.auth0.jwt.JWTCreator;
      import com.auth0.jwt.algorithms.Algorithm;
      import com.fasterxml.jackson.databind.util.TokenBuffer;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.util.Date;
      
      @WebServlet(name = "Servlet" ,urlPatterns = "/test")
      public class Servlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              String name = request.getParameter("name");
              String pwd = request.getParameter("pwd");
      
      
              response.setContentType("application/json;charset=utf-8");
      
              if(name.equals("jeason") && pwd.equals("123") ){
                  //生成一個Token,返回給客戶端
                  JWTCreator.Builder builder = JWT.create();
      
                  //指定算法,傳入一個秘鑰
                  Algorithm algorithm = Algorithm.HMAC256("2341234SKDJFALSJFLKAJSDKJ");
                  //支持鏈式調用
                  String Token = builder
                                      .withSubject("test this jwt")//設置主題
                                      .withExpiresAt(new Date(new Date().getTime() + (1000 * 60 * 30)))//設置時間
                                      .withClaim("userID", "No.001")//負載數據(用戶自定義)
                                      .sign(algorithm);
                  System.out.println("Token is:"+ Token);
      
                  //將Token放入響應頭
                  response.setHeader("Token",Token);
                  response.getWriter().println("登陸成功");
              }else {
                  response.getWriter().println("登錄失敗");
              }
      
          }
      }
      
      

      這樣,我們就簡單的實現了,登錄后由服務器給客戶端發送一個標記信息的Token。

      另外,我們還可以寫一個簡單的例子來檢查收到的請求是否包含正確的Token:

      復制代碼
      import com.auth0.jwt.JWT;
      import com.auth0.jwt.JWTVerifier;
      import com.auth0.jwt.algorithms.Algorithm;
      import com.auth0.jwt.exceptions.JWTVerificationException;
      import com.auth0.jwt.interfaces.DecodedJWT;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      @WebServlet(name = "CheckServlet",urlPatterns = "/check")
      public class CheckServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
              //取出Token
              String token = request.getHeader("Token");
              if(token != null){
                  //檢查Token是否有效,主要看是否過期,以及是否被篡改
                  //指定算法,傳入一個秘鑰
                  Algorithm algorithm = Algorithm.HMAC256("2341234SKDJFALSJFLKAJSDKJ");
                  JWTVerifier verifier = JWT.require(algorithm).build();
                  try{
                      verifier.verify(token);
      
                      DecodedJWT decode = JWT.decode(token);
                      String userID = decode.getClaim("userID").asString();
                      System.out.println(userID);
      
                      response.getWriter().println("Token 驗證成功!!");
                  }catch ( JWTVerificationException e ){
                      System.out.println("Token 過期或者被篡改!!");
                      response.getWriter().println("Token 過期或者被篡改!!");
                  }
      
      
      
              }else{
                  System.out.println("NO  token");
              }
          }
      }




      轉載自博客: http://www.rzrgm.cn/JeasonIsCoding/p/13232663.html
      posted @ 2020-10-31 14:32  遙想公瑾  閱讀(215)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲人成绝网站色www| 国产午夜福利视频第三区| ww污污污网站在线看com| 欧美在线观看www| 国产精品无码av天天爽播放器| 日韩av色一区二区三区| 东台市| 亚洲黄色成人网在线观看| 国产首页一区二区不卡| 成年女人免费碰碰视频| 偃师市| 亚洲第一无码专区天堂| 亚洲日韩精品一区二区三区无码| 在线中文字幕国产精品| 国产91麻豆视频免费看| 韩国免费a级毛片久久| 亚洲人妻系列中文字幕| 日韩精品一区二区三区视频| 色综合久久中文综合久久激情| 亚洲跨种族黑人xxxxx| 国产稚嫩高中生呻吟激情在线视频 | 国产视频有码字幕一区二区| 久久香蕉国产线看观看怡红院妓院| 久久国产一区二区三区| 国产av一区二区麻豆熟女| 亚洲色欲色欱WWW在线| 最近2019中文字幕大全第二页| av中文字幕一区人妻| 97在线精品视频免费| 无套后入极品美女少妇| 国偷自产一区二区三区在线视频 | 综合偷自拍亚洲乱中文字幕| 欧美综合自拍亚洲综合图| 18禁精品一区二区三区| 亚洲日本韩国欧美云霸高清| 国产精品中文字幕av| аⅴ天堂中文在线网| 亚洲毛片不卡AV在线播放一区| 国产精品中文av专线| 日本一区二区三本视频在线观看| 国产精品久久久久久久专区|