广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何使用RequestHeaders添加自定义参数
  • 852
分享到

如何使用RequestHeaders添加自定义参数

2024-04-02 19:04:59 852人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录RequestHeaders添加自定义参数问题一原因解决方案修改request中header的值RequestHeaders添加自定义参数 在开发过程中有的时候,参数需要绑定到r

RequestHeaders添加自定义参数

开发过程中有的时候,参数需要绑定到requestHeaders中,而并不是在body中进行传输。这个时候就需要我们自己定义参数(需要后台的配合)

setToken() {
    let token = localStorage.getItem('token') ? localStorage.getItem('token') : ''
    this.instance.defaults.headers.common['tokens'] = token
  }
// 使用axiOS添加requestHeaders参数。封装到ajax请求中~

问题一

在浏览器的console中报错:自定义字段不被允许

Request header field自定义字段 is not allowed by Access-Control-Allow-Headers

原因

包含自定义header字段的跨域请求,浏览器会先向服务器发送OPTioNS请求,探测该服务器是否允许自定义的跨域字段。

如果允许,则继续实际的POST/GET正常请求,否则,返回标题所示错误。

同时在requestHeaders请求中有你定义的字段,但结果不是我们想要的

在responseHeaders中Access-Control-Allow-Headers中表示服务器允许跨域请求的参数

Access-Control-Allow-Headers: Content-Type, x-requested-with, X-Custom-Header, Authorization,token

解决方案

服务端需要对OPTIONS请求做出应答,应答header中包含Access-Control-Allow-Headers,且值包含options请求中Access-Control-Request-Headers的值。

以下为java服务端filter中设置的OPTIONS请求处理代码。

@Override 
public void doFilter(ServletRequest req, ServletResponse resp,
        FilterChain chain) throws IOException, ServletException { 
    try { 
        httpservletRequest hreq = (HttpServletRequest) req;  
        HttpServletResponse hresp = (HttpServletResponse) resp;
 
        //跨域
        hresp.setHeader("Access-Control-Allow-Origin", "*"); 
 
        //跨域 Header 
        hresp.setHeader("Access-Control-Allow-Methods", "*"); 
        hresp.setHeader("Access-Control-Allow-Headers", "Content-Type,TOKENS");  // 在这里配置你要定义的参数         
 
        // 浏览器是会先发一次options请求,如果请求通过,则继续发送正式的post请求 
        // 配置options的请求返回
 
        if (hreq.getMethod().equals("OPTIONS")) { 
            hresp.setStatus(HttpStatus.SC_OK); 
            // hresp.setContentLength(0); 
            hresp.getWriter().write("OPTIONS returns OK"); 
            return; 
        }
 
        // Filter 只是链式处理,请求依然转发到目的地址。
 
        chain.doFilter(req, resp); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } 
}

其中,这个就是所需设置的应答Header:

hresp.setHeader("Access-Control-Allow-Headers", "Content-Type,TOKENS");

* header中对值的大小写貌似不敏感。

修改request中header的值

在java web开发中,我们有时候会遇到需要修改request中请求值的问题,虽然这个不是特别常见。初看这是一个简单的问题,因为我们能通过HttpServletRequest对象拿到我们需要的所有关于当前这个请求的所有信息,想当然的也就可以修改所以这些信息。可实际情况是HttpServletReques中很多的属性只有getter方法,而没有setter方法,也就是说我们不可以修改他们。

记得第一次遇到这种问题还是初学编程的时候,最近又遇到这个问题,就记录一下。最近遇到的是在spring mvc中,使用@RequestBody注解把requestBody中的JSON映射到java的object。我们知道对于spring mvc来说,这样使用的时候需要在请求的header里面表明conten-type为application/json。如果完全是自己开发的系统,没有问题加上就是,但是当和第三方合作的时候,请求的发起方式就不是我们能控制住的了。现在的问题是如果使用spring mvc的这种开发模式,必须要在请求的header中设置content-type为application/json,但是第三方又不方便设置。所以只能在所有针对第三方的api中进行特殊处理。

sping mvc是基于servlet的,我们只要在请求进入servlet之前在header中设置content-type为application/json就ok了,所以理想的修改方式就是加入一个filter。现在就到了关键的问题:怎么修改请求的header值。答案是利用HttpServletRequestWrapper类。 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        chain.doFilter(new CustomeizedRequest((HttpServletRequest) request), response);
    } 
    private class CustomeizedRequest extends HttpServletRequestWrapper { 
        public CustomeizedRequest(HttpServletRequest request) {
            super(request);
        }
 
        @Override
        public Enumeration<String> getHeaders(String name) {
            if (null != name && name.equals("Content-Type")) {
                return new Enumeration<String>() {
                    private boolean hasGetted = false; 
                    @Override
                    public String nextElement() {
                        if (hasGetted) {
                            throw new NoSuchElementException();
                        } else {
                            hasGetted = true;
                            return "application/json;charset=utf-8";
                        }
                    } 
                    @Override
                    public boolean hasMoreElements() {
                        return !hasGetted;
                    }
                };
            }
            return super.getHeaders(name);
        }
    }

demo中只重写了getHeaders方法,实际上严谨的做法是getHeader(String name)方法也要被重写。实质上我们还是没有改变header中的值的能力,但是我们重写了getHeaders方法,当发现是我们的Content-Type字段时,只要返回我们想要设置的值就OK了。同理我们可以任意发挥,根据实际的情况去重写相应的方法。

说一下我在这里遇到的一个问题,在开发过程中使用的Maven加jetty插件,运行起来没有问题。但是测试和生产环境用的是Tomcat,上了测试环境发现没有效果。第一感觉是不同的容器中Content-Type的大小写或写法不一样。打了一个log继续测试,发现tomcat好像根本没进入我的getHeaders方法,就开始怀疑tomcat和jetty的某些实现不一致,各种查找没有结果。最后在本地换成tomcat来debug,竟然进入了重写的getHeaders方法,再一看name的值是:content-type。粗心把log打错位置了。。。,刚开始猜想的是对的。

所以这里的name.equals("Content-Type")就要考虑大小写和不同写法的因素了(比如contenttype或ContentType)。

后来想了一下之所以会出现这个失误有两个原因:

  • 粗心 log打错位置
  • 自身对于容器不熟悉,而且之前遇到过tomcat和jetty对于某些请求作不同处理的情况,所以就找错了方向。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 如何使用RequestHeaders添加自定义参数

本文链接: https://www.lsjlt.com/news/139042.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用RequestHeaders添加自定义参数
    目录RequestHeaders添加自定义参数问题一原因解决方案修改request中header的值RequestHeaders添加自定义参数 在开发过程中有的时候,参数需要绑定到r...
    99+
    2022-11-13
  • log4j2的异步使用及添加自定义参数方式
    目录log4j2异步使用及添加自定义参数添加依赖(这里省略了版本号)下面写一个生产可用的log4j2.xml的模板补充知识自定义日志格式如何在日志中添加自己想传的参数?log4j 输...
    99+
    2022-11-12
  • log4j2的异步使用及添加自定义参数方式是什么
    今天就跟大家聊聊有关log4j2的异步使用及添加自定义参数方式是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。log4j2异步使用及添加自定义参数关于log4j2的性能和原理就不...
    99+
    2023-06-22
  • 如何为Repository添加自定义方法
    目录为Repository添加自定义方法一、为某个Repository添加自定义方法二、添加全局Repository继承jpa Repository 写自定义方法查询首先定义实体类是...
    99+
    2022-11-12
  • SpringBoot中如何自定义参数绑定
    这篇文章给大家介绍SpringBoot中如何自定义参数绑定,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。自定义参数转换器自定义参数转换器实现Converter接口,如下:public class D...
    99+
    2023-06-19
  • PHP8中如何使用Attributes为类添加自定义注解?
    PHP8中如何使用Attributes为类添加自定义注解?自定义注解是一种在类或方法上添加元数据的方式,它可以帮助我们在运行时获取和处理特定的类或方法上的附加信息。在PHP8中,引入了Attributes的概念,它使我们可以轻松地为类添加自...
    99+
    2023-10-22
    PHP Attributes
  • vue自定义组件如何添加使用原生事件
    目录自定义组件如何添加使用原生事件. $emit()传递. native属性vue使用原生事件自定义组件如何添加使用原生事件 自定义组件(Components)是vue的重要知识块之...
    99+
    2022-11-13
  • 如何向pyhanlp添加自定义的词典
    小编给大家分享一下如何向pyhanlp添加自定义的词典,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!以python 2.7.9为例:安装pyhanlp:pip i...
    99+
    2023-06-02
  • WordPress如何添加自定义字段面板
    这篇文章主要介绍了WordPress如何添加自定义字段面板的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇WordPress如何添加自定义字段面板文章都会有所收获,下面我们一起来...
    99+
    2023-03-07
    wordpress
  • 如何在jQuery中添加自定义方法
    随着前端技术的不断发展,越来越多的网站开始采用动态效果来丰富用户界面。jQuery是一种非常受欢迎的JavaScript库,它简化了对DOM、事件、AJAX等的操作,并提供了许多方便的方法和函数以快速创建动态效果。在此基础上,jQuery允...
    99+
    2023-05-14
  • springSecurity之如何添加自定义过滤器
    目录springSecurity 添加自定义过滤器很简单,配置如下然后再来看看myFilterspringSecurity 自定义认证过滤器出现的问题解决方法springSecuri...
    99+
    2022-11-12
  • 如何使用webservice自定义注解处理参数加解密问题
    小编给大家分享一下如何使用webservice自定义注解处理参数加解密问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!webservice自定义注解处理参数加解...
    99+
    2023-06-22
  • VB如何自定义类型参数
    这篇文章主要介绍“VB如何自定义类型参数”,在日常操作中,相信很多人在VB如何自定义类型参数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”VB如何自定义类型参数”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-17
  • 如何在atom中添加自定义快捷键
    这篇文章主要讲解了“如何在atom中添加自定义快捷键”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何在atom中添加自定义快捷键”吧!问题的描述在使用Markdown写学习笔记的时候,一开...
    99+
    2023-06-29
  • 使用webservice自定义注解处理参数加解密问题
    目录webservice自定义注解处理参数加解密代码实现webservice注解汇总@WebService@WebMethod@Oneway@WebParam@WebResult@H...
    99+
    2022-11-12
  • php中url自定义参数如何传
    在PHP中,URL参数可以通过添加到URL的查询字符串中来传递。查询字符串是URL中的问号后面的部分,它由键值对组成,每个键值对之间...
    99+
    2023-08-09
    php
  • Asp.Net Core如何添加请求头自定义认证
    小编给大家分享一下Asp.Net Core如何添加请求头自定义认证,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!要点实现 IAuthenticationHandler 接口:4 个方法首先会调用 InitializeAsy...
    99+
    2023-06-14
  • 为PHP运行时如何添加自定义扩展
    这篇文章将为大家详细讲解有关为PHP运行时如何添加自定义扩展,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 语言提供了一种扩展机制(Extension),通过 PHP 扩展可以增强语法、调用 C/C...
    99+
    2023-06-04
  • 如何在Android应用中添加一个自定义弹框
    如何在Android应用中添加一个自定义弹框?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现步骤:1.xml布局实现<&#63;xml vers...
    99+
    2023-05-31
    android roi
  • SpringBoot 如何自定义请求参数校验
    目录一、Bean Validation基本概念二、基本用法三、自定义校验3.1 自定义注解3.2 自定义Validator3.3 以编程的方式校验(手动)3.4 定义分组校验3.5 ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作