通过反射的方式对HttpServletRequest中的Header进行增删(Jetty)

335 阅读1分钟

Jetty对HttpServletRequest的实现

直接通过继承的方式,实现了HttpServletRequest接口,实现类为org.eclipse.jetty.server.Request。 而存储请求头信息的关键类为:org.eclipse.jetty.http.HttpFields

相关代码如下:

       /*
        * Decompiled with CFR.
        *
        * Could not load the following classes:
        *  javax.servlet.FilterChain
        *  javax.servlet.ServletException
        *  javax.servlet.ServletRequest
        *  javax.servlet.ServletResponse
        *  javax.servlet.annotation.WebFilter
        *  javax.servlet.http.HttpFilter
        *  org.eclipse.jetty.http.HttpFields
        *  org.eclipse.jetty.http.MetaData$Request
        *  org.eclipse.jetty.server.Request
        *  org.slf4j.Logger
        *  org.slf4j.LoggerFactory
        *  org.springframework.core.annotation.Order
        *  org.springframework.stereotype.Component
        *  org.springframework.util.ReflectionUtils
        */
       package com.htc.filter;

       import java.io.IOException;
       import java.lang.reflect.Field;
       import javax.servlet.FilterChain;
       import javax.servlet.ServletException;
       import javax.servlet.ServletRequest;
       import javax.servlet.ServletResponse;
       import javax.servlet.annotation.WebFilter;
       import javax.servlet.http.HttpFilter;
       import org.eclipse.jetty.http.HttpFields;
       import org.eclipse.jetty.http.MetaData;
       import org.eclipse.jetty.server.Request;
       import org.slf4j.Logger;
       import org.slf4j.LoggerFactory;
       import org.springframework.core.annotation.Order;
       import org.springframework.stereotype.Component;
       import org.springframework.util.ReflectionUtils;

       @WebFilter(urlPatterns={"/**"})
       @Component
       @Order(value=-10000)
       public class HttpHeaderFilter
       extends HttpFilter {
           private static final Logger log = LoggerFactory.getLogger(HttpHeaderFilter.class);

           public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
               try {
/*36*/             Field _metaData = ReflectionUtils.findField(Request.class, (String)"_metaData", MetaData.Request.class);
/*37*/             _metaData.setAccessible(true);
/*38*/             MetaData.Request metaDataRequest = (MetaData.Request)_metaData.get(req);
/*40*/             Field httpField = ReflectionUtils.findField(MetaData.Request.class, (String)"_fields", HttpFields.class);
/*41*/             httpField.setAccessible(true);
/*42*/             HttpFields httpFields = (HttpFields)httpField.get(metaDataRequest);
/*43*/             httpFields.remove("Content-Encoding");
               }
               catch (IllegalAccessException e) {
/*45*/             log.error("过滤请求头失败", (Throwable)e);
               }
/*47*/         super.doFilter(req, res, chain);
           }
       }

方案思路来源于以下文章

对HttpServletRequest中的Header进行增删

对HttpServletRequest中的Header进行增删](springboot.io/t/topic/364…)