我们在Tomcat6上启用了基本身份验证 . 用户在浏览器中进行身份验证,然后启动JNLP以在Java Web Start中启动应用程序 . 在启动时,java web start尝试从服务器下载jar文件,但它没有使用已经过浏览器验证的同一会话 . 基于论坛,我尝试使用sid属性在JNLP中传递会话ID,并在URL中附加 . 环境受到限制,因此每个请求都需要进行身份验证,我们不能说排除未经过身份验证的jar文件请求 . 下面是我的JSP创建JNLP文件,任何人都可以请求帮助我们如何继续相同的会话下载已经被浏览器验证的jar .
<% 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>
4 回答
我现在有(一些)答案....
我意识到这个问题已经有一年了,但由于这是谷歌在搜索这个问题时的第一个结果,我认为完成它是个好主意 .
您提供的jnlp代码存在一个问题,但首先,您必须检查将cookie添加到URL实际上是否正常工作.....这取决于您的应用程序部署配置 .
我不知道它是如何在Tomcat上...我正在使用weblogic,并且在其中你必须在weblogic.xml中检查以下属性
这意味着,如果可用,weblogic将从URL获取会话ID(使用与代码中相同的格式)
如果它是假的,那么这个解决方案将不起作用,你将不得不在每个请求中发送一个带有会话ID的cookie ....如果你找到了一个方法,那就请回复....它会帮助我很多 .
现在,如果url-rewriting-enable为true,那么一旦你在脚本中修复了以下问题,这种方法就可以了 .
问题是,一旦java web start从浏览器获取jnlp,它将再次从服务器下载它,因此您必须确保将会话ID添加到该请求中 . 你通过修改这样的初始标签来做到这一点:
就是这样,代码应该工作......
顺便说一下,你添加的属性:
与此无关,您可以删除它们,代码仍然有效 .
(我没有足够的权限来添加评论,所以我把它作为一个单独的答案 . )
Argod写道:
Argod,当你向 jnlp 元素添加 href 属性时,实际上让JWS再次从服务器下载jnlp文件 .
看看Unofficial Java Web Start/JNLP FAQ . 这是它说的:
我刚刚在本地检查了这个 . 使用 href 属性,jnlp文件实际上会被下载三次,并且jar文件会被下载一次 . 查看我的Tomcat日志:
注意最后如何分配新的JSESSIONID,这很糟糕 . 另一方面,没有 href 属性,jnlp文件被下载一次,jar文件被下载一次,并且JSESSIONID被保留:
另一个值得关注的是,像“sid”,“serviceHost”,“servicePort”这样的prorerty名称(如使用的OP)将被JWS拒绝 .
再次,请查看Unofficial Java Web Start/JNLP FAQ . 这是它说的:
这实际上同样适用于受信任/签名的JWS应用程序 .
因为您使用JSP创建JNPL,所以您可以使用某个安全令牌或会话ID向您的applet传递参数,然后您的applet必须在来自服务器的请求信息时传递该值 .
检查一下:Generate JNLP dynamically
你非常接近!但是你的安全层需要更多的组件 .
关键是baseURL变量,创建指向servlet的URL,而不是响应applet所需的文件,并向其附加安全令牌或票证 . 像这样:
使
codebaseServlet
提取并验证安全令牌并使用请求的文件进行响应 . 现在可以随意实现您的安全性 . 您可以使安全令牌有效一段时间,或者在用户会话存在时,验证请求即将到来的IP表单等 .检查:http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/applet/codebase_determination.html