token 的作用與使用


1:首先,先了解一下request和session的區別

request 指在一次請求的全過程中有效,即從http請求到服務器處理結束,返回響應的整個過程,存放在HttpServletRequest對象中。在這個過程中可以使用forward方式跳轉多個jsp。在這些頁面里你都可以使用這個變量。request是用戶請求訪問的當前組件,以及和當前web組件共享同一用戶請求的web組件。如:被請求的jsp頁面和該頁面用<include>指令包含的頁面以及<forward>標記包含的其它jsp頁面; 
Session是用戶全局變量,在整個會話期間都有效。只要頁面不關閉就一直有效(或者直到用戶一直未活動導致會話過期,默認session過期時間為30分鍾,或調用HttpSession的invalidate()方法)。存放在HttpSession對象中 ,同一個http會話中的web組件共享它。

2:token主要有兩個作用:①:防止表單重復提交(防止表單重復提交一般還是使用前后端都限制的方式,比如:在前端點擊提交之后,將按鈕置為灰色,不可再次點擊,然后客戶端和服務端的token各自獨立存儲,客戶端存儲在Cookie或者Form的隱藏域(放在Form隱藏域中的時候,需要每個表單)中,服務端存儲在Session(單機系統中可以使用)或者其他緩存系統(分布式系統可以使用)中。)

//在頁面初始化的時候調用后端代碼像前端返回token

public String initLogin(ModelMap model, HttpSession session, String loginUrl) {

      model.put("extLoginView", clientManager.getExtLoginView());

         // 生成token

      String token = UUID.randomUUID().toString().substring(0,16);

      model.put(LOGIN_TOKEN, token);

    //返回地址與方法的  String loginUrl一致,即初始化的時候調用完方法后,又回到初始化頁面

return loginUrl;

}

 

②:用來作身份驗證

3:防止表單重復提交,主要的理念是,客戶端初始化的時候,一般就是剛剛進入頁面的時候就調用后端代碼,后端代碼生成一個token,返回給客戶端,客戶端儲存token(可以在前台使用Form表單中使用隱藏域來存儲這個Token,也可以使用cookie),然后就將request(請求)中的token與(session)中的token進行比較:

 

//跳轉到添加頁面

    @RequestMapping("/add.do")

    public String add(HttpServletRequestrequest,HttpServletResponse response){

        //生成token

        UUID token=UUID.randomUUID();

        System.out.println("token的值"+token);

        //放入session中

        request.getSession().setAttribute("token",token.toString());

        //放入request作用域中傳到前台

        request.setAttribute("token",token);

        return "add";

    }

    //前台穿過來的token進行比對

    @RequestMapping("/addMessage.do")

    public synchronized String addMessage(HttpServletRequest request){

        //獲取session中的token

        Objecttoken1=request.getSession().getAttribute("token");

        //獲取前台穿過來的token

        String token=request.getParameter("token");

        System.out.println("token1的值"+token1);

        if(token1==null){

            System.out.println("提交出錯");

        }

        else if(!token1.equals(token)){

            System.out.println("提交出錯");

        }else{

            System.out.println("提交成功");

            //移除session 防止重復提交

           request.getSession().removeAttribute("token");

        }     return "";

    }

4:使用基於 Token 的身份驗證方法,在服務端不需要存儲用戶的登錄記錄。大概的流程是這樣的:

 

  • 客戶端使用用戶名跟密碼請求登錄
  • 服務端收到請求,去驗證用戶名與密碼
  • 驗證成功后,服務端會簽發一個 Token,再把這個 Token 發送給客戶端
  • 客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里
  • 客戶端每次向服務端請求資源的時候需要帶着服務端簽發的 Token
  • 服務端收到請求,然后去驗證客戶端請求里面帶着的 Token,如果驗證成功,就向客戶端返回請求的數據

5:

ajax中傳遞token的幾種方式

方法一:放在請求頭中

 

復制代碼
$.ajax({
    type: "POST",
    headers: {
        Accept: "application/json; charset=utf-8",
        userToken: "" + userToken
    },
    url: "/index",
    data: JSON.stringify(mytable.params),
    contentType: "application/json",
    dataType: "json",
    success:function(data){
                    
    },error:function(data){
                    
    }
});
復制代碼

 方法二:使用beforeSend方法設置請求頭

 

復制代碼
$.ajax({
    type: "POST",
    url: "/index",
    data: JSON.stringify(mytable.params),
    contentType: "application/json",
    dataType: "json",
    beforeSend: function(request) {                
               request.setRequestHeader("Authorization", token);
    },
    success: function(data) {

    },
    error: function(data) {

    }
});


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM