【发布时间】:2022-11-30 18:14:08
【问题描述】:
我正在尝试在 spring 过滤器中从客户端获取自定义请求标头 但是即使我记录了所有的标题,我仍然找不到“userId”标题
这是我的过滤器,效果很好
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
AuthRequestWrapper authRequestWrapper = new AuthRequestWrapper((HttpServletRequest) servletRequest);
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
Enumeration<String> headerNames = httpRequest.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
Syssem.out.println("Header: " + name + " value:" + httpRequest.getHeader(name));
}
}
}
在客户端,我执行这样的请求:
let credentials: RequestCredentials = "omit"
let mode: RequestMode = 'cors'
let headers: HeadersInit = {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "http://localhost:8080",
"userId":"ABCD"
}
const fetchOption = {
method: 'GET', // *GET, POST, PUT, DELETE, etc.
credentials: credentials, // include, *same-origin, omit
headers: headers,
mode: mode, // no-cors, *cors, same-origin
}
let responseObj = await (await fetch(finalUrl,fetchOption)).json()
我仍然可以在 Spring Controller 中获取请求标头。
【问题讨论】:
-
没有
userId标头,至少我看到它没有被添加到客户端代码中。您的过滤器也有缺陷,因为它在最后停止处理,您应该调用filterChain.doFilter(authRequestMapper, response);,否则它会破坏应用程序。 -
@M.Deinum 我只是忘了在问题中添加“userId”标头,但我很确定它在我的项目中有效并且控制器可以接收标头
-
所以你发布了代码的简化版本而不是实际代码?您的过滤器根本无法工作,因为处理将在记录后停止,因此这不是您使用的实际过滤器。尽管如此,如果您没有收到标头,则标头根本不存在,因此不会从客户端发送到服务器。
标签: reactjs typescript spring-boot