从javascript调用时,jnlp文件中的URL编码错误

时间:2017-02-13 09:40:46

标签: javascript jsp java-web-start

我正在尝试使用Javascript启动Java Web Start应用程序,而Javascript代码将包含url(window.location.origin)的参数发送到jnlp文件。我的问题是,在jnlp文件中,url编码不正确,即不是将http://localhost:7001/root写入文件,而是http\x3A\x2F\x2Flocalhost\x3A7001/root,因此无法启动我的应用程序。

我使用javascript(index.jsp)从jsp文件调用Java Web Start应用程序:

<%@ page language="java" pageEncoding="ISO-8859-1"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <script type="text/javascript">

      window.onload = function() {
        window.open('/root/my.jsp?hostname=' +window.location.origin+ '&date=' + Date.now());
      }
  </head>
  <body>
  </body>
</html>

我的jnlp文件(webStart.jsp):

<%@ page contentType="application/x-java-jnlp-file"%>
<?xml version="1.0" encoding="UTF-8"?>
  <jnlp spec="1.5" codebase="${param.hostname}/root/?v=${param.date}">
  <information>
    <title>title</title>
    <vendor>vendor</vendor>
  </information>
  <security>
    <all-permissions/>
  </security>
  <resources>
    <j2se version="1.7+"/>
    <jar href="my_application.jar"/>
  </resources>
  <applet-desc main-class="myPackage.main" name="my-applet" height="1" width ="1"/>
</jnlp>

我的应用服务器是Glassfish 3.1。我尝试更改UTF-8和ISO-8859-1编码,但始终得到相同的结果。还有什么可以解决这个问题?

编辑:我也尝试了encodeURIComponent(window.location.origin),但这没有改变任何内容。

1 个答案:

答案 0 :(得分:0)

使用window.location.protocolwindow.location.hostnamewindow.location.port构建网址并未处理网址中的破折号,因此更好的解决方案是使用Java代码对网址进行解码。

我的webStart.jsp文件如下所示:

<%@page import="java.net.URLDecoder"%>
<%@ page contentType="application/x-java-jnlp-file"%>
<% String hostname = URLDecoder.decode(request.getParameter("hostname").replace("\\x", "%"), "UTF-8"); %>
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.5" codebase="<%=hostname%>/root/?v=${param.date}">
  <information>
    <title>title</title>
    <vendor>vendor</vendor>
  </information>
  <security>
    <all-permissions/>
  </security>
  <resources>
    <j2se version="1.7+"/>
    <jar href="my_application.jar"/>
  </resources>
  <applet-desc main-class="myPackage.main" name="my-applet" height="1" width ="1"/>
</jnlp>