首页 > 技术文章 > 原创:响应头(response)和和请求头(request)的值的添加和值的传递实现,为学习token打基础

asplover 2020-07-08 16:54 原文

文章目录:

  1. 什么是token?通过浏览器查看Header头中的键值对,token值可通过header传递
  2. Controller控制器中代码.----写入响应键值对,而不是请求键值对
  3. 通过ajax,向请求头中写入键值对---------是请求键值对,而不是响应键值对
  4. Controller控制器,再接收前端传递过来自定义键值对.
    提醒:前端接收响应token存储本地 localStorage中,不删除一般不会消失

什么是token?

简言之,客户端与服务器端传递数据。其实和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>

 

推荐阅读