我们在Tomcat6上启用了基本身份验证。在浏览器中对用户进行身份验证,然后启动JNLP以在Java Web Start中启动应用程序。在启动时,Java Web Start尝试从服务器下载jar文件,但未使用已由浏览器进行身份验证的会话。基于论坛,我尝试使用sid属性以及在URL中附加JNLP中的会话ID。环境是受限制的,因此每个请求都需要进行身份验证,我们不能说排除对未经身份验证的jar文件的请求。以下是我的JSP创建的JNLP文件,任何人都可以帮助我们如何继续进行相同的会话以下载已由Browser进行身份验证的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>
最佳答案
我现在有(一些)答案。
我意识到这个问题已经有一年历史了,但是由于它是搜索该问题时在Google上的第一个结果,因此我认为这是一个很好的主意。
您提供的jnlp代码有一个问题,但是首先,您必须检查将cookie添加到url是否真的可以工作......这取决于您的应用程序部署配置。
我不知道它在Tomcat上的状况如何...我正在使用weblogic,在其中您必须检入weblogic.xml中的以下属性
<session-descriptor>
<url-rewriting-enabled>true</url-rewriting-enabled>
</session-descriptor>
这意味着,如果可用,weblogic将通过URL获取会话ID(使用代码中的格式)
如果为假,则此解决方案将不起作用,并且您将必须在每个请求中发送带有会话ID的Cookie ..如果您找到了一种方法,请响应....它将对我有帮助很多。
现在,如果url-rewriting-enable为true,则在脚本中解决以下问题后,此方法将起作用。
问题是,一旦Java Web Start从浏览器获取了jnlp,它将再次从服务器下载它,因此您必须确保还将会话ID添加到该请求中。您可以通过如下方式修改初始标签来做到这一点:
<jnlp spec="1.0+" codebase="<%=baseURL%>" href="<%=NAME_OF_JNLP%>;JSESSIONID=<%=SESSION_ID%>">
就是这样,代码应该可以工作了……
顺便说一句,您添加的属性:
<property name="sid" value="<%=request.getSession().getId()%>" />
<property name="serviceHost" value="<%=request.getServerName()%>"/>
<property name="servicePort" value="<%=request.getServerPort()%>"/>
与此无关,您可以删除它们,并且代码仍然可以使用。