这篇文章主要介绍“Web应用开发中怎么接收请求地址”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Web应用开发中怎么接收请求地址”文章能帮助大家解决问题。
Web 应用开发中,经常会有需要获取请求的ServerName, 请求端口等, 以此构造绝对URL,拿到用户请求地址,然后进行跳转,重定向等操作。
也许你说这还不简单,回字的四种写法,我有多种方法拿到这个请求地址。
req.getServerName();
req.getRemoteHost();
req.getHeader("host");
req.getRequestURI();
req.getRequestURL().toString();
我们一般要通过请求来封装一个绝对地址,用上面这几个方法差不多就可以了,对于http/https 的区别,可以通过getSchema 来获取。
那这里拿到的地址一定是实际用户输入的URL吗?
答案是不确定的。
如果你是使用的一个独立的Web Container,比如静态资源和 Servlet 都用 Tomcat 来处理,这种 standalone 模式下的,获取到的 ServerName,是 request直接处理的,直接请求传递来的,端口则是 Connector 在监听的端口号。这个时候这些请求方法都能拿到我们想要的内容。
但是如果我们把 Tomcat 放到一个 proxy Server 后面,此时,所有的用户请求都先从代理服务器过来,此时再在 Java Web 应用内调用上述的方法时,你的请求serverName,端口号等实质上想要获取真实的用户请求来的地址,以及端口,而不是 Connector 监听的这个。而且根据 proxy server 配置的不同,你拿到不一定是预期的结果。
为啥呢?
从代理服务器上传递过去的请求,以 Nginx 为例,默认的 proxy header 中,对于 Host,使用的是 $proxy_host,此时我们拿到的并不是实际在 Http 的请求头中传过去的 Host域,而是我们在配置 proxy_pass 指令时设置的host,而用户实际一般都是通过域名请求来的,这时两个就会出现不一致的现象。
比如 proxy_pass 配置的是 http://localhost:port这种形式,这个时候在
request.getServerName这些方法时,返回的就是localhost,后面getHeader拿host, 也不会有正确的结果。
为了能在这种非 Standalone的模式下,能拿到代理服务器传递后依然正确的请求地址,就需要进行一些配置。 比如 Apache 中的 ProxyParseHost on, 以及 Nginx 中的 proxy_set_header Host $http_host。
这样,实际传递到 Java Web 容器的时候就是实际用户请求头中的Host,再据此拼装绝对URL就能符合我们预期。
除了设置代理服务器的设置外, 我们在 Tomcat 这里也可以进行一些配置。
在 Connector 组件中,有这样两个属性:
ProxyName
ProxyPort
在文档中,解释如下:
如果 Connector 使用在一个代理场景中,
配置这个属性用于指定调用 request.getServerName() 方法时返回的 ServerName 和调用request.getServerPort() 方法返回的 ServerPort。
这样,即使 代理服务器传来的值会变,但是我们在Connector 中根据具体的约定配置好了值,在获取时就能以此来拼装绝对的URL。
而在一些其他编程语言中,有些是会将ServerName 和 Host 区分开,比如PHP中的,两个分别拿到不同的信息。
$_SERVER['SERVER_NAME']
$_SERVER['HTTP_HOST']
所以,在构造一个绝对URL时,也是需要区分部署环境,场景等。
关于“Web应用开发中怎么接收请求地址”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。