【问题标题】:How to trigger Bean after j_security_check complete authentication in Javajava中j_security_check完成身份验证后如何触发Bean
【发布时间】:2013-02-07 23:17:00
【问题描述】:

我对 java 网页环境很陌生。最近尝试用Java开发一个电子商务平台。

因此,我使用 j_security_check Form-Based 作为我的身份验证工具。认证完成后成功重定向到期望页面。

但是,由于我必须从数据库 (MS SQL 2005) 加载最终用户设置和信息,所以我必须在身份验证完成后和页面重定向之前加载所有信息。

我尝试了一些使用primefaces的方法,但是无法触发加载用户信息的bean方法。

我尝试过的一种方法是使用oncomplete来触发bean方法

<h:form id="login" prependId="false"
                    onsubmit="document.getElementById('login').action='j_security_check';">
                    <h:panelGrid columns="2" cellpadding="5">  
                        <h:outputLabel for="j_username" value="Username:" />
                        <p:inputText value="#{loginBean.username}"   
                                     id="j_username" required="true" label="j_username" />
                        <h:outputLabel for="j_password" value="Password:" />  
                        <h:inputSecret value="#{loginBean.password}"   
                                       id="j_password" required="true" label="j_password" />
                        <f:facet name="footer">  
                            <p:commandButton id="loginButton" value="Login" type="submit" ajax="false"                                                 
                                              oncomplete="#{loginBean.login()}"/>
                        </f:facet>  
                    </h:panelGrid>
                </h:form>

我也尝试过类似的方法,只是将 oncomplete 更改为 onclick 和其他。最终没有任何方法是可行的。

因此,我希望你们中的任何人都可以给我建议我应该如何克服这个问题。

万分感谢,

【问题讨论】:

    标签: jakarta-ee jsf-2 primefaces j-security-check


    【解决方案1】:

    对此有多种解决方案。

    1. 创建一个 servlet 过滤器,用于检查远程用户以及会话中是否存在User 实体。如果远程用户不是null,而是User 实体,则从数据库加载它并在会话中设置它。这里具体回答:Accessing user details after logging in with Java EE Form authentication

    2. 在会话范围 bean 的 getter 中执行延迟加载,它应该返回 User 实体。这个答案的第一部分具体回答了这个问题:Performing user authentication in Java EE / JSF using j_security_check

    3. 使用真正的 JSF bean 操作方法执行编程登录,并直接获取User 实体。这个答案的第二部分具体回答了这个问题:Performing user authentication in Java EE / JSF using j_security_check


    与具体问题无关,您应该使用&lt;form action="j_security_check" method="post"&gt; 而不是&lt;h:form prependId="false"&gt;。然后你也不需要那个讨厌的 JS hack 来改变表单的动作。

    【讨论】:

    • 感谢您的回答,很抱歉这么久只回复您的回答。我尝试了您建议的第一个解决方案,但它对我不起作用。我添加了一个新类作为 UserFilter,并且通过使用调试模式(我正在使用的 NetBean IDE 7.2)程序无法落入 UserFilter。我是否错过了要添加的内容,以便在用户登录后程序将使用 UserFilter?此外,UserService 是一种用于检索我希望获得的用户设置的方法。不是吗?非常感谢您的帮助..谢谢..
    • @WebFilter 注释仅适用于部署到与 Servlet 3.0 兼容的容器且具有 Servlet 3.0 兼容的 web.xml 文件的 Web 应用程序。否则,您必须在web.xml 中手动注册。
    • 最终我也无法落入WebFilter。因此,我选择了@BalusC 提出的方法 3。这是一个很好的答案,很容易解决了我的问题。非常感谢 BalusC ...
    • 抱歉,我不能投票给这个答案,因为有用的答案是因为我的声誉不足以投票......无论如何这个答案非常有用......谢谢......
    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2014-12-25
    • 2011-06-29
    • 2020-11-07
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多