在tomcat领域中获取会话属性

时间:2014-11-26 13:20:37

标签: session tomcat jdbc struts2 jdbcrealm

我正在使用struts 2和tomcat v6在J2E中开发一个应用程序。

我的应用程序中有一个登录页面,用户必须通过单击虚拟键盘(我自己制作)来输入密码。

在键盘出现之前,我有一个动作来随机化字符' 。出于安全原因,此操作还会对所有字符进行编码,并在会话中设置字符和代码的映射。

使用tomcat中的JDBC域进行身份验证。

我要做的是解码用户的密码。我尝试过使用url-pattern" j_security_check"但我发现无法在过滤器中捕获此事件。

所以我试图在JDBC领域解码密码,但它无法正常工作。我试图在领域中使用ServletActionContext.getRequest(),但我面临一个空指针异常。

是否可以将地图存储在领域中的会话中? 如果不是,那么任何有关如何做到这一点的线索都是受欢迎的,因为我还没有找到任何解决方案。

1 个答案:

答案 0 :(得分:0)

一个可行的解决方案是编写Custom Authenticator,扩展FormAuthenticator

例如

//Will expand the basic FORM authentication to include auth based on request headers
public class CustomAuthenticator extends FormAuthenticator{

    public boolean authenticate(Request request, Response response, LoginConfig config) throws IOException{
        if(request.getUserPrincipal() == null){
            Realm realm = context.getRealm();
            //Pick the user name and password from the request headers
            //you can decode the password here
            if(username == null || pass ==null) return super.authenticate(....);

            boolean authenticated = realm.authenticate(username, pass);
            if(authenticated == false) return false;

            //Set the username/password on the session and set  the principal in request
            session.setNote(Constants.SESS_USERNAME_NOTE, username);
            session.setNote(Constants.SESS_PASSWORD_NOTE, password);
            request.setUserPrincipal(principal);
            register(request, response, principal, Constants.FORM_METHOD, username, pass);
        }
        return true;
    }
}

另请参阅:http://apachecon.com/eu2007/materials/UnderstandingTomcatSecurity.pdfhttp://javaevangelist.blogspot.com/2012/12/tomcat-7-custom-valve.html