首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >反向代理(nginx或apache)背后的gwt问题如何解决?

反向代理(nginx或apache)背后的gwt问题如何解决?
EN

Stack Overflow用户
提问于 2018-03-02 00:38:04
回答 2查看 0关注 0票数 0

我在使用GWT时遇到了此问题,因为它位于反向代理之后。后端应用程序部署在上下文中 - 我们称之为/上下文。

当我直接点击它时,GWT应用程序工作正常:

HTTP://host:8080 /context/

我可以在它前面配置一个反向代理。这是我的nginx例子:

upstream backend {
    server 127.0.0.1:8080;
}

...

location / {
   proxy_pass        http://backend/context/;
}

但是,当我通过反向代理运行时,GWT会感到困惑,说:

2009-10-04 14:05:41.140:/:WARN:  Login: ERROR: The serialization policy file '/C7F5ECA5E3C10B453290DE47D3BE0F0E.gwt.rpc' was not found; did you forget to include it in this deployment?
2009-10-04 14:05:41.140:/:WARN:  Login: WARNING: Failed to get the SerializationPolicy 'C7F5ECA5E3C10B453290DE47D3BE0F0E' for module 'https://hostname:444/'; a legacy, 1.3.3 compatible, serialization policy will be used.  You may experience SerializationExceptions as a result.
2009-10-04 14:05:41.292:/:WARN:  StoryService: ERROR: The serialization policy file '/0445C2D48AEF2FB8CB70C4D4A7849D88.gwt.rpc' was not found; did you forget to include it in this deployment?
2009-10-04 14:05:41.292:/:WARN:  StoryService: WARNING: Failed to get the SerializationPolicy '0445C2D48AEF2FB8CB70C4D4A7849D88' for module 'https://hostname:444/'; a legacy, 1.3.3 compatible, serialization policy will be used.  You may experience SerializationExceptions as a result.

换句话说,GWT没有得到它需要预先加入/上下文/查找C7F5ECA5E3C10B453290DE47D3BE0F0E.gwt.rpc的字样,但只有当请求通过代理服务器时才需要。解决方法是将该上下文添加到网站的url中:

location /context/ {
    proxy_pass        http://backend/context/;
}

但这意味着上下文现在成为用户看到的url的一部分,这很难看。

有人知道如何让GWT在这种情况下快乐吗?

软件版本: GWT - 1.7.0(与1.7.1相同的问题) Jetty - 6.1.21(但在tomcat下存在同样的问题) nginx - 0.7.62(apache 2.x下的同样的问题)

我使用DonsProxy查看了代理和后端之间的流量,但没有什么值得注意的地方。

EN

回答 2

Stack Overflow用户

发布于 2018-03-02 09:26:52

我相当确定这里的正确答案是修补源并提交错误报告。另一个选择是在/后端运行GWT应用程序。

我更喜欢前者,但后者也应该起作用。如果确实需要将事情分离到多个环境中,请使用不同的端口号?

票数 0
EN

Stack Overflow用户

发布于 2018-03-02 09:42:32

我有同样的问题,并且我打开了一个错误报告:

http://code.google.com/p/google-web-toolkit/issues/detail?id=4817

问题在于它被标记为“As Design”,所以我认为它不会被修复。

我为我找到了这个解决方案。我扩展了RemoteServiceServlet类,并强制GWT从ContextName而不是URL开始加载序列化策略文件。然后我扩展我的服务我的类而不是RemoteServiceServlet类。通过这种方式,应用程序将从它将被调用的URL中取消链接。

这里有我的自定义类:

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.google.gwt.user.server.rpc.SerializationPolicy;
import com.google.gwt.user.server.rpc.SerializationPolicyLoader;

public class MyRemoteServiceServlet extends RemoteServiceServlet
{
    @Override
    protected SerializationPolicy doGetSerializationPolicy(HttpServletRequest request, String moduleBaseURL, String strongName)
    {
        return MyRemoteServiceServlet.loadSerializationPolicy(this, request, moduleBaseURL, strongName);
    }


    /**
      * Used by HybridServiceServlet.
      */
      static SerializationPolicy loadSerializationPolicy(HttpServlet servlet,
      HttpServletRequest request, String moduleBaseURL, String strongName) {
    // The serialization policy path depends only by contraxt path
    String contextPath = request.getContextPath();

    SerializationPolicy serializationPolicy = null;


    String contextRelativePath = contextPath + "/";



      String serializationPolicyFilePath = SerializationPolicyLoader.getSerializationPolicyFileName(contextRelativePath
          + strongName);

      // Open the RPC resource file and read its contents.
      InputStream is = servlet.getServletContext().getResourceAsStream(
          serializationPolicyFilePath);
      try {
        if (is != null) {
          try {
        serializationPolicy = SerializationPolicyLoader.loadFromStream(is,
            null);
          } catch (ParseException e) {
        servlet.log("ERROR: Failed to parse the policy file '"
            + serializationPolicyFilePath + "'", e);
          } catch (IOException e) {
        servlet.log("ERROR: Could not read the policy file '"
            + serializationPolicyFilePath + "'", e);
          }
        } else {
          String message = "ERROR: The serialization policy file '"
          + serializationPolicyFilePath
          + "' was not found; did you forget to include it in this deployment?";
          servlet.log(message);
        }
      } finally {
        if (is != null) {
          try {
        is.close();
          } catch (IOException e) {
        // Ignore this error
          }
        }
      }

    return serializationPolicy;
      }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档