zoukankan      html  css  js  c++  java
  • 原创:响应头(response)和和请求头(request)的值的添加和值的传递实现,为学习token打基础

    文章目录:

    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>
    做产品的程序,才是好的程序员!
  • 相关阅读:
    mysql-03
    mysql-02
    mysql-01
    RESTFUL设计风格
    mysql水平拆分和垂直拆分
    redis连环夺命问
    Python 的十大重要特性
    吊打--redis
    python2和3 的区别
    tornado第一段代码
  • 原文地址:https://www.cnblogs.com/asplover/p/13267898.html
Copyright © 2011-2022 走看看