文章目錄:
- 什么是token?通過瀏覽器查看Header頭中的鍵值對,token值可通過header傳遞
- Controller控制器中代碼.----寫入響應鍵值對,而不是請求鍵值對
- 通過ajax,向請求頭中寫入鍵值對---------是請求鍵值對,而不是響應鍵值對
- Controller控制器,再接收前端傳遞過來自定義鍵值對.
提醒:前端接收響應token存儲本地 localStorage中,不刪除一般不會消失
簡言之,客戶端與服務器端傳遞數據。其實和cookie傳遞數據原理相同,存方位置不同而已。存放在請求頭Response Header或Request Header。
1:控制器中代碼
通過request.getHeader("RequestToken"); 來獲取請求頭中的鍵值對。RequestToken這自定義的鍵值對名稱。為后期傳token學習打基礎
問:RequestToken: RequestTokenValue; 如何寫入到請求頭中的呢?
是通過前端請求時寫入的,見如下本例中第二部份代碼。
package com.ibaiqi.house.controller; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import javax.jws.WebParam; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.UUID; @Controller @RequestMapping(value = "/user") public class UserController { private static final transient Logger log = LoggerFactory.getLogger(UserController.class); /** * 通過response.addHeader(),向http請求頭中寫入token,經過前端代碼處理后儲存到本地localStorage,獲取本地localStorage值並添加到請求鍵值對,接收並打印、 * @param mv * @return */ @RequestMapping(value = "/getToken") public ModelAndView getToken(HttpServletResponse response, HttpServletRequest request, ModelAndView mv){ log.info("測試得到token"); //寫入token到請求頭 //前端通過ajax接收,並存儲到localStorage本地,再添加到請求頭的鍵值對中,傳遞給后台打印 response.addHeader("ResponseToken","responseToken value for token latter22"); //接收請求頭中的token並傳遞給變最RequestToken String RequestToken=request.getHeader("RequestToken"); System.out.println("得到RequestToken的值為:"+RequestToken); mv.setViewName("/user/getToken"); return mv; } }
2:請求通過jquery的ajax來把請求頭加進去,代碼如下
主要作用通過“ headers: { //鍵值對,多個鍵值之間需要用逗號“,”隔開 "RequestToken":"RequestTokenValue" },”來寫入請求頭
<%-- Created by IntelliJ IDEA. User: Dell Date: 2020-07-08 Time: 14:31 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>測試得到請求token</title> <link href="${pageContext.request.contextPath}/css/style.css" rel="stylesheet" type="text/css"/> <script src="${pageContext.request.contextPath}/js/jquery-3.4.1.js"></script> </head> <body> <h3>測試得到請求token</h3> <hr/> <p>響應頭所有鍵值對:<span id="responseAll" style="color:red;"></span></p> <p>響應頭自定義鍵值對:<span id="responseToken" style="color:red;"></span></p> </body> </html> <script type="text/javascript"> //定義函數,通過$.ajax()來獲取響應Header中的值,此值后期改為token的值 function initResponseHeaders() { $.ajax( { headers: { // 把鍵值對放到請求頭中 "authentication":"authentication for token later", "RequestToken": localStorage.getItem("responseToken") }, 'type': 'head', 'url': 'http://localhost:8080/shiro_manager/user/getToken', 'success': function (data, status, xhr) { //把請求頭全部寫在id="response"上 $('#responseAll').text(xhr.getAllResponseHeaders()); console.log("打印請求頭中的鍵值對:"+xhr.getResponseHeader("ResponseToken")); $('#responseToken').text(xhr.getResponseHeader("ResponseToken")) //方法返回包含指定頭文本的字符串 let responseToken = xhr.getResponseHeader("ResponseToken"); console.log(responseToken); //把響應頭鍵值對屬性esponseToken的值,存儲到本地localStorage的鍵值對中 localStorage.setItem("responseToken", responseToken); }, 'error': initResponseHeaders }) } //調用 initResponseHeaders(); </script>