2013-05-01 37 views
8

Chúng tôi đã bật xác thực cơ bản trên Tomcat6. Người dùng được xác thực trong trình duyệt và sau đó JNLP được khởi chạy để khởi chạy ứng dụng trong Java Web Start. Khi khởi động, web java bắt đầu cố tải xuống các tệp jar từ máy chủ nhưng không sử dụng cùng một phiên đã được trình duyệt xác thực. Dựa trên các diễn đàn tôi đã cố gắng chuyển id phiên trong JNLP bằng cách sử dụng thuộc tính sid cũng như được thêm vào URL. Môi trường bị hạn chế nên mỗi và mọi yêu cầu cần phải được xác thực, chúng tôi không thể nói để loại trừ các yêu cầu đối với tệp jar không được xác thực. Dưới đây là JSP của tôi tạo ra tập tin JNLP, bất cứ ai có thể vui lòng giúp đỡ làm thế nào chúng ta có thể tiếp tục cùng một phiên để tải về lọ đã được xác thực bởi trình duyệt.Tiếp tục phiên trình duyệt trong 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> 

Trả lời

1

Bởi vì bạn tạo JNPL của bạn với JSP bạn có thể vượt qua để applet của bạn một cuộc tranh cãi với một số thẻ an ninh hoặc các session ID, sau đó applet của bạn phải vượt qua giá trị mà khi thông tin yêu cầu từ máy chủ.

Kiểm tra này: Generate JNLP dynamically

+1

Tôi đang chuyển id phiên trong thông số bên như được đề cập trong mã. Các tham số này có thể được sử dụng nếu ứng dụng của tôi yêu cầu máy chủ nhưng JWS không sử dụng các tham số đó trong khi tải xuống các tệp jar từ máy chủ. Đó là vấn đề – Stauz

0

Bạn đang thực sự gần !, nhưng lớp bảo mật của bạn cần nhiều thành phần.

Khóa là biến baseURL, tạo URL để trỏ tới servlet hơn là trả lời với các tệp được yêu cầu bởi applet và thêm vào đó mã thông báo bảo mật hoặc vé. Như thế này:

/codebaseServlet/ABC123123 

để trích xuất và xác thực mã bảo mật và trả lời các tệp được yêu cầu. Và bây giờ có thể tự do thực hiện bảo mật của bạn như bạn muốn. Bạn có thể làm cho các thẻ an ninh để có giá trị trong một thời gian, hoặc trong khi user session tồn tại, xác nhận các IP hình yêu cầu được đến vv

Kiểm tra: http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/applet/codebase_determination.html

+0

Xác thực cho mỗi URL được yêu cầu không nằm trong tầm kiểm soát của chúng tôi, trong cơ chế gợi ý bạn đang nói rằng chúng tôi sửa đổi servlet của chúng tôi để tôn trọng mã thông báo bảo mật trong URL nhưng thực hiện tại xác thực môi trường sản xuất đang xảy ra thông qua lớp tùy chỉnh trong máy chủ web Apache và không một yêu cầu nào có thể liên lạc với Tomcat mà không cần xác thực. Vì vậy, trong ngắn hạn nếu mã thông báo bảo mật không được chuyển tiếp theo cách tiêu chuẩn vì nó xảy ra trong trình duyệt, yêu cầu thậm chí sẽ không đến được servlet. Có cách nào chúng tôi có thể nói với java web bắt đầu sử dụng thẻ bảo mật trong khi yêu cầu bình từ máy chủ? – Stauz

+0

Quá trình khởi động applet tải xuống các tệp yêu cầu của họ bên ngoài trình duyệt, vì vậy JAVA tải xuống tệp và tôi cho rằng nó không gửi bất kỳ cookie nào, nhưng tôi thấy một số liên kết cho biết họ yêu cầu bằng cookie được lấy từ trình duyệt, nhưng tôi có thể không đảm bảo với bạn điều này, nhưng URL là thực tế. –

3

bây giờ tôi có (một số) câu trả lời ....

Tôi nhận ra rằng câu hỏi này là một năm cũ, nhưng vì nó là kết quả đầu tiên trên google khi tìm kiếm vấn đề này, tôi đã tìm ra ý tưởng hay là hoàn thành nó.

Có một vấn đề với mã jnlp mà bạn đã cung cấp, nhưng trước tiên, bạn phải kiểm tra xem việc thêm cookie vào url có thực sự hoạt động hay không và điều đó phụ thuộc vào cấu hình triển khai ứng dụng của bạn.

Tôi không biết làm thế nào nó là trên Tomcat ... Tôi đang sử dụng WebLogic, và trong đó bạn phải kiểm tra trong weblogic.xml các tài sản sau đây

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

Điều này có nghĩa rằng, nếu có, WebLogic sẽ nhận id phiên từ URL (sử dụng cùng định dạng mà bạn có trong mã của mình)

Nếu sai, giải pháp này sẽ không hoạt động và bạn sẽ phải gửi cookie có id phiên trong mỗi yêu cầu .... và nếu bạn tìm thấy một cách để làm điều đó XIN trả lời .... nó sẽ giúp tôi rất nhiều.

ngay bây giờ, nếu url ghi đè bật là đúng, thì cách tiếp cận này sẽ hoạt động khi bạn khắc phục vấn đề sau trong tập lệnh của mình.

Vấn đề là, khi web java bắt đầu nhận được jnlp từ trình duyệt, nó sẽ tải xuống lại từ máy chủ, vì vậy bạn phải đảm bảo rằng bạn cũng thêm id phiên vào yêu cầu đó.bạn làm điều đó bằng modifiing thẻ ban đầu như thế này:

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

Và đó là nó, mã nên làm việc ...

bằng cách này, các thuộc tính mà bạn nói thêm:

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

không liên quan đến điều này, bạn có thể xóa chúng và mã sẽ vẫn hoạt động.

2

(Tôi không có đủ quyền để thêm một bình luận, vì vậy tôi đặt này như một câu trả lời riêng biệt.)

Argod đã viết:

Vấn đề là, một khi web java bắt đầu nhận được jnlp từ trình duyệt, nó sẽ tải xuống lại từ máy chủ, vì vậy bạn phải đảm bảo rằng bạn cũng thêm id phiên vào yêu cầu đó. bạn làm điều đó bằng modifiing thẻ ban đầu như thế này:

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

Argod, khi bạn thêm một thuộc tính href để jnlp yếu tố của bạn, bạn thực sự làm JWS để tải về các tập tin jnlp lại từ máy chủ .

Khám phá Unofficial Java Web Start/JNLP FAQ. Dưới đây là những gì nó nói:

Một thủ thuật là đảm bảo không bao gồm thuộc tính href trong tệp JNLP mà servlet của bạn gửi lại cho Web Start. Điều này sẽ báo cho Web Start vô hiệu hóa việc kiểm tra cập nhật trên các tệp JNLP và Web Start sẽ không coi mỗi tệp JNLP mới là bản cập nhật ứng dụng - chỉ các tệp jar được cập nhật mới có.

Tôi vừa kiểm tra địa phương này. Với thuộc tính href, tệp jnlp thực sự được tải xuống ba lần và tệp jar được tải xuống một lần. Xem nhật ký Tomcat của tôi:

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 

Lưu ý cách JSESSIONID mới được chỉ định cuối cùng, điều này không tốt. Mặt khác, không có href thuộc tính, tập tin jnlp được tải xuống một lần, và file jar được tải xuống một lần, và JSESSIONID được bảo tồn:

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 

Một địa điểm ưa thích, đó là tên prorerty như "sid" , "serviceHost", "servicePort" (như OP được sử dụng) sẽ bị JWS từ chối.

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

Một lần nữa, hãy xem Unofficial Java Web Start/JNLP FAQ. Đây là những gì nó nói:

Bạn chỉ có thể đặt thuộc tính cho ứng dụng không đáng tin cậy/chưa ký trong tệp khởi động XML nếu thuộc tính "đáng tin cậy". tính hiện đáng tin cậy bao gồm:

  • javaws *
  • jnlp *
  • javax.swing...defaultlf
  • sun.java2d.noddraw

Nói cách khác, nếu bạn muốn vượt qua tài sản của riêng bạn để tiền tố ứng dụng của bạn với javaws, ví dụ, sử dụng javaws.myproperty thay vì myProperty.

Điều tương tự cũng áp dụng cho các ứng dụng JWS đáng tin cậy/đã ký.

Các vấn đề liên quan