代码之家  ›  专栏  ›  技术社区  ›  powtok

chrome和edge无法加载跨原点源地图

  •  0
  • powtok  · 技术社区  · 2 年前

    我想启动GWTSuperDevMode并在Chrome或Edge的DevTools上设置断点,但之前我可以查看源代码并设置断点。 但是,由于最近的浏览器更新,不会显示源。

    用于本地启动

    Web container: http://127.0.0.1:8888/
    souecemap: http://127.0.0.1:9876/
    

    所以这是一个交叉起源,但当我用Chrome的DevTools检查它时,

    DevTools failed to load source map: Could not load content for http://127.0.0.1:8888/sourcemaps/GwtModule/gwtSourceMap.json: HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE
    

    显示在控制台中作为警告。

    但是,源映射规范是

    //# sourceMappingURL=http://127.0.0.1:9876/sourcemaps/GwtModule/gwtSourceMap.json
    

    它指出。 因此,端口规范似乎被浏览器强制重写(9876->8888)。

    这种行为是由于安全增强吗? 或者它只是一个bug?

    0 回复  |  直到 2 年前
        1
  •  0
  •   powtok    2 年前

    该问题出现在GWT2.6.1中,可能已在以后的版本中得到解决。 为了处理GWT2.6.1,在gwt-dev.jar中自定义JettyLauncher.java,通过Filter为8888端口origin的sourcemap请求检索并返回9999端口origin,并将该类添加到项目中。您可以将其放置在src中并使用它来处理它。

    com.google.gwt.dev.shell.jetty.JettyLauncher.java(自定义。添加wac.addFilter())

      protected JettyServletContainer createServletContainer(TreeLogger logger,
          File appRootDir, Server server, WebAppContext wac, int localPort) {
          wac.addFilter(SourcemapFilter.class, "/sourcemaps/GwtModule/gwtSourceMap.json", EnumSet.of(DispatcherType.INCLUDE,DispatcherType.REQUEST));
          return new JettyServletContainer(logger, server, wac, localPort, appRootDir);
      }
    

    com.google.gwt.dev.shell.jetty.SourcemapFilter.java(自定义新类)

    public class SourcemapFilter implements Filter {
    
        @SuppressWarnings("unused")
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // noop
        }
    
        @SuppressWarnings("unused")
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) arg0;
            HttpServletResponse response = (HttpServletResponse) arg1;
            String proxyURL =
                    "http://" + request.getServerName() + ":" + System.getProperty("gwt.codeserver.port") + request.getRequestURI();
            System.out.println("[Sourcemap proxy filter] proxyURL: " + proxyURL);
            URL url = new URL(proxyURL);
            InputStream is = url.openStream();
            int value;
            while ((value = is.read()) != -1) {
                response.getWriter().write(value);
            }
            is.close();
        }
    
        @Override
        public void destroy() {
            // noop
        }
    
    }