2012-03-25 24 views
10

Tôi đã tìm thấy rất nhiều tài liệu tham khảo về vấn đề này trên google nhưng không có câu trả lời. Tôi đang sử dụng phiên bản mới nhất của cầu cảng (8.1.2.v20120308) và tôi dường như không thể có được một servlet được nhúng để có thể sử dụng các phiên. Ví dụ là trong scala tất nhiên, nhưng nó phải được đọc cho bất kỳ lập trình java.Embedded Jetty - IllegalStateException: No SessionManager

val server = new Server(); 
val connector = new SelectChannelConnector() 
connector.setPort(Integer.getInteger("jetty.port", 8080).intValue()) 
server.setConnectors(Array(connector)) 

val webapp = new ServletContextHandler(ServletContextHandler.SESSIONS) 
webapp.setContextPath("/") 
webapp.setResourceBase(webDir) 
webapp.setServer(server) 

val brzyServ = new ServletHolder(new BrzyDynamicServlet()) 
webapp.addServlet(brzyServ, "*.brzy") 

server.setHandler(webapp); 
server.start() 

trong mã servlet của tôi:

... 
log.debug("session manager: {}",req.asInstanceOf[Request].getSessionManager) 
val session = req.getSession 
... 

Các req.getSession ném ngoại lệ này, và dòng debug trước đó, luôn luôn là null.

java.lang.IllegalStateException: No SessionManager 
at org.eclipse.jetty.server.Request.getSession(Request.java:1173) 

Trong nhật ký tôi có thể thấy điều này:

DEBUG org.eclipse.jetty.server.session - ses[email protected]2a8ceeea 
DEBUG org.eclipse.jetty.server.session - session=null 

Tôi không chắc chắn nếu đó là có liên quan, nhưng có thể thấy rằng có một người quản lý phiên nhưng nó không có sẵn theo yêu cầu.

Tôi đã thử điều này với WebAppContext với cùng một kết quả. Chưa kể đến việc thiết lập sessionManager một cách rõ ràng theo hàng chục cách khác nhau.

Trả lời

11

Tôi tin rằng vấn đề này xuất phát từ thực tế rằng bạn đang instantiating một ServletContextHandler chứ không phải là một WebappContext

Hãy thử

val webapp = new WebappContext(); 

hoặc

val webapp = new ServletContextHandler(ServletContextHandler.SESSIONS) 
webapp.setSessionHandler(new SessionHandler()) 

Từ javadoc ServletContextHandler

[...]construction of a context with ServletHandler and optionally session and security handlers [...] 

Từ optionally có thể là chìa khóa ở đây.

+0

Cảm ơn bạn đã trả lời, nhưng tôi đã thử cả những biến thể, không có thành công. Tôi cũng đã thử thêm HashSessionManager một cách rõ ràng cho SessionHandler, nhưng không có vấn đề gì tôi cố gắng, cầu Request.getSession() luôn ném IllegalStateException. Đầu ra bản ghi từ cầu cảng cho thấy rằng một trình quản lý phiên tồn tại, nó chỉ là doest dường như có sẵn trong yêu cầu. –

+0

Michael, nhìn vào mã Jetty, cách duy nhất tôi có thể thấy điều này xảy ra là không có SessionHandler nào được liên kết và khởi tạo theo yêu cầu. Bạn có bất kỳ loại xác thực nào trong tệp web.xml của mình không? –

+0

Tôi đã gặp vấn đề tương tự, và một biến thể nhỏ của câu trả lời BGR làm việc cho tôi, tôi chỉ cần thêm một trình xử lý phiên mới vào trình xử lý ngữ cảnh servlet của tôi trực tiếp mà không cần tạo WebAppContext và nó hoạt động tốt. servletContextHandler.setSessionHandler (SessionHandler mới()) –

0

ok, tôi cảm thấy một chút ngu ngốc, vấn đề này là trong servlet của tôi, tôi đã truy cập yêu cầu trong một chủ đề con, truy cập phiên khi yêu cầu nằm ngoài phạm vi. Và trong googling lỗi, nó đã gửi cho tôi xuống con đường sai vì thông báo lỗi là một chút mơ hồ. Cảm ơn BGR đã trả lời.

0

Trong cầu cảng 9.4, để cho phép một phiên xử lý rất đơn giản cho một servlethandler:

private static void setSessionEnableContext(Server server,ServletHandler handlerServlet) { 
     // Specify the Session ID Manager   
    SessionIdManager idmanager = new DefaultSessionIdManager(server); 
    server.setSessionIdManager(idmanager); 
    // Specify the session handler 
    SessionHandler sessionsHandler = new SessionHandler();  
    handlerServlet.setHandler(sessionsHandler);   
} 
Các vấn đề liên quan