2012-01-12 32 views
6

Làm thế nào tôi có thể mã một cuộc gọi jquery ajax() (ví dụ XMLHttpRequest) để bảo tồn các session ID (ví dụ như gửi cookie 'jsessionID' đã có trong các tập tin cookie của trình duyệt)Tái sử dụng jsessionId trên XMLHttpRequest ajax sử dụng jquery

bối cảnh của chúng tôi:

  • Hai java ứng dụng dựa trên web
  • SSO cơ chế đăng nhập tài khoản vào cả hai ứng dụng (ví dụ có phiên 101 với ứng dụng A và phiên 202 với ứng dụng B)
  • Một pplication "A" sử dụng javascript (jquery) để làm cho phần còn lại các cuộc gọi đến các ứng dụng B
  • Application B thực hiện API còn lại trong Java jersey (fwiw)
  • Tất cả GET và "bài viết dạng cũ-học" từ ứng dụng A đến B kết nối đến cùng một phiên # 202 trên "phiên B"
  • XmlHttpRequests (ví dụ các cuộc gọi jquery 'ajax()') không sử dụng lại phiên # 202. Mỗi XmlHttpRequest nhận phiên mới

Tại sao phiên mới?

Lý do: XmlHttpRequest không chuyển bất kỳ cookie nào vào ứng dụng B. Bộ chứa Servlet đặt jsessionid trong cookie. Server không có được jsessionid

Ngược lại, JSONP gọi (mà tự động tạo < script src = "http: //server/b/page.x" >) làm vượt qua cookie.

Những câu hỏi

  • cách dễ nhất để có được XMLHttpRequest ajax gọi để vượt qua id phiên (cookies) với mục tiêu ứng dụng là gì?
  • Bất kỳ tham khảo nào tốt về ajax, cookie, xmlhttprequest và REST?
  • Có ai có thể khuyên bạn nên đọc về thiết kế và xác thực API REST không?

Sessions Web, Nhà nước, và xác thực

Tôi biết phần còn lại là nghĩa vụ phải được quốc tịch, và tái sử dụng phiên web có vẻ hơi mỏng manh (ví dụ như trái ngược với sử dụng OAuth và xác thực thẻ, cũng như netflix)

Đây là lần lặp đầu tiên và chúng tôi đã gần đạt được mọi thứ "hoạt động". Điều này làm việc tốt với JSONP, nhưng các bài viết XmlHttpRequest không thành công.

cảm ơn trước

Cập nhật:

Một câu hỏi ngây thơ thực sự.

Nó chỉ ra rằng đăng qua trang web qua xmlhttprequest/ajax có các vấn đề bảo mật vốn có và giải pháp. Firefox, ví dụ, sẽ không chuyển cookie với XmlHttpRequest trừ khi bạn thêm các tiêu đề đặc biệt.Firefox sau đó sẽ thực hiện 'kiểm tra trước chuyến bay' (tức là một cuộc gọi OPTIONS http) đến máy chủ để xem "điều này có ổn không?". Máy chủ của bạn cần trả lời cuộc gọi "OPTIONS" cho biết "yes it's ok" trước khi firefox thực hiện "bài đăng với cookie" của bạn.

IE và Firefox giải quyết các vấn đề này khác nhau (ví dụ: một chút như javascript vào khoảng năm 1998). Tôi không biết những gì IE làm, nhưng đã sống qua năm 1998, chúng tôi không muốn thực sự đi xuống con đường đó nếu có thể.

Chúng tôi đã mã hóa một giải pháp thay thế.

Không ai trong nhóm của chúng tôi biết điều này khi chúng tôi bắt đầu viết mã. (Ví dụ: "jsonp làm việc rất lớn trong nguyên mẫu; mọi thứ khác cũng nên")

Tài liệu tham khảo: Làm thế nào Mozilla giải quyết vấn đề này (http header và kiểm tra preflight) https://developer.mozilla.org/En/HTTP_access_control

Chữ thập xứ Resource Sharing: http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

+0

Bạn có thể mô tả cách giải quyết mà bạn đã đề cập không? – jmend

+0

Chúng tôi đã chuyển mã thông báo xác thực sso dưới dạng thông số yêu cầu và sửa đổi phía máy chủ để kiểm tra tham số này. Nó ngửi thấy mùi một chút, nhưng rất nhất quán và đơn giản. Chúng tôi đã làm * không * cố gắng để vượt qua xung quanh jsessionId tomcat như một tham số như vậy sẽ không hoạt động. – user331465

+0

Cảm ơn, điều đó có ý nghĩa. – jmend

Trả lời

1

Bạn cũng có thể giải quyết vấn đề này bằng cách triển khai proxy nhà nước-ful. Họ sẽ phải được cài đặt trên cả hai ứng dụng. Sau đó bạn sẽ thực hiện tất cả các cuộc gọi dựa trên phiên của bạn thông qua proxy và lưu trữ dữ liệu phiên từ xa vào phiên proxy cục bộ của bạn.

+0

Ý tưởng thú vị và hữu ích. Bạn có thể trỏ đến một proxy trạng thái nguồn mở. Ngoài ra, để làm rõ, bạn có nghĩa là "tất cả các cuộc gọi http ứng dụng sẽ thông qua proxy trạng thái này", ngoại trừ "công cụ tĩnh", tức là css/gif/jpg, v.v. – user331465

+0

Có, các cuộc gọi http đến ứng dụng khác của bạn sẽ đi qua proxy này. Bạn proxy sẽ được viết bằng cách sử dụng một số loại giao thức curl. – jonycheung

+0

http://stackoverflow.com/questions/5731815/php-curl-proxy-how-to-make-multi-user-cookie-jar là một tài liệu tham khảo tốt. Ngoài ra hãy xem tài liệu tham khảo php curl http://php.net/manual/en/function.curl-setopt.php. Về cơ bản, bạn cần viết một proxy để lưu cookie. Tôi sẽ xem nếu tôi có thể tìm thấy mã của một proxy tôi đã viết trước đây. – jonycheung

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