Appengine - 部署隐藏文件夹

时间:2016-09-01 22:12:15

标签: java validation google-app-engine hidden hidden-files

要验证SSL证书,我需要上传一个隐藏文件夹(" /。众所周知的"包含一些文件到我的应用程序。

我正在使用eclipse部署java应用程序,但这些文件不会在appengine上的应用程序中接收。我想它们已被过滤掉了。

我尝试将隐藏文件夹作为静态文件添加到appengine-web.xml中,但它没有帮助。

<!-- Configure serving/caching of GWT files -->
<static-files>
    <include path="**" />
    <include path=".**" />
    <include path="**.*" expiration="0s" />
    <include path="**.well-known" expiration="0s" />
    <include path="**.nocache.*" expiration="0s" />
    <include path="**.cache.*" expiration="365d" />
    <include path="**.css" expiration="30d"/>
    <exclude path="**.gwt.rpc" />
    <exclude path="**.html" />
</static-files>

我是如何上传这些文件夹和文件的?

6 个答案:

答案 0 :(得分:3)

对于像我这样的人在尝试以静态方式在Google App Engine中为letsencrypt提供挑战并且失败之后,以下其他人来到我这里:以下为我做了这样的事情:(其中一个人可能真的可以静态地执行此操作,但我没有不要尝试,因为我不想花更多的时间尝试一些东西,Ian显然已经尝试过并且无法使其工作[也许在Google App Engine内部完成的复制命令会忽略以点开头的目录])< / p>

取自http://igorartamonov.com/2015/12/lets-encrypt-ssl-google-appengine/学分归Igor Artamonov。

只需构建一个servlet:

公共类LetsencryptServlet扩展了HttpServlet {

    public static final Map<String, String> challenges = new HashMap<String, String>();

    static {
        challenges.put("RzrvZ9gd7EH3i_TsJM-B0vdEMslD4oo_lwsagGskp6c",
                "RzrvZ9gd7EH3i_TsJM-B0vdEMslD4oo_lwsagGskp6c.ONrZa3UelibSWEX270nTUiRZKPFXw096nENWbMGw0-E");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        if (!req.getRequestURI().startsWith("/.well-known/acme-challenge/")) {
            resp.sendError(404);
            return;
        }
        String id = req.getRequestURI().substring("/.well-known/acme-challenge/".length());
        if (!challenges.containsKey(id)) {
            resp.sendError(404);
            return;
        }
        resp.setContentType("text/plain");
        resp.getOutputStream().print(challenges.get(id));
    }
}

并添加到web.xml,如:

<servlet>
    <servlet-name>letsencrypt</servlet-name>
    <servlet-class>...LetsencryptServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>letsencrypt</servlet-name>
    <url-pattern>/.well-known/acme-challenge/*</url-pattern>
</servlet-mapping>

当然,请确保servlet类具有创建的Servlet的完整类路径。

该博客文章还涉及生成和安装证书所需的其他步骤。

Ian:你确定你正在部署servlet吗?检查日志,确保您正在测试正确的版本..也许您有编译问题..

干杯

答案 1 :(得分:2)

我在尝试提供assetlinks.json文件时遇到了这个问题。确实会出现以a开头的文件夹。在App Engine的静态上下文中无法访问。 JoãoAntunes解决方法的更通用版本如下。

首先,创建没有的文件夹。在开始时将任何所需的文件放在其中。

然后我们需要创建一个servlet,当收到对隐藏文件夹的请求时,它将使用正确的数据进行响应。

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by Will Calderwood on 17/05/2017.
 * <p>
 * It would appear to not be possible to upload hidden folders to app engine. So when files need
 * to be served from a hidden folder the URL can be bounced through this servlet
 */
public class StaticFileServer extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // We'll remove the dots from the path
        String uri = req.getRequestURI().replace("/.", "/");

        // Do anything else that needs doing here
        if (uri.toLowerCase().contains(".json")) {
            resp.setContentType("application/json");
        }

        // Read and return the resource from the non-hidden folder
        try (InputStream in = getServletContext().getResourceAsStream(uri)) {
            if (in == null){
                resp.sendError(404);
                return;
            }
            byte[] buffer = new byte[8192];
            int count;
            while ((count = in.read(buffer)) > 0) {
                resp.getOutputStream().write(buffer, 0, count);
            }
        }
    }
}

然后将以下内容添加到web.xml文件中,以将隐藏文件夹指向我们的servlet

<servlet>
    <servlet-name>StaticFileServer</servlet-name>
    <servlet-class>main.com.you.StaticFileServer</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>StaticFileServer</servlet-name>
    <url-pattern>/.well-known/*</url-pattern>
</servlet-mapping>

答案 2 :(得分:1)

静态文件未上传到应用程序服务器,因此应用程序代码无法访问。来自<static-files>部分的appengine-web.xml Reference

  

<强>&LT;静态文件&gt;

     

可选。 &lt; static-files&gt; 元素指定模式   匹配文件路径以包含和排除静态文件列表,   覆盖或修改默认行为。提供静态文件   来自独立的专用服务器和缓存   应用程序服务器,可用于提供静态内容,例如   图像,CSS样式表或JavaScript文件。

要让应用代码可以访问文件,需要在<resource-files>部分指定(与上述相同的文档):

  

<强>&LT;资源文件&gt;

     

可选。 &lt;中列出的文件资源文件&gt; 元素是   可以使用文件系统通过应用程序代码访问。这些文件   与应用程序存储在应用程序服务器上,而不是如何   静态文件存储和提供。

答案 3 :(得分:0)

我尝试了一切,但无法设法上传该隐藏文件夹。然后我为该路径定义了一个servlet映射,servlet写出了SSL发行者预期的验证字符串:

<servlet-mapping>
    <servlet-name>SSLVerificationServlet</servlet-name>
    <url-pattern>/.well-known/acme-challenge/roQH_vUmRQsuKH8lZGedft9O6TK-UoZWzv_kY8MukH4F8</url-pattern>
</servlet-mapping> 

答案 4 :(得分:0)

我找到了更好的方法,问题是代码存储在隐藏目录中,因此我们只需要将正确的URL映射到可见目录。

handlers: - url: /.well-known static_dir: _well-known

答案 5 :(得分:0)

一个丑陋但简单的解决方法是使用JSP支持来映射页面。一个例子:

package/src/main/webapp/_well-known/assetlinks.json.jsp中创建您的json文件

<%@ page contentType="application/json;charset=UTF-8" language="java"%>
[JSON CONTENT]

将“ servlet”映射到web.xml中的所需路径:

<servlet>
    <servlet-name>Asset Links</servlet-name>
    <jsp-file>/_well-known/assetlinks.json.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>Asset Links</servlet-name>
    <url-pattern>/.well-known/assetlinks.json</url-pattern>
</servlet-mapping>

完成!