当前位置: 首页 > 知识库问答 >
问题:

通过筛选器向请求添加自定义标头

殳经略
2023-03-14

我有一个扩展filter类的类,它看起来像:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        System.out.println("--------------------------------------");

        HttpServletRequest request = (HttpServletRequest) req;

        req.setAttribute("test", "test");


        final HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
        response.setHeader("Access-Control-Max-Age", "3600");
        if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

问题是,我可以向请求添加自定义标头吗?我浏览了requestreq中可用的所有方法,但没有找到任何方法。但是在debug模式下,我发现在coyoterequest中有header的列表。如何在此添加自定义标头

共有1个答案

冯峻
2023-03-14

不能在HttpServletRequest对象中设置标头,但可以使用包装类。

请参阅以下指南:http://wilddiary.com/adding-custom-headers-java-httpservletrequest/

以防万一将来链接变得无效:

final class MutableHttpServletRequest extends HttpServletRequestWrapper {
    // holds custom header and value mapping
    private final Map<String, String> customHeaders;

    public MutableHttpServletRequest(HttpServletRequest request){
        super(request);
        this.customHeaders = new HashMap<String, String>();
    }

    public void putHeader(String name, String value){
        this.customHeaders.put(name, value);
    }

    public String getHeader(String name) {
        // check the custom headers first
        String headerValue = customHeaders.get(name);

        if (headerValue != null){
            return headerValue;
        }
        // else return from into the original wrapped object
        return ((HttpServletRequest) getRequest()).getHeader(name);
    }

    public Enumeration<String> getHeaderNames() {
        // create a set of the custom header names
        Set<String> set = new HashSet<String>(customHeaders.keySet());

        // now add the headers from the wrapped request object
        @SuppressWarnings("unchecked")
        Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaderNames();
        while (e.hasMoreElements()) {
            // add the names of the request headers into the list
            String n = e.nextElement();
            set.add(n);
        }

        // create an enumeration from the set and return
        return Collections.enumeration(set);
    }
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    MutableHttpServletRequest mutableRequest = new MutableHttpServletRequest(req);
    ...
    mutableRequest.putHeader("x-custom-header", "custom value");
    chain.doFilter(mutableRequest, response);
}
 类似资料:
  • 我正在尝试将基于Spring MVC xml的项目配置重构为基于Spring Boot java的配置。同时按如下方式设置shiro配置:

  • 问题内容: 我正在与现有的servlet集成,该servlet从HTTP标头中提取一些属性。基本上,我实现的接口无法访问实际请求,它只能访问HTTP标头的k-> v映射。 我需要传递一个请求参数。计划是使用servlet过滤器从参数到标头值,但是HttpServletRequest对象当然没有addHeader()方法。 有任何想法吗? 问题答案: Extend ,覆盖标头吸气剂以返回参数: ..

  • 大家好,我正在编写使用Spring Security和JWT令牌的身份验证。 我在配置中添加自己的过滤器。但该请求不包含在筛选器中。因此,对任何地址的所有请求都被执行,即使没有令牌。 过滤器

  • 问题内容: 有谁知道如何使用JavaScript或jQuery添加或创建自定义HTTP标头? 问题答案: 根据您的需求,有几种解决方案… 如果要向 单个请求添加自定义标头(或标头集), 则只需添加属性: 如果要向 每个请求添加默认标头(或标头集),请 使用: 如果 要向每个请求添加标头(或标头集), 则将钩子与一起使用: 编辑(更多信息): 要注意的一件事情是,您只能定义一组默认标头,而只能定义一

  • 问题内容: 我需要向来自WebView的每个请求添加自定义标头。我知道有用于的参数,但这些参数仅应用于初始请求。所有后续请求均不包含标头。我已经看过所有的替代,但是没有什么允许将标头添加到资源请求- 。任何帮助都会很棒。 问题答案: 尝试 要将标头添加到资源加载请求中,请定制WebViewClient并重写: