2008-09-17 29 views
22

Theo mặc định, tomcat sẽ tạo cookie phiên cho tên miền hiện tại.Cách tốt nhất để cho phép cookie phiên miền phụ sử dụng Tomcat

Nếu bạn đang ở trên www.example.com, cookie của bạn sẽ được tạo cho www.example.com (sẽ chỉ hoạt động trên www.example.com). Trong khi example.com nó sẽ được tạo cho .example.com (hành vi mong muốn, sẽ hoạt động trên bất kỳ tên miền phụ nào của example.com cũng như chính example.com).

Tôi đã nhìn thấy một vài van Tomcat dường như chặn việc tạo cookie phiên và tạo cookie thay thế bằng tên miền .example.com chính xác, tuy nhiên không có cookie nào hoạt động hoàn hảo và tất cả dường như rời khỏi cookie hiện tại và chỉ tạo một cookie mới. Điều này có nghĩa là hai cookie JSESSIONID đang được gửi với mỗi yêu cầu.

Tôi đã tự hỏi liệu có ai có giải pháp dứt khoát cho vấn đề này không.

Trả lời

28

Điều này dường như được hỗ trợ qua cài đặt cấu hình trong 6.0.27 trở đi:

Cấu hình được thực hiện bằng cách chỉnh sửa META-INF/context.xml

< Context sessionCookiePath = "/ cái gì đó" sessionCookieDomain =/>

"domain.tld."

https://issues.apache.org/bugzilla/show_bug.cgi?id=48379

+0

+1 Chỉ là những gì tôi đang tìm kiếm! Cuối cùng họ đã bao gồm các bản vá. – Kdeveloper

1

Tôi đã tham gia điều này vào lúc $ DAYJOB. Trong trường hợp của tôi, tôi muốn thực hiện đăng nhập SSL rồi chuyển hướng đến trang không phải SSL. Vấn đề cốt lõi trong tomcat là phương thức (từ bộ nhớ) SessionManager.configureSessionCookie mã hóa cứng tất cả các biến mà bạn muốn truy cập.

Tôi đã đưa ra một vài ý tưởng, bao gồm cả một hack đặc biệt nghiêm trọng bằng cách sử dụng mod_headers trong apache để ghi lại cookie dựa trên thay thế regex.

Cách dứt khoát để giải quyết vấn đề này là gửi bản vá cho các nhà phát triển tomcat để thêm tham số có thể định cấu hình vào lớp SessionManager.

1

Do phiên (và Id của nó) về cơ bản chỉ được coi là giá trị cho ứng dụng phát hành, bạn có thể tìm kiếm thêm một cookie bổ sung. Hãy xem Tomcats SingleSignOnValve, cung cấp thêm JSESSIONIDSSO Cookie (lưu ý ... SSO) cho đường dẫn máy chủ "/" thay vì "/ applicationName" (như cookie JSESSIONID thường được đặt).

Với Van như vậy, bạn có thể thực hiện bất kỳ giao tiếp liên bộ nào bạn cần để đồng bộ hóa bất kỳ trạng thái nào giữa các máy chủ, máy chủ ảo hoặc webapp khác nhau trên bất kỳ số máy chủ/máy chủ web nào.

Một lý do khác khiến bạn không thể sử dụng cookie phiên tomcats cho mục đích của riêng bạn là, nhiều ứng dụng web trên cùng một máy chủ có các id phiên khác nhau. Ví dụ. có các cookie khác nhau cho "/ webapp1" và "/ webapp2". Nếu bạn cung cấp cookie "/ webapp1" cho "/ webapp2", điều này sẽ không tìm thấy phiên bạn tham chiếu, làm mất hiệu lực phiên cookie + của bạn và đặt cookie mới của riêng nó. Bạn sẽ phải viết lại tất cả xử lý phiên làm việc của tomcats để chấp nhận các giá trị id phiên bên ngoài (ý tưởng xấu bảo mật) hoặc để chia sẻ một trạng thái nhất định giữa các ứng dụng.

Việc xử lý phiên phải được xem xét trong kinh doanh container (tomcats). Bất cứ điều gì khác bạn cần bạn nên thêm mà không can thiệp vào những gì container tin là cần thiết để làm.

1

Kỹ thuật van dường như không hoàn hảo 100%. Nếu bạn dám sửa đổi chính Tomcat:

catalina.jar chứa lớp sau: org.apache.catalina.connector.Yêu cầu

Các yêu cầu có một phương pháp:

configureSessionCookie(Cookie cookie) 

Đối với môi trường của chúng tôi nó là tốt nhất để chỉ hardcode nó, nhưng bạn có thể làm luận ưa thích hơn:

cookie.setDomain(".xyz.com"); 

Dường như làm việc một cách hoàn hảo. Sẽ được tốt đẹp nếu điều này được cấu hình trong tomcat.

6

Tôi vừa trải qua tất cả điều này để tìm kiếm một giải pháp đơn giản. Tôi bắt đầu nhìn vào nó từ quan điểm tomcat đầu tiên.

Tomcat không cung cấp quyền truy cập trực tiếp vào định cấu hình cookie miền cho phiên và tôi chắc chắn không muốn tùy chỉnh bản vá tomcat để khắc phục sự cố đó như được hiển thị trong một số bài đăng khác.

Các van trong tomcat cũng có vẻ là một giải pháp vấn đề do các hạn chế khi truy cập các tiêu đề & cookie được tích hợp vào đặc tả Servlet. Chúng cũng thất bại hoàn toàn nếu phản ứng http được cam kết trước khi nó được truyền cho van của bạn.

Vì chúng tôi ủy quyền các yêu cầu của mình thông qua Apache, sau đó tôi chuyển sang cách sử dụng apache để khắc phục sự cố thay thế.

Lần đầu tiên tôi đã thử chỉ thị mod_proxy ProxyPassReverseCookieDomain, nhưng nó không hoạt động đối với cookie JSESSIONID vì tomcat không đặt thuộc tính miền và ProxyPassReverseCookieDomain không thể hoạt động mà không có một số loại tên miền là một phần của cookie.

Tôi cũng đã gặp phải một hack bằng cách sử dụng ProxyPassReverseCookiePath nơi họ đã viết lại đường dẫn để thêm thuộc tính miền vào cookie, nhưng cảm giác đó lộn xộn cho một trang web sản xuất.

Cuối cùng tôi đã làm cho nó hoạt động bằng cách viết lại các tiêu đề phản hồi bằng mô-đun mod_headers trong apache như đã đề cập bởi Dave ở trên.

tôi đã thêm dòng sau bên trong định nghĩa máy chủ ảo:

Header edit Set-Cookie "(JSESSIONID\s?=[^;,]+?)((?:;\s?(?:(?i)Comment|Max-Age|Path|Version|Secure)[^;,]*?)*)(;\s?(?:(?i)Domain\s?=)[^;,]+?)?((?:;\s?(?:(?i)Comment|Max-Age|Path|Version|Secure)[^;,]*?)*)(,|$)" "$1$2; Domain=.example.com$4$5" 

Trên đây nên tất cả trở thành một dòng duy nhất trong cấu hình. Nó sẽ thay thế bất kỳ thuộc tính miền JSESSIONID cookie nào bằng ".example.com". Nếu cookie JSESSIONID không chứa thuộc tính tên miền, thì mẫu sẽ thêm một giá trị có giá trị ".example.com". Là một phần thưởng, giải pháp này không bị vấn đề cookie JSESSION kép của các van.

Mẫu sẽ hoạt động với nhiều cookie trong tiêu đề Đặt cookie mà không ảnh hưởng đến các cookie khác trong tiêu đề. Nó cũng có thể sửa đổi để làm việc với các cookie khác bằng cách thay đổi JSESSIONID trong phần đầu tiên của mẫu thành tên cookie mà bạn mong muốn.

Tôi không phải là người dùng cũ, vì vậy tôi chắc chắn có một vài tối ưu hóa có thể được thực hiện cho mẫu, nhưng có vẻ như nó đang hoạt động cho chúng tôi cho đến nay.

Tôi sẽ cập nhật bài đăng này nếu tôi tìm thấy bất kỳ lỗi nào có mẫu. Hy vọng rằng điều này sẽ ngăn cản một vài người trong số các bạn phải trải qua vài ngày đáng thất vọng như tôi đã làm.

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