【发布时间】:2011-12-28 06:31:38
【问题描述】:
我在服务器实例上部署了一个 Web 服务。在同一个实例上,我们还有一个使用此 Web 服务的 Web 应用程序,它是最终用户的前端。
由于两者都在同一个服务器实例上并且通信是本地的,我想知道使用 HTTPS 是否会产生开销?
【问题讨论】:
标签: java web-services http https
我在服务器实例上部署了一个 Web 服务。在同一个实例上,我们还有一个使用此 Web 服务的 Web 应用程序,它是最终用户的前端。
由于两者都在同一个服务器实例上并且通信是本地的,我想知道使用 HTTPS 是否会产生开销?
【问题讨论】:
标签: java web-services http https
如果您的 Web 服务对盒子来说是“本地的”,即不面向公众并绑定到环回接口(或更类似于本地网络接口),那么使用 HTTPS 将是一个相当大的开销,而且出于明显的原因(因为它需要做“更多”的工作)。
我们有类似的架构,但我们使用 RMI 来获得更好的性能,而不是使用 HTTP。它提供二进制传输而不是文本协议,更不用说免费提供的自动编组 - 解组。如果您担心可移植性,从长远来看,使用另一种有效的协议(如 protobuffers)可能会有所帮助。虽然我确信这些事情不适用于你的情况,因为你没有提到任何关于远离 HTTP 服务的事情。
【讨论】:
是的,在同一台服务器中,HTTPS 只是增加了开销。可以通过 HTTP 进行通信
如果 Web 服务服务器实例不对外暴露,您可以完全禁用 HTTPS 侦听器。
如果此 Web 服务服务器暴露于外部世界,那么您可以编写一个过滤器,将来自外部的 http 请求重定向到 https。
这是过滤器的外观:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
if(httpRequest.isSecure() || isHostAllowed(servletRequest.getRemoteHost()) ){
filterChain.doFilter(servletRequest, servletResponse);
} else{
String url = "https://"+servletRequest.getServerName() + "/" + httpRequest.getRequestURI();
httpResponse.sendRedirect(url);
}
}
【讨论】:
javax.servlet.Filter 接口的过滤器,或者web.xml 中的<security-constraint> 标签可以配置为这样做吗?因为只有当它来自外部时我们才需要重定向到 HTTPS..