2013-05-01 50 views
8

浏览器会话,我们有启用的tomcat6基本身份验证。用户在浏览器中进行身份验证,然后启动JNLP以在Java Web Start中启动应用程序。在启动时,java web start尝试从服务器下载jar文件,但它没有使用已被浏览器认证的同一会话。基于论坛,我试图通过使用sid属性在JNLP中传递会话ID以及在URL中追加。环境受到限制,因此每个请求都需要进行身份验证,我们不能说排除对未被验证的jar文件的请求。下面是我的JSP创建JNLP文件,任何人都可以请帮助我们如何继续同一会话来下载已被浏览器认证的jar。继续JNLP

<% response.setContentType("application/x-java-jnlp-file"); %> 
<%= "<?xml version=\"1.0\" encoding=\"utf-8\"?>" %> 
<!-- JNLP File for SimpleTableDemo --> 
<% 
String baseURL = request.getRequestURL().toString().replace(request.getRequestURI(), request.getContextPath()); 
%> 
<jnlp codebase="<%=baseURL%>"> 

    <information> 
     <title>Simple Table Demo Application</title> 
     <vendor>Try</vendor> 
     <description>SimpleTableDemo</description> 
     <description kind="short">An application that demonstrates a simple table.</description> 
    </information> 

    <resources> 
     <j2se version="1.6+" /> 
     <property name="sid" value="<%=request.getSession().getId()%>" /> 
     <property name="serviceHost" value="<%=request.getServerName()%>"/> 
     <property name="servicePort" value="<%=request.getServerPort()%>"/> 
     <jar href="AuthenticateJNLPJars.jar;JSESSIONID=<%=request.getSession().getId()%>" /> 
    </resources> 

    <application-desc main-class="SimpleTableDemo" > 
    </application-desc> 
</jnlp> 

回答

1

因为你创建你的JSP你JNPL可以传递给你的小程序的一些安全令牌或会话ID参数,那么你的小应用程序必须通过该值时,从服务器请求信息。

检查: Generate JNLP dynamically

+1

我正在通过代码中提到的侧参数的会话ID。如果我的应用程序发出服务器请求,但可以使用这些参数,但JWS在从服务器下载jar文件时未使用该参数。这是问题 – Stauz 2013-05-01 10:31:33

0

你是真的很近!但您的安全层需要更多的组件。

的关键是可变的基本URL,创建一个URL指向一个servlet比由小应用程序所需的文件作出回应,并追加到它的安全令牌或票。就像这样:

/codebaseServlet/ABC123123 

充分利用codebaseServlet提取和验证安全令牌,并请求的文件的响应。 现在可以随心所欲地实现您的安全。您可以使安全令牌的一段时间内有效,或在用户会话中,验证IP形式的请求来了,等

检查: http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/applet/codebase_determination.html

+0

每个请求的URL的身份验证不在我们的控制之中,在您所说的建议机制中,我们一定会修改我们的servlet以尊重URL中的安全性令牌,但在生产环境中执行时通过Apache Web服务器中的自定义层进行身份验证没有一个请求可以在没有认证的情况下到达Tomcat。因此,简而言之,如果安全令牌没有以标准方式转发,就像在浏览器中发生的那样,请求甚至不会到达servlet。有什么方法可以告诉java web开始在从服务器请求jar时使用安全令牌吗? – Stauz 2013-05-02 07:54:42

+0

小程序启动过程在浏览器之外下载他们需要的文件,所以JAVA下载文件,我想它不会发送任何cookie,但我发现了一些链接,说他们请求使用从浏览器获取的cookie,但我可以我向你保证,但网址是事实。 – 2013-05-02 19:25:08

3

我现在有(部分)答案....

我意识到这个问题是一岁,但由于它`对谷歌的第一个结果对于这个问题,我想这是一个好主意,它完成搜索时。

有一个问题,你所提供的JNLP代码,但首先,你必须检查是否添加cookie来的URL将实际工作.....那要看你的应用程序部署配置。

我不知道它是如何在Tomcat ...我使用的WebLogic,并在它你必须检查在weblogic.xml下列财产

<session-descriptor> 
     <url-rewriting-enabled>true</url-rewriting-enabled> 
</session-descriptor> 

这意味着,如果有的话,weblogic的将会从URL中获得会话ID(使用您在代码中使用的相同格式)

如果它是错误的,那么此解决方案将不起作用,您将不得不在每个请求中发送一个包含会话ID的cookie ....如果你找到了一种方法来做这件事,请回应....它会帮助我很多。

现在,如果URL重写启用是真的,那么这个方法将一旦你在你的脚本解决以下问题的工作。

问题是,一旦java web start从浏览器获取jnlp,它将从服务器再次下载它,因此您必须确保您也将该会话ID添加到该请求中。你做到这一点modifiing这样的初始标签:

<jnlp spec="1.0+" codebase="<%=baseURL%>" href="<%=NAME_OF_JNLP%>;JSESSIONID=<%=SESSION_ID%>"> 

,就是这样,代码应该工作...

顺便说一下,您添加的属性:

​​

与此无关,您可以删除它们,代码仍然可以使用。

2

(我没有足够的权限添加评论,所以我把这个作为一个单独的答案。)

Argod写道:

的问题是,一旦的Java Web开始从浏览器获取jnlp,它将从服务器再次下载它,因此您必须确保将会话ID也添加到该请求中。你做到这一点modifiing这样的初始标签:

<jnlp spec="1.0+" codebase="<%=baseURL%>" href="<%=NAME_OF_JNLP%>;JSESSIONID=<%=SESSION_ID%>"> 

Argod,当您在HREF属性添加到您的JNLP元素,你竟然让JWS从服务器再次下载JNLP文件。

结账Unofficial Java Web Start/JNLP FAQ。它是这样说的:

一个技巧是确保不在你的servlet发送回Web Start的JNLP文件中包含href属性。这将告诉Web Start禁用JNLP文件的更新检查,并且Web Start不会将每个新的JNLP文件视为应用程序更新 - 只有更新后的jar文件可以。

我刚刚在本地检查过。有了这个属性,jnlp文件实际上被下载了三次,并且jar文件被下载了一次。请参阅我的Tomcat日志:

127.0.0.1 ... "GET /my-servlet/jws/myjws.jnlp;JSESSIONID=58080491243456B6A653682FA0A3A738 HTTP/1.1" 200 741 
127.0.0.1 ... "GET /my-servlet/jws/myjws.jnlp;JSESSIONID=58080491243456B6A653682FA0A3A738 HTTP/1.1" 200 741 
127.0.0.1 ... "GET /my-servlet/jws/myjws.jnlp;JSESSIONID=342082FEA657D765699EADAF5486E9A7 HTTP/1.1" 200 741 
127.0.0.1 ... "GET /my-servlet/jws/myjws.jar;JSESSIONID=342082FEA657D765699EADAF5486E9A7 HTTP/1.1" 200 7555 

注意如何在最后分配新的JSESSIONID,这很糟糕。在另一方面,没有HREF属性,JNLP文件被下载一次,和JAR文件被下载一次,并JSESSIONID被保留:

127.0.0.1 ... "GET /my-servlet/jws/myjws.jnlp;JSESSIONID=58080491243456B6A653682FA0A3A738 HTTP/1.1" 200 672 
127.0.0.1 ... "GET /my-servlet/jws/myjws.jar;JSESSIONID=58080491243456B6A653682FA0A3A738 HTTP/1.1" 200 7555 

另一景点,就像是“SID”那prorerty名,“serviceHost”,“servicePort”(如使用的OP)将被JWS拒绝。

<property name="sid" value="<%=request.getSession().getId()%>" /> 
<property name="serviceHost" value="<%=request.getServerName()%>"/> 
<property name="servicePort" value="<%=request.getServerPort()%>"/> 

再次检查出Unofficial Java Web Start/JNLP FAQ。以下是它所说的内容:

如果属性为“受信任”,则只能在XML启动文件中为不受信任/未签名的应用程序设置属性。目前值得信赖的属性包括:

  • javaws的*
  • JNLP *
  • javax.swing中。defaultlf
  • sun.java2d.noddraw

换句话说,如果你想自己的财产传给与javaws的您的应用程序作为前缀,例如,而是使用myProperty的的javaws.myproperty。

实际上适用于可信任/签名的JWS应用程序。