2012-03-25 14 views
10

मुझे Google पर इस समस्या के बहुत सारे संदर्भ मिले हैं लेकिन कोई जवाब नहीं है। मैं जेटी (8.1.2.v20120308) का नवीनतम संस्करण उपयोग कर रहा हूं और मुझे सत्रों का उपयोग करने में सक्षम होने के लिए एक एम्बेडेड सर्वलेट नहीं मिल रहा है। उदाहरण पाठ्यक्रम में स्केल में है, लेकिन इसे किसी भी जावा प्रोग्रामर के लिए पठनीय होना चाहिए।एंबेडेड जेट्टी - IllegalStateException: No सत्र प्रबंधक

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() 
मेरी सर्वलेट कोड में

:

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

req.getSession इस अपवाद फेंकता है, और यह पहले डिबग लाइन, हमेशा रिक्त है।

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

लॉग में मैं यह देख सकते हैं:

DEBUG org.eclipse.jetty.server.session - session[email protected]eeea 
DEBUG org.eclipse.jetty.server.session - session=null 

मुझे यकीन है कि अगर प्रासंगिक है नहीं कर रहा हूँ, लेकिन यह प्रकट होता एक सत्र प्रबंधक है कि वहाँ लेकिन यह अनुरोध पर उपलब्ध नहीं है।

मैंने उसी परिणाम के साथ WebAppContext के साथ यह कोशिश की है। सत्र प्रबंधक को एक दर्जन विभिन्न तरीकों से स्पष्ट रूप से सेट करने का उल्लेख नहीं करना है।

उत्तर

11

मेरा मानना ​​है कि इस मुद्दे को इस तथ्य से आता है कि आप एक WebappContext

की तुलना में एक ServletContextHandler instantiating कर रहे हैं बल्कि

val webapp = new WebappContext(); 

या

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

प्रयास करें ServletContextHandler जावाडोक से

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

optionally शब्द यहां कुंजी की संभावना है।

+0

उत्तर के लिए धन्यवाद, लेकिन मैं उन दोनों वेरिएंट की कोशिश की है, कोई सफलता के साथ। मैंने HashSessionManager को सत्रहैंडलर को स्पष्ट रूप से जोड़ने का भी प्रयास किया है, लेकिन कोई फर्क नहीं पड़ता कि मैं क्या प्रयास करता हूं, जेटी Request.getSession() हमेशा IllegalStateException फेंकता है। जेटी से लॉग आउटपुट से पता चलता है कि एक सत्र प्रबंधक मौजूद है, यह अनुरोध में उपलब्ध है। –

+0

माइकल, जेटी कोड को देखते हुए, एकमात्र तरीका यह हो सकता है कि मैं यह देख रहा हूं कि कोई सत्रहैंडलर अनुरोध से जुड़ा हुआ है और प्रारंभ नहीं हुआ है। क्या आपके पास अपने web.xml में किसी भी प्रकार का प्रमाणीकरण है? –

+0

मुझे एक ही समस्या हो रही थी, और बीजीआर के उत्तर का थोड़ा सा संस्करण मेरे लिए काम करता था, मैंने बस एक वेब सत्र कॉन्टेक्स्ट बनाने के बिना सीधे मेरे सर्वलेट संदर्भ हैंडलर में एक नया सत्र हैंडलर जोड़ा और यह ठीक काम किया। servletContextHandler.setSessionHandler (नया सत्र हैंडलर()) –

0

ठीक है, मुझे थोड़ा मूर्ख लगता है, यह समस्या मेरे सर्वलेट में थी, मैं एक बच्चे के धागे में अनुरोध का उपयोग कर रहा था, जिसने अनुरोध को तब तक एक्सेस किया जब अनुरोध दायरे से बाहर था। और त्रुटि को गुमराह करने में, उसने मुझे गलत पथ भेज दिया क्योंकि त्रुटि संदेश थोड़ा अस्पष्ट था। उत्तर के लिए बीजीआर के लिए धन्यवाद।

0

घाट 9.4 में, एक 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);   
} 
संबंधित मुद्दे