【问题标题】:jhipster refresh url cause "Cannot GET /user-management"jhipster 刷新 url 导致“无法获取 /user-management”
【发布时间】:2018-07-12 00:47:50
【问题描述】:

我成功创建了一个jhipster应用,然后用admin/admin登录,点击user-management,一切正常,url变为localhost:9000/user-management。

但是,当我使用 chrome 刷新按钮刷新 url 时,页面中断并显示消息:“Cannot GET /user-management”,按 F12 启动调试器后,控制台中出现以下错误消息:

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“default-src 'self'”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-GKWAMtgBzlCzmucztJIeDl/kD0MKNqAT5HDcFIff2+A=”)或随机数(“nonce-...”)。另请注意,'script-src' 未显式设置,因此 'default-src' 用作后备。

请帮忙,提前谢谢。

注意:yarn v1.3.2, "@angular/core": "5.2.0", java 1.8, jwt, elastic search, 中文, mysql, angular 5

【问题讨论】:

  • 您的网址看起来很奇怪,因为它不包含#
  • 我设置了useHash: false,因为我想同时支持www.xxx.com和www.xxx.com/admin,让用户输入#好像很奇怪。

标签: angular jhipster angular5 yarnpkg


【解决方案1】:

如果您设置useHash: false 并单击刷新,请求将发送到服务器,因此您会得到这个确切的错误:服务器正在处理客户端路由但未找到。所以你必须使用 servlet 过滤器来适配服务器端,详见https://github.com/jhipster/generator-jhipster/issues/4794#issuecomment-304097246

另请注意,这种方法不适用于微服务架构中的网关。

这是一个您可以调整的过滤器示例,它将客户端路由的请求转发到“/”,以便它们由 index.html 中的 Angular 应用程序解释:

public class AngularRouteFilter extends OncePerRequestFilter {

    // add the values you want to redirect for
    private static final Pattern PATTERN = Pattern.compile("^/((api|swagger-ui|management|swagger-resources)/|favicon\\.ico|v2/api-docs).*");

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain)
        throws ServletException, IOException {
        if (isServerRoute(request)) {
            filterChain.doFilter(request, response);
        } else {
            RequestDispatcher rd = request.getRequestDispatcher("/");
            rd.forward(request, response);
        }
    }

    protected static boolean isServerRoute(HttpServletRequest request) {
        if (request.getMethod().equals("GET")) {
            String uri = request.getRequestURI();
            return PATTERN.matcher(uri).matches();
        }
        return true;
    }
}

【讨论】:

  • 谢谢@Marziou,我会试试这个过滤器。只是困惑,当我在 angular.io (useHash: false) 中尝试官方英雄教程时,刷新 url 看起来没问题,我使用 fiddler 监控响应是“HTTP/1.1 304 Not Modified”。
  • angular.io 上的英雄教程不使用任何服务器 API,数据不是从服务器获取的,而是硬编码在 Angular 服务中的,这就是为什么不需要区分客户端和服务器路由的原因。服务器只提供客户端使用的静态资产。
猜你喜欢
  • 2019-03-01
  • 2022-12-14
  • 2016-02-04
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多