在 java 应用程序之间使用 nginx 时丢失标头中的数据

Posted

技术标签:

【中文标题】在 java 应用程序之间使用 nginx 时丢失标头中的数据【英文标题】:Losing the data in the header when nginx is used in between the java application 【发布时间】:2015-12-16 10:32:41 【问题描述】:

我正在尝试通过 localhost 访问我的 java 项目,标题中的数据保留。因此,以下方法可以正常工作。 Websocket 正在打开。

if (!headerContainsToken(req, "upgrade", "websocket")) 
        resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
        return;
   
private boolean headerContainsToken(HttpServletRequest req,
        String headerName, String target) 
    Enumeration<String> headers = req.getHeaders(headerName);
    while (headers.hasMoreElements()) 
        String header = headers.nextElement();
        String[] tokens = header.split(",");
        for (String token : tokens) 
            if (target.equalsIgnoreCase(token.trim())) 
                return true;
            
        
    
    return false;

这是我的应用程序的 nginx 配置

server 
listen test:80;
server_name  test;
root /home/local/apache-tomcat-8.0.18/webapps/;

location / 

    proxy_set_header X-Forwarded-Host;
    proxy_set_header X-Forwarded-Server;
    proxy_set_header X-Forwarded-For;
    proxy_pass http://127.0.0.1:8080/;

但是当通过nginx命中同一个应用时,上面的方法返回Bad request。 所以我不知道标头中的数据去哪里了,什么时候通过 nginx 命中。而且 websocket 根本没有打开。

大家有什么建议

【问题讨论】:

您应该编辑您的问题并添加您的nginx 配置。 我添加了 nginx 配置 【参考方案1】:

您需要在 nginx 配置中添加更多标头以代理 WebSocket。见this document。

将此添加到nginx 配置的http 容器中:

map $http_upgrade $connection_upgrade 
    default upgrade;
    ''      close;

并将您的 location 块更改为:

location / 
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_pass http://127.0.0.1:8080/;

如果您还需要添加 X- 标头,则它们需要一些值。如:

proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

其他预定义变量为listed here。

【讨论】:

以上是关于在 java 应用程序之间使用 nginx 时丢失标头中的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 渲染时 CPU 和 GPU 之间的数据丢失

React Native - 使用 react-navigation 和 react-redux 在屏幕之间切换时数据丢失

在页面 flutter,streambuilder,listview 之间导航时列表视图位置丢失

nginx 反向代理时丢失端口的解决方案

nginx 反向代理时丢失端口的解决方案

nginx 反向代理时丢失端口的解决方案