google-app-engine - 使用 App Engine Flex 自定义 Rumtime 和 Tomcat 将 HTTP 重定向到 HTTPS
问题描述
我有一个在 App Engine Flex Custom Runtime 上运行的应用程序。这个应用程序是一个运行在 tomcat 8 (java 8) 之上的 Java WAR 包。为了在 App Engine Flex Custom Runtime 上运行,我创建了一个 docker 映像:
FROM tomcat:alpine
USER root
WORKDIR /root
RUN rm -rf /usr/local/tomcat/webapps/*
COPY ROOT.war /usr/local/tomcat/webapps/ROOT.war
#RUN chmod +x /root/env.sh
RUN rm -f /usr/local/tomcat/conf/server.xml
RUN rm -f /usr/local/tomcat/conf/web.xml
COPY app.jks /usr/local/tomcat/conf/app.jks
COPY server.xml /usr/local/tomcat/conf/server.xml
COPY web.xml /usr/local/tomcat/conf/web.xml
#Set properly time zone
RUN apk --update add tzdata && \
cp /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime && echo "America/Sao_Paulo" > /etc/timezone && \
apk del tzdata
我读到使用 flex 和自定义运行时不可能将应用程序引擎配置为重定向,这必须在我的应用程序中完成,所以我从我的 tomcat 中修改了 server.xml 和 web.xml,如下所示:
服务器.xml:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" />
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="/usr/local/tomcat/conf/app.jks" keystorePass="my_password"
clientAuth="false" sslProtocol="TLS"/>
网页.xml:
<security-constraint>
<web-resource-collection>
<web-resource-name>Secured</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
和我的 app.yaml:
runtime: custom
env: flex
network:
session_affinity: true
forwarded_ports:
- 443:8443
- 80:8080
resources:
cpu: 1
memory_gb: 2
disk_size_gb: 10
manual_scaling:
instances: 1
beta_settings:
cloud_sql_instances: path-db
我的应用程序和“互联网”之间似乎有一些东西,因为每次我尝试访问它时,它都会一直循环,就好像当它到达我的 docker 容器时它总是 HTTP 而不是 HTTPS。有人可以发现我的错误是什么?为什么我无法使用应用引擎进行此重定向?
当我在我的机器上使用 docker 在本地测试它时,一切都很顺利。
提前致谢!
解决方案
在 App Engine Flexible 中,您必须使用Strict-Transport-Security来强制 HTTPS 连接。请按照以下步骤操作:
1) 在您的 web.xml 中添加以下过滤器:
<filter>
<filter-name>HTTPSFilter</filter-name>
<filter-class>security.HTTPSFilter</filter-class>
</filter>
2) 在您的应用中创建一个过滤器以使用Strict-Transport-Security标头:
package security;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
public class HTTPSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse) res;
if (!req.isSecure()) # if it's not secure, make it secure
resp.setHeader("Strict-Transport-Security", "max-age=31622400; includeSubDomains");
chain.doFilter(req, resp);
}
}
请让我知道它是否适合您。
推荐阅读
- python - 清理轴标签的最佳方法?
- arrays - 如何通过替换它们来删除错误值?
- html - 如何将同一行的表格 td 内容与浮动元素对齐?
- apache-flink - Flink:基于事件类型的流操作函数
- sql - 执行从 SELECT 语句创建的 T-SQL Alter 语句?
- android - 如何将进度条类转换为 kotlin 中的扩展函数?
- javascript - React17中如何使用carco6.1.2配置px torem?最新的 postcss-pxtorem 版本是 6.0
- javascript - 请告诉我为什么这个对象迭代器只允许记录一次
- javascript - 当我使用 i 时循环运行,但当我使用不同的东西时不运行
- swagger - Spring InterceptorRegistry - 允许 Swagger / Actuator