2013-05-01 52 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應用程序。