Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在作为代理的Nginx环处理程序中读取服务器名称_Java_Nginx_Clojure_Proxy_Ring - Fatal编程技术网

Java 在作为代理的Nginx环处理程序中读取服务器名称

Java 在作为代理的Nginx环处理程序中读取服务器名称,java,nginx,clojure,proxy,ring,Java,Nginx,Clojure,Proxy,Ring,我正在尝试使用实现一个动态代理 在我的nginx配置文件中,我有以下内容: events { worker_connections 1024; } http { jvm_path 'myjvmpath'; jvm_var nginx_clojure_jar_path 'myNginx_clojure_jar_path'; jvm_var my_java_handler_jar_path '...'; jvm_options "-Djava.cla

我正在尝试使用实现一个动态代理

在我的nginx配置文件中,我有以下内容:

events {
    worker_connections  1024;
}

http {

    jvm_path 'myjvmpath';

    jvm_var nginx_clojure_jar_path 'myNginx_clojure_jar_path';
    jvm_var my_java_handler_jar_path '...';

    jvm_options "-Djava.class.path=#{nginx_clojure_jar_path}:#{my_java_handler_jar_path}";


    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    gzip  on;

    server {
        listen       8080;

        location / {
            handler_type 'java'; 
            rewrite_handler_name 'com.poc.MyHandler';
            resolver 8.8.8.8;
            proxy_pass http://$host$uri;
        }
    }
}
基本上,所有请求都通过MyHandler传递:

package com.poc;

import java.util.Arrays;
import java.util.Map;

import nginx.clojure.java.ArrayMap;
import nginx.clojure.java.Constants;
import nginx.clojure.java.NginxJavaRingHandler;
import static nginx.clojure.MiniConstants.*;

public class MyHandler implements NginxJavaRingHandler {

    @Override
    public Object[] invoke(Map<String, Object> request) {
        if (isRequestForbidden(request)) {
            return new Object[] { NGX_HTTP_FORBIDDEN, // http status 404
                    ArrayMap.create(CONTENT_TYPE, "text/plain"), // headers map
                    "Forbidden" };
        } else {
            return Constants.PHRASE_DONE;
        }
    }

    private boolean isRequestForbidden(Map<String, Object> request) {
        String serverName = (String) request.get(Constants.SERVER_NAME);
        return false;
    }

}
package com.poc;
导入java.util.array;
导入java.util.Map;
导入nginx.clojure.java.ArrayMap;
导入nginx.clojure.java.Constants;
导入nginx.clojure.java.NginxJavaRingHandler;
导入静态nginx.clojure.MiniConstants.*;
公共类MyHandler实现NginxJavaRingHandler{
@凌驾
公共对象[]调用(映射请求){
如果(IsRequest禁止(请求)){
返回新对象[]{NGX_HTTP_禁止,//HTTP状态404
create(CONTENT_TYPE,“text/plain”),//头映射
“禁止”};
}否则{
返回常量。短语_完成;
}
}
私有布尔ISRequestProbled(映射请求){
String serverName=(String)request.get(Constants.SERVER\u NAME);
返回false;
}
}
代码很简单:基于请求(更具体地说,基于服务器名称),我想返回常量。短语_DONE(请求将发送到目标服务器)或指示站点被禁止的响应。我遇到的问题是request.get(Constants.SERVER_NAME)返回的是空字符串,我希望这里有服务器名


我采取的一般方法有什么问题吗?我是这方面的新手,如果您能给我一些建议,我将不胜感激。

找到了解决方案,所以我把它贴在这里。
request.get(Constants.SERVER\u NAME)
不包含请求服务器的名称,而是代理服务器的名称。我要找的是一个带有“Host”键的标题。以下是阅读方法:

private boolean isRequestForbidden(Map<String, Object> request) {
    @SuppressWarnings("unchecked")
    Map<String, String> headers = (Map<String, String>) request
            .get(Constants.HEADERS);
    String host = headers.get("Host");

    // ...
}
private boolean isrequest禁止(映射请求){
@抑制警告(“未选中”)
映射头=(映射)请求
.get(常量.HEADERS);
字符串host=headers.get(“主机”);
// ...
}
request.get(Constants.SERVER\u NAME)返回nginx.conf中服务器块中声明的服务器名称。e、 g.服务器{listen 8080;服务器名称*.com;