2012-04-19 36 views
5

Tôi đang sử dụng khung Scalatra để xây dựng một ứng dụng web. Ứng dụng dựa trên phiên, nhưng tôi không thể sử dụng cookie phiên (vì về mặt kỹ thuật chỉ có một người dùng chạy nhiều phiên cùng một lúc).Phiên Scalatra không có cookie

Mỗi phiên có khóa phiên duy nhất mà tôi muốn sử dụng làm số nhận dạng. Tôi muốn khóa này được gửi dưới dạng tham số GET hoặc POST thay vì tiêu đề cookie.

Câu hỏi của tôi bây giờ là: Làm cách nào để lưu trữ thông tin phiên (ví dụ: trạng thái) trong một servlet Scalatra không có cookie nhưng chỉ là tham số làm số nhận dạng?

Cho đến nay tôi đã cố gắng sử dụng hệ thống tệp để lưu trữ tất cả thông tin phiên, nhưng điều này quá chậm và không cần thiết vì các phiên chỉ kéo dài vài giây.

(Bảo mật không phải là vấn đề)

Trả lời

5

Tôi đã tìm ra cách tôi có thể làm điều đó.

Trong mọi servlet Scalatra, tôi có quyền truy cập vào toàn cầu servletContext thực hiện giao diện javax.servlet.ServletContext. Tôi có thể sử dụng hai phương thức setAttribute(x: String, y: Any)getAttribute(x : String) để lưu trữ thông tin về các phiên của tôi, trong đó x là mã định danh duy nhất của tôi và y là thông tin phiên được mã hóa dưới dạng lớp trường hợp Session.

có hiệu quả tôi có như sau:

def storeSession(key : String, session : Session) { 
    servletContext.setAttribute(attributePrefix + key, session) 
} 

def loadSession(key : String) : Session = { 
    val session = servletContext.getAttribute(attributePrefix + key) 
    if (session != null) { 
     session match { 
      case s : Session => s 
      case _ => null 
     } 
    } else { 
     null 
    } 
} 

Bằng cách này tôi có thể giữ một trạng thái trên máy chủ, mà không sử dụng các tập tin cookie, chỉ có một định danh duy nhất duy nhất mà khách hàng phải cung cấp như một giá trị GET.

Tôi đoán kỹ thuật này có thể được áp dụng cho bất kỳ servlet nào trong Java và Scala cung cấp một thể hiện của ServletContext, không chỉ là Scalatra.

+0

Đây là giải pháp nhanh chóng và dễ dàng để lưu trữ "dữ liệu phiên" khi giao dịch với môi trường Java servlet - chỉ là những gì tôi đang tìm kiếm. –

+0

Bạn sẽ nhận khóa như thế nào? Nó sẽ được tạo ra cho mỗi yêu cầu? Làm cách nào để xác định phiên? – Rajeev

+0

Khóa được tạo cho mỗi phiên mới (không phải mọi yêu cầu) bằng cách sử dụng trình tạo số ngẫu nhiên ở một nơi khác trong mã trong trường hợp của tôi. Bất kỳ số nhận dạng nào là duy nhất đều có thể được sử dụng. – Waboodoo

1

Câu hỏi hay.

Thay vì lưu trữ trạng thái vào đĩa và hiệu suất đạt được mà đòi hỏi, làm thế nào về việc lưu trữ trong bộ nhớ a la Redis?

Có một số Scala implementation bởi debasishg, nặng nề trong cộng đồng Scala, có thể phù hợp với hóa đơn.

Ở bên không có hàng rào của hàng rào, trong ví dụ, điều này đã được đề xuất cho tôi như là phương tiện thay thế để duy trì trạng thái máy chủ phía máy chủ; nghĩa là lưu trữ số nhận dạng cookie của khách hàng vào bộ nhớ cache trong bộ nhớ so với dựa trên HttpSession