8

Tomcat6 で基本認証を有効にしました。ユーザーがブラウザで認証された後、JNLP が起動され、Java Web Start でアプリケーションが起動されます。起動時に、Java Web Start はサーバーから jar ファイルをダウンロードしようとしますが、ブラウザーによって既に認証されている同じセッションを使用していません。フォーラムに基づいて、sid プロパティを使用し、URL に追加して、JNLP でセッション ID を渡そうとしました。環境が制限されているため、すべてのリクエストを認証する必要があるため、認証されていない jar ファイルのリクエストを除外するとは言えません。以下はJNLPファイルを作成する私のJSPです。ブラウザによってすでに認証されている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

4 に答える 4

3

私は今(いくつかの)答えを持っています....

この質問は 1 年前のものであることは承知していますが、この問題を検索したときの Google での最初の結果なので、完了するのは良い考えだと思いました。

あなたが提供した jnlp コードには 1 つの問題がありますが、最初に、URL に Cookie を追加することが実際に機能するかどうかを確認する必要があります。これは、アプリの展開構成によって異なります。

Tomcat でどのようになっているのかわかりません... weblogic を使用していますが、weblogic.xml で次のプロパティをチェックインする必要があります。

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

これは、利用可能な場合、weblogic が URL からセッション ID を取得することを意味します (コードにあるのと同じ形式を使用します)。

false の場合、このソリューションは機能せず、各リクエストでセッション 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()%>"/> 

これに関連しない場合は、それらを削除してもコードは引き続き機能します。

于 2014-09-26T13:08:17.560 に答える
2

(コメントを追加するのに十分な権限がないため、これを別の回答にしています。)

アルゴッドは次のように書いています。

問題は、Java Web Start がブラウザーから jnlp を取得すると、サーバーから再度ダウンロードするため、その要求にもセッション ID を追加する必要があることです。これを行うには、最初のタグを次のように変更します。

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

Argod、href属性をjnlp要素に追加すると、実際には JWS がサーバーから jnlp ファイルを再度ダウンロードするようになります。

非公式 Java Web Start/JNLP FAQ を確認してください。これがそれが言うことです:

1 つの秘訣は、サーブレットが Web Start に送り返す JNLP ファイルに href 属性を含めないようにすることです。これにより、Web Start は JNLP ファイルの更新チェックを無効にするようになり、Web Start は新しい JNLP ファイルをアプリケーションの更新として扱わず、更新された jar ファイルのみを処理します。

私はこれをローカルで確認しました。href属性を使用すると、実際には jnlp ファイルは 3 回ダウンロードされ、jar ファイルは 1 回ダウンロードされます。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 ファイルは 1 回ダウンロードされ、jar ファイルは 1 回ダウンロードされ、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

もう 1 つの興味深い点は、"sid"、"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

つまり、独自のプロパティをアプリにプレフィックスとして渡したい場合は、たとえば、myproperty の代わりに javaws.myproperty を使用します。

実際には、信頼できる/署名された JWS アプリケーションにも同じことが当てはまります。

于 2016-02-02T10:42:39.583 に答える
0

あなたは本当に近づいています!しかし、あなたのセキュリティレイヤーにはより多くのコンポーネントが必要です.

キーは baseURL 変数で、アプレットに必要なファイルで応答するサーブレットを指す URL を作成し、それにセキュリティ トークンまたはチケットを追加します。このような:

/codebaseServlet/ABC123123

を作成しcodebaseServletてセキュリティ トークンを抽出および検証し、要求されたファイルで応答します。そして今、あなたが望むようにあなたのセキュリティを自由に実装してください. セキュリティトークンをしばらくの間有効にするか、ユーザーセッションが存在する間、リクエストが来ている IP フォームを検証することができます。

チェック: http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/applet/codebase_determination.html

于 2013-05-01T19:02:28.100 に答える