jhipster 刷新 url 导致“无法获取 /user-management”

Posted

技术标签:

【中文标题】jhipster 刷新 url 导致“无法获取 /user-management”【英文标题】:jhipster refresh url cause "Cannot GET /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,让用户输入#好像很奇怪。 【参考方案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 服务中的,这就是为什么不需要区分客户端和服务器路由的原因。服务器只提供客户端使用的静态资产。

以上是关于jhipster 刷新 url 导致“无法获取 /user-management”的主要内容,如果未能解决你的问题,请参考以下文章

jhipster中通过id限制URL访问控制

markdown Spring / Eureka / Jhipster-Registry:获取微服务URL

URL 清理导致嵌入式 YouTube 视频的刷新

Jhipster 隐藏不记名令牌

JHipster/Angular 配置如何确定它需要使用 index.html 文件?

Angular UI-Router,在 URL 刷新时找不到 [重复]