6

我有一个在 JBoss AS6 中运行的应用程序。身份验证正在使用“FORM”身份验证方法进行,并且用户正在正确登录。

每当用户成功登录时,我希望能够调用一段自定义的静态代码。

不幸的是,我找不到任何将在成功登录时执行代码的侦听器、挂钩或回调。HttpSessionListener 确实有一个“sessionCreated”事件,但是一旦用户访问任何页面,即使他们没有成功登录,它也会被调用。这意味着即使查看登录表单也会触发该事件。

谁能给我指出一些 JBoss AS 6(或等效)的文档,其中显示了如何在用户首次成功登录时运行自定义代码?

提前致谢。

4

3 回答 3

3

ServletFilter您可以在安全 Servlet 前面添加一个实现。

每次调用时,过滤器都会notFirstCallHttpSession.

如果该标志不存在,则该请求是用户登录后的第一个请求。它可以调用指定的作业,然后设置标志notFirstCall以将此作业标记为已完成。

于 2012-06-24T11:25:53.680 回答
2

我能想到的解决方法是CustomFormAuthenticator扩展org.apache.catalina.authenticator.FormAuthenticator 并在/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml. 现在在 Jboss AS 7 中,他们引入了阀门概念,您可以CustomAuthenticator在其中注册jboss-web.xml

就像是..

public class CustomFormAuthenticator extends FormAuthenticator {
    @override
    public boolean authenticate(Request request, Response response, LoginConfig config) throws IOException {
        boolean authenticate = super.authenticate(request, response, config);
        //here you might need to keep track whether your custom/static code executed once or not,
        //just to avoid executing the same code again and again.
        if(authenticate) {
            int i = CustomSingleton.getInstnce().getExecuteCount();
            if(i <= 0) {
                //invoke custom code.
                //increment the count
                CustomSingleton.getInstnce().incrementExecuteCount();
            }
        }
    }
}

现在,需要server/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml 将以下内容添加entryauthenticators部分中进行注册。

<entry>
    <key>CUSTOM-FORM</key>
    <value>full.qaulified.CustomFormAuthenticator</value>
</entry>

然后,在 web.xml 中有CUSTOM-FORMasauth-method

<login-config>
     <auth-method>CUSTOM-FORM</auth-method>
          <form-login-config>
               <form-login-page>/login.html</form-login-page>
               <form-error-page>/login-error.html</form-error-page>
          </form-login-config>
<login-config>

希望这可以帮助..

于 2012-06-25T06:47:45.320 回答
1

javax.servlet.http.HttpSessionBindingListener 之类的呢?创建一个对象,在用户成功登录时按照您喜欢的方式填充它,并将其作为属性添加到用户的会话中。所以:

public class User implements Serializable, HttpSessionBindingListener {
private String userId;
private Timestame logonTime;
// any additional fields

@Override
public void valueBound(HttpSessionBindingEvent event) {
// this method called when this object is attached to a session
    log.debug("user " + this.userId + "bound to a session - user logged in");
// do stuff
  }
@Override
  public void valueUnbound(HttpSessionBindingEvent event) {
// this method called when user's session ends, value unbound, etc
    log.debug("user " + this.userId + "logged off");
// do other stuff
  }

}

绑定对象:

// you don't create this object until a user logs in
User userObject = new User();
userObject.setUserId();
userObject.setLogonTime();
// get your request object however you normally get it
HttpServletRequest request.getSession().setAttribute("loggedInUser", userObject);

设置属性时,它将调用 valueBound 方法这也可以用于跟踪用户(将登录/注销信息保存到数据库等)。

于 2012-06-23T21:28:28.147 回答