Web应用开发中怎么接收请求地址

这篇文章主要介绍“Web应用开发中怎么接收请求地址”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Web应用开发中怎么接收请求地址”文章能帮助大家解决问题。

创新互联专注于企业营销型网站建设、网站重做改版、都安网站定制设计、自适应品牌网站建设、H5高端网站建设商城建设、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为都安等各大城市提供网站开发制作服务。

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应用开发中怎么接收请求地址”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注创新互联行业资讯频道,小编每天都会为大家更新不同的知识点。


当前名称:Web应用开发中怎么接收请求地址
URL标题:http://pwwzsj.com/article/ggodpi.html