`
vinson00
  • 浏览: 20209 次
文章分类
社区版块
存档分类
最新评论

修改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)。

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

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

相关推荐

    fiddler使用手册

    — Set request header 将请求消息报头中指定的参数替换成指定的值 Response Headers — Flag responses that set cookies 标记(斜体)cookie内容被修改的信息 — Flag responses with header 标记(粗体)...

    request的使用.txt

    在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、...

    Modify Header Value (HTTP Headers)-crx插件

    修改标题值(HTTP标头)是可以添加,修改或删除HTTP-Request-Header的扩展名对于所需网站或URL上的所有请求。如果您是App Developer,网站设计师,或者您想在网站上的请求中测试特定标题,则此插件非常有用。主要...

    tomcat解决跨域访问问题配置

    例如:我的应用中需要在header中传token,所以这里的值就应该是下面的配置,在原有基础上将token加上,否则,应用就不会被允许调用 &lt;param-value&gt;token,Access-Control-Allow-Origin,Content-Type,X-Requested-...

    微信小程序修改自定义input

    在微信小程序中是不能修改input样式的 甚至修改大小也不能,那么怎么做一个自定义样式的input呢 说一下我做的input的原理 有两张图片 一张是未选中的(input.png)一张是已经选中的 (input_n.png) 更具点击事件bindtap...

    基于JavaScript的数据可视化实验室后台管理系统源码+项目说明(期末大作业).zip

    元注解:修饰注解的注解,@Target:注解用在哪种java元素上, @Retention:注解的生命周期,@Documented),再用自定义方法参数解析器HandlerMethodArgumentResolver取出request header中的user,调用service层方法...

    java-servlet-api.doc

    如果有助于你处理应用的数据需求,你也许需要绑定对象到Session中,你可以通过一个唯一的名字绑定任何的对象到Session中,这时,你需要使用HttpSession对象。任何绑定到Session上的对象都可以被处理同一会话的...

    超级有影响力霸气的Java面试题大全文档

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    java 面试题 总结

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    HTTP协议详解

    5.3请求报头域 (Request Header Fields) 6 响应 (Response) 6.1 状态行 (Status-Line) 6.1.1状态码与原因短语 (Status Code and Reason Phrase) 7 实体(Entity) 7.1 实体报文域(Entity Header Fields)...

    乐优商城.xmind

    name 命名为aa,然后sql语句....where s_name= #{aa} 中就可以根据aa得到参数值 修改 回显 Controller @PathVariable("bid") 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中...

    HTTP-Message:HTTP-Message分发包含有用的类,这些类可用于表示以HTTP样式通信传递的消息

    可选的$ header参数应该是对HTTP::Headers对象的引用,或者是键/值对的纯数组引用。 如果提供了HTTP::Headers对象,则其副本将被嵌入到构造的消息中,即它将不被拥有,并且可以在以后修改而不会影响消息。

    ZendFramework中文文档

    11.1. 输出变量的值 (Dumping Variables) 12. Zend_Exception 12.1. 使用“异常” 13. Zend_Feed 13.1. 介绍 13.2. 导入Feeds 13.2.1. 定制 feeds 13.2.1.1. 导入定制的数组 13.2.1.2. 导入定制的数据源 ...

    Smarty中文手册 chm版

    Passing variable title to header template [传递变量标题给头模板] Dates [日期] WAP/WML Componentized Templates [组合的模板] Obfuscating E-mail Addresses [拒绝电子邮件地址] 19. Resources [相关资源]...

    Http1.1超文本传输协议中文版

    4.5 常用头域(General Header Fields) 35 5 请求 35 5.1 请求行 36 5.1.1方法 36 5.1.2请求URL(Request-URI) 37 5.2请求的资源 38 5.3请求报头域 39 6 响应 40 6.1 状态行 (Status-Line) 41 6.1.1状态码与...

    smarty手册.chm

    Passing variable title to header template [传递变量标题给头模板] Dates [日期] WAP/WML Componentized Templates [组合的模板] Obfuscating E-mail Addresses [拒绝电子邮件地址] 19. Resources [相关资源]...

    ASP.NET程序中常用的三十三种代码.txt

    =ListItemType.Header)  {  e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=\""+e.Item.Style["BACKGROUND-COLOR"]+"\"");  e.Item.Attributes.Add( "onmouseover","this.style....

    ASP.NET常用代码

    =ListItemType.Header) { e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=\""+e.Item.Style["BACKGROUND-COLOR"]+"\""); e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor=\"...

    spring security 参考手册中文版

    14.2.3 SavedRequest和RequestCache接口 123 14.3 SecurityContextPersistenceFilter 123 14.3.1 SecurityContextRepository 124 14.4 UsernamePasswordAuthenticationFilter 125 14.4.1认证成功与失败的应用流程 ...

    SAP屠夫作品汇总

    3.特征值派生和值字段评估 519 1 基本设置(Basic Settings) 530 2 企业组织(Enterprise Organization) 535 3 主数据(Master Data) 536 4 利润中心分配(Assignments to Profit Centers) 539 SAP屠宰行业CO解决方案 ...

Global site tag (gtag.js) - Google Analytics