【问题标题】:Pass Class As Parameter in Javascript to Java将 Javascript 中的类作为参数传递给 Java
【发布时间】:2018-10-20 13:58:17
【问题描述】:

所以我最近加入了一个项目,他们使用 Java 作为游戏的后端,使用 JavaScript 作为与服务器通信的前端。我知道 JavaScript 是动态的,这很好,但如果我从服务器请求信息,他们有诸如 ...

之类的方法
public <T extends Component> T getProperty(Class<? extends Component> property, int id) {
    return (T) mapper.get(property).get(id);
}

您可以在这里看到问题,对吗?我将如何准确地在 JavaScript 中执行请求,将 .class 作为参数传递?我试过在网上搜索,但这似乎不是一个常见的问题?

【问题讨论】:

  • 什么意思,传入.class作为参数
  • 需要更多上下文。您可能可以构建一个可接受的类名的映射,并让您的 JS 传递这些名称。服务器端点将从名称转换为类。未经审查的原始类名听起来像是一个安全问题。

标签: javascript java parameter-passing


【解决方案1】:

前端的语言无关紧要。

想一想 - 前端如何与服务器通信?我想它通过HTTP,对吧?所以无论你使用哪种语言,它都必须创建标准的 HTTP 请求,其中包含一些标头、字段等。

我不知道你的项目,但通常来自前端的调用通过一些组件转换为标准 Java 实例,因此你可以有效地使用它(即接收表单数据或 JSON 并创建具有这些字段的类的实例)

【讨论】:

    【解决方案2】:

    您可以发送类名,而不是:

    public <T extends Component> T getProperty(String propertyClassName, int id) {
        return (T) mapper.get(Class.forName(propertyClassName)).get(id);
    }
    

    请注意,这是客户端和服务器之间紧密耦合的标志。有替代的协议级机制来传递此信息,例如仅基于枚举的“类型”,这样可以轻松记录并最大限度地减少服务器和客户端之间更改的相互影响。

    【讨论】:

    • 哦!基于枚举的类型听起来也不错。你说的是有一个以 .class 为值的枚举,对吧?
    • @JonNguyen 这在很大程度上取决于您用来公开服务的框架。但是将服务器的实现知识暴露给客户端通常是一个坏主意,这就是为什么会有诸如 REST 和许多其他 Web 框架之类的架构的原因。 关于我的“枚举”评论:我的意思是,如果您对自己的服务有一个清晰的 API 定义,那么理想情况下,您应该为要返回的实体提供一个模型。在这种情况下,枚举值将适合替换类名等私密信息。这只是一种方法或替代实现(虽然更安全)
    • 抛开紧耦合不谈,服务器至少应该有一个可接受类名的白名单。否则,恶意客户端可能会触发随机类加载。但我同意,“稳定”名称的独立于实现的映射更好。
    猜你喜欢
    • 2013-01-28
    • 2012-06-09
    • 1970-01-01
    • 2012-01-07
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多