我有一个扩展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);
}
}
问题是我可以添加一个自定义的header
到request
吗?我尝试了request
和req
中可用的所有方法,但没有找到任何方法。但是在debug
模式下,我发现CoyoteRequest
中有headers
的列表。我如何添加我的自定义header
?
8条答案
按热度按时间dluptydi1#
不能在
HttpServletRequest
对象中设置头,但可以使用 Package 类。看看这个指南:http://wilddiary.com/adding-custom-headers-java-httpservletrequest/
以防将来链接失效:
用法:
krcsximq2#
Guy Smorodinsky的答案是可以的,但是对于Spring来说,您可能需要覆盖一些额外的方法,比如
Enumeration<String> getHeaders(String name)
,因为Spring在使用@RequestHeader
注解获取头值时使用了这个方法。示例代码可能如下所示:
b5buobof3#
我遵循了Guy Smorodinsky的答案,它对我很有效,但我不得不向MutableHttpServletRequest添加另一个方法:
92vpleto4#
如果出于某种原因,添加新的过滤器或拦截器不是一个选项,反射和丑陋的代码是可以的。您可以执行以下操作,以编程方式修改控制器方法主体中的现有头部:
警告!这是丑陋的,绝对不应该在生产中使用!
cgyqldqp5#
Http头不区分大小写,按照GuySmorodinsky的回答,考虑使用Spring中的
LinkedCaseInsensitiveMap
而不是HashMap
roqulrg36#
示例如何通过Spring中的过滤器将用户名从OAuth2 Authentication的值设置为自定义头X-Login,并在控制器中用作参数
@RequestHeader(X_LOGIN) String login
之一s1ag04yj7#
我在实现REST Client with Quarkus时遇到过类似的问题,使用ClientRequestFilter解决了这个问题
vmdwslir8#
我知道这是一个很老的主题,但是我需要一个这样的类。从这个讨论中吸取一些好的部分,这里有一个非常全面的类,当每个人想要定制传入的HttpServletRequest的头时,它应该有每个人所需要的东西: