2013-02-12 12 views
6

जेएसएफ में, ऐसा लगता है कि सत्र से पहले एक सफल लॉगिन बनाया गया है। यानी लॉगिन पेज का अनुरोध करने से नया सत्र बनने का कारण बनता है।जेएसएफ लॉगिन के दौरान सत्र कब बनाया जाता है?

यह प्रत्येक अनुरोध के लिए एक सत्र बनाने के लिए बहुत ही अपमानजनक (और डीडीओएस हमलों के लिए कमजोर) लगता है, प्रत्येक उपयोगकर्ता को सफलतापूर्वक लॉग इन करने के बजाय।

नीचे दिया गया कोड बहुत सामान्य है, लेकिन इस तरह का सरल परिदृश्य दिखाता है जिसका मैं जिक्र कर रहा हूं।

index.xhtml:

<html> 
    <body> 
     <h:form id="login"> 
      <h:outputLabel for="username">Username</h:outputLabel> 
      <p:inputText id="username" name="username" value="#{userController.username}"/> 
      <h:outputLabel for="password">Password</h:outputLabel> 
      <p:password id="password" name="password" value="#{userController.password}"/> 

      <p:commandButton id="loginButton" value="login" action="#{loginController.login}"/> 
     </h:form> 
    </body> 
</html> 

LoginController.java

@ViewScoped 
public class LoginController implements Serializable { 

    String username; 
    String password; 

    public void login(){ 
     HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     if (request.getSession(false) == null){ 
      System.out.println("No session."); 
     } else { 
      System.out.println("Session already exists."); 
     } 

     try { 
      request.login(username, password); 
     } catch (ServletException e) { 
      FacesContext.getCurrentInstance.addMessage(null, new FacesMessage("Login failure", e.getMessage())); 
     } 
    } 

    // username and password getters/setters 

} 

संपादित करें: shambolic कोड उदाहरण तय

उत्तर

8

सबसे पहले, अपने परीक्षण कार्यप्रणाली पूरी तरह से गलत है।

if (request.getSession() == null){ 
    System.out.println("No session."); 
} else { 
    System.out.println("Session already exists."); 
} 

कृपया ध्यान से argumentless getSession() विधि के javadoc पढ़ें। आपको पता चलेगा कि यह कभीnull देता है।

कंक्रीट समस्या पर वापस आना, डिफ़ॉल्ट रूप से जेएसएफ वास्तव में सत्र को स्वत: कर देगा क्योंकि जेएसएफ दृश्य राज्य को वहां पर संग्रहीत किया जाना है। यदि आप server के बजाय जेएसएफ राज्य बचत विधि client पर सेट करते हैं, तो यह सत्र में संग्रहीत नहीं किया जाएगा और इसलिए कोई सत्र बनाने की आवश्यकता नहीं है।

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
</context-param> 

आगामी JSF 2.2 में आप वैकल्पिक रूप से यह भी अनुरोध दायरे में सेम डाल दिया और <f:view transient="true"> का उपयोग पूरी तरह से राज्यविहीन जाना सकता है। यह वर्तमान जेएसएफ 2.1 संस्करण के लिए केवल Mojarra 2.1.19 के बाद उपलब्ध है। उदाहरण भी देखें Mojarra डेवलपर्स में से एक से this blog

+0

कन्फेशंस - नमूना कोड को हमारे उत्पादन कोड से काफी अनुकूलित किया गया था। मैं मूल रूप से getSession (झूठी) का उपयोग कर रहा था। लेकिन उस तरफ, मैंने जो सोचा था उसकी पुष्टि करने के लिए धन्यवाद। आसपास के शिकार (किताबें, ब्लॉग, ओरेकल दस्तावेज़) के बावजूद मुझे स्पष्ट पुष्टि नहीं मिली कि जेएसएफ सत्र को स्वतः संसाधित करता है। – MMeldrum

+0

एक तरफ के रूप में, क्या यह वास्तव में नए लॉगिन अनुरोधों के साथ बाढ़ करके सर्वर को लेना आसान बनाता है (कोई लॉगिन प्रमाण-पत्र उपलब्ध होने के बावजूद)? – MMeldrum

+0

सर्वर हार्डवेयर और विन्यास पर निर्भर करता है। जैसे कनेक्शन/अनुरोध पूलिंग, सत्र टाइमआउट, उपलब्ध स्मृति, नेटवर्क बैंडविड्थ, आदि मापना जानना है। – BalusC

संबंधित मुद्दे