2013-03-13 25 views
58

Tôi đang cố gắng hiểu mục đích thực của cấu hình phiên trong Web.xml cho thời gian chờ của phiên.Thời gian phiênOut trong web.xml

<!-- Session Configuration --> 
<session-config> 
     <session-timeout>60</session-timeout> 
</session-config> 

Bây giờ hãy để tôi cho bạn biết về câu hỏi của tôi.

Ứng dụng của tôi đang nhập/tải lên tệp .txt, bị ràng buộc mất hơn 1 giờ, vì có hàng triệu bản ghi được nhập. Nhưng phiên hết giờ sau 1 giờ mặc dù ứng dụng của tôi vẫn đang nhập tệp .txt đang diễn ra. Ứng dụng như vậy không nên hết thời gian vì ứng dụng đang thực hiện một số tác vụ trong nền.

+0

Tăng số của bạn bên trong thẻ thời gian chờ của phiên. Nếu bạn có bất kỳ câu hỏi nào, hãy ping tôi. Xe tăng –

+7

Nếu bất kỳ quá trình nào đang diễn ra, tôi cho rằng phiên sẽ không hết hạn. Phiên hết hạn nếu ứng dụng không hoạt động trong khoảng thời gian đó. Của bạn không phải là nhàn rỗi nếu một số quá trình nền đang xảy ra. –

+4

Tôi không chắc chắn cách hoạt động của ứng dụng của bạn. nếu ứng dụng đang đợi một I/O hoàn thành, thì chắc chắn nó không hoạt động và sẽ hết thời gian – Joe2013

Trả lời

6
<session-config> 
     <session-timeout>-1</session-timeout> 
</session-config> 

Trong đoạn mã trên "60" stands for the minutes. Phiên họp sẽ hết hạn sau 60 minutes. Vì vậy, nếu bạn muốn thêm thời gian. Ví dụ: -1 được mô tả phiên của bạn không bao giờ hết hạn.

+0

Câu hỏi đặt ra là mặc dù phiên đang hoạt động (làm một cái gì đó) tại sao nó hết hạn sau 60 phút ?? –

31
<session-config> 
    <session-timeout>-1</session-timeout> 
</session-config> 

Bạn có thể sử dụng "-1" trong đó phiên không bao giờ hết hạn. Vì bạn không biết phải mất bao nhiêu thời gian để hoàn thành chuỗi.

+2

@PeakGen: Hãy thật tuyệt và không chỉ phản đối. Vì vậy, nó hết hạn? Sau thời gian nào nó làm điều đó? – zb226

+0

@ zb226: Trước khi nhận xét, hãy đảm bảo kiểm tra ngày của chuỗi :) –

+2

@PeakGen: Tôi không nghĩ ngày tháng có liên quan. Thông tin bổ sung sẽ có liên quan. – zb226

0

Nếu bạn không muốn có một thời gian chờ xảy ra đối với một số mục đích:

<session-config> 
    <session-timeout>0</session-timeout> 
</session-config> 

nên dẫn đến không có thời gian chờ ở tất cả -> vô hạn

+0

Câu hỏi đặt ra là mặc dù phiên đang hoạt động (làm một cái gì đó) tại sao nó hết hạn sau 60 phút ?? –

38

Để thiết lập một phiên timeout mà không bao giờ hết hạn là không mong muốn bởi vì bạn sẽ tin cậy vào người dùng để đẩy nút đăng xuất mỗi khi anh ấy kết thúc để ngăn máy chủ của bạn tải quá nhiều (tùy thuộc vào số lượng người dùng và phần cứng). Additionaly có một số vấn đề bảo mật bạn có thể chạy vào mà bạn muốn tránh.

Lý do tại sao phiên bị vô hiệu hóa trong khi máy chủ vẫn đang làm việc trên một công việc là do không có giao tiếp giữa phía máy khách (trình duyệt người dùng) và phía máy chủ thông qua ví dụ: một yêu cầu http. Do đó, máy chủ không thể biết trạng thái của người dùng, cho rằng anh ấy đang chạy không tải và làm mất hiệu lực phiên sau thời gian được đặt trong web.xml của bạn.

Để làm được việc này bạn có nhiều khả năng:

  • Bạn có thể ping backend của bạn trong khi nhiệm vụ đang chạy để chạm vào phiên giao dịch và ngăn ngừa nó khỏi bị hết hạn
  • tăng <session-timeout> bên trong máy chủ nhưng tôi sẽ không khuyên bạn nên
  • chạy tác vụ của mình trong một chuỗi chuyên dụng, chạm vào (kéo dài) phiên trong khi làm việc hoặc thông báo cho người dùng khi luồng hoàn tất

Có một câu hỏi tương tự được hỏi, có thể bạn có thể điều chỉnh các phần của giải pháp này trong dự án của bạn. Hãy xem this.

Hy vọng điều này sẽ giúp, vui vẻ!

+2

Lưu ý rằng người dùng đăng nhập và phiên là hai điều độc lập. Không có "đăng xuất" cho các servlet nói chung. Máy chủ sẽ cần một trang "đăng xuất" gọi rõ ràng phương thức _invalidate() _ của _HttpSession_. –

9

Gửi AJAX Http Yêu cầu đến máy chủ định kỳ (giả sử một lần trong 60 giây) thông qua javascript để duy trì phiên với máy chủ cho đến khi quá trình tải lên tệp hoàn tất.

-2

Thông thường phiên sẽ không hết hạn khi yêu cầu xử lý đang diễn ra. Tôi nghĩ rằng có một LB hoặc một cái gì đó ở giữa mà đọc toàn bộ tập tin và sau đó gọi container web.

Điều này có thể gây ra sự chậm trễ dẫn đến kết thúc phiên.

+0

Phiên có thể hết hạn khi yêu cầu được xử lý. Ví dụ: nếu thời gian chờ phiên được đặt là 15 phút và nó nhận được yêu cầu mất 20 phút và máy chủ không nhận được bất kỳ yêu cầu nào trong thời gian này, thì phiên đó hết giờ. – user1707141

9

Cách hacky:

Bạn có thể tăng thời gian chờ phiên khi lập trình tải lên lớn.

session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS) 

Khi quá trình kết thúc, bạn có thể đặt thời gian chờ trở về mặc định.

Nhưng .. khi bạn đang sử dụng Java EE và quá trình tải lên không mất một giờ hoàn chỉnh, cách tốt hơn là chạy các tác vụ không đồng bộ (thông qua JMS ví dụ).

3

bạn có thể tuyên bố thời gian trong hai cách cho vấn đề này ..

1) hoặc đưa ra thời gian quá dài mà đọc tập tin của bạn được hoàn tất ở giữa thời điểm đó.

<session-config> 
    <session-timeout> 1000 </session-timeout> 
</session-config> 

2) khai báo thời gian không bao giờ hết hạn phiên của bạn.

<session-config> 
    <session-timeout>-1</session-timeout> 
</session-config> 
+1

Đó là một mẹo hay. Cảm ơn rất nhiều +1 –

4

Bạn có thể thấy nhiều tùy chọn làm câu trả lời cho câu hỏi của mình, tuy nhiên bạn có thể sử dụng "-1" trong đó phiên không bao giờ hết hạn. Vì bạn không biết phải mất bao nhiêu thời gian để hoàn thành chuỗi. Ví dụ .:

<session-config> 
     <session-timeout>-1</session-timeout> 
    </session-config> 

Hoặc nếu bạn không muốn có một thời gian chờ xảy ra đối với một số mục đích:

<session-config> 
    <session-timeout>0</session-timeout> 
</session-config> 

Một lựa chọn khác có thể là tăng số lượng đến 1000, vv, vv, bla, bla, bla. Nhưng nếu bạn thực sự muốn dừng lại và bạn cho rằng đó là không cần thiết cho ứng dụng của bạn để buộc người dùng đăng xuất, chỉ cần thêm nút đăng xuất và người dùng sẽ quyết định thời điểm khởi hành. Dưới đây là những gì bạn có thể làm để giải quyết vấn đề nếu bạn không cần phải đăng xuất, và bạn đang tải các tệp có thể mất thời gian dựa trên máy chủ và tốc độ máy tính của bạn và kích thước của tệp.

<!-- sets the default session timeout to 60 minutes. --> 
    <!-- <session-config> 
    <session-timeout>60</session-timeout> 
    </session-config> --> 

Chỉ cần nhận xét hoặc xóa nó! Tan tararantan, tan tan!

+4

có sự khác biệt nào giữa 0 và -1 không? – efirat

1

Một tùy chọn khác mà tôi muốn giới thiệu là tạo một ứng dụng riêng biệt không quốc tịch để lấy tệp lớn. Trên ứng dụng chính của bạn, hãy mở cửa sổ hoặc iframe mới sẽ chấp nhận tệp và gửi tệp qua cửa sổ đó rồi ẩn cửa sổ hoặc iframe sau khi tải lên đã bắt đầu sử dụng Javascript.

5

Các tài liệu nói:

Yếu tố phiên timeout xác định khoảng thời gian chờ phiên mặc định cho tất cả các phiên được tạo trong ứng dụng web này. Thời gian chờ được chỉ định phải được thể hiện trong toàn bộ số phút. Nếu thời gian chờ là 0 hoặc ít hơn, vùng chứa đảm bảo hành vi mặc định của phiên không bao giờ hết thời gian chờ.Nếu phần tử này không được chỉ định, vùng chứa phải đặt khoảng thời gian chờ mặc định của nó.

0

Bạn nên cân nhắc việc tách các tập tin lớn để khối và dựa vào khả năng đa luồng để xử lý nhiều hơn một tập tin tại một thời điểm HOẶC để cho toàn bộ quá trình chạy như một nhiệm vụ nền sử dụng TimerTask và viết truy vấn khác để biết trạng thái của nó tạo thành trình duyệt bao gồm một thanh tiến trình có thể được hiển thị nếu bạn có thể biết thời gian xử lý của một tệp hoặc bản ghi.