Jsf 2 在JSF登录期间,会话何时创建?

Jsf 2 在JSF登录期间,会话何时创建?,jsf-2,session-state,Jsf 2,Session State,在JSF中,会话似乎是在成功登录之前创建的。i、 e.只需请求登录页面即可创建新会话 <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> 为收到的每个请求而不是每个成功登录的用户创建会话似乎非常浪费(并且容易受到D

在JSF中,会话似乎是在成功登录之前创建的。i、 e.只需请求登录页面即可创建新会话

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>
为收到的每个请求而不是每个成功登录的用户创建会话似乎非常浪费(并且容易受到DDoS攻击)

下面的代码非常通用,但显示了我所指的那种简单场景

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>

编辑:混乱代码示例已修复首先,您的测试方法是完全错误的

if (request.getSession() == null){
    System.out.println("No session.");
} else {
    System.out.println("Session already exists.");
}
请仔细阅读argumentless
getSession()
方法的说明。您将认识到,它从不返回
null

回到具体问题上来,默认情况下JSF确实会自动创建会话,因为JSF视图状态必须存储在那里。如果将JSF状态保存方法设置为
client
而不是
server
,那么它将不会存储在会话中,因此不需要创建会话

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

javax.faces.STATE_保存方法
客户

在即将发布的JSF2.2中,您也可以将bean放在请求范围中,并使用
使其完全无状态。这适用于当前JSF2.1版本,仅适用于Mojarra 2.1.19之后的版本。另请参见Mojarra的一位开发人员。

自白-示例代码大量改编自我们的生产代码。我最初使用的是getSession(false)。除此之外,谢谢你证实我的想法。尽管到处寻找(书籍、博客、Oracle文档),我还没有发现JSF自动创建会话的明确确认。顺便说一句,这是否确实可以通过向服务器发送大量新的登录请求(尽管没有可用的登录凭据)来更容易地关闭服务器?这取决于服务器硬件和配置。例如,连接/请求池、会话超时、可用内存、网络带宽等。测量是已知的。