Я использую HttpSessionBindingListener для ведения записи всех активных зарегистрированных пользователей в веб-приложении. Приведенный ниже код хорошо работает для сервера WildFly, но создает NullPointerException на Tomcat в метод valueBound при извлечении атрибута сеанса, который был установлен перед вызовом этого метода.
package com.abc.def.xyz.dto;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import com.abc.def.xyz.util.Logger;
public class ActiveLoginUserDetails implements Serializable,HttpSessionBindingListener {
private Logger log = Logger.getLogger(this.getClass());
private static final long serialVersionUID = 1L;
private long usrId;
private String usrCode;
private String usrShortName;
private static Map<ActiveLoginUserDetails, HttpSession> activeLoginDtls = new ConcurrentHashMap<ActiveLoginUserDetails, HttpSession>();
private static Map<ActiveLoginUserDetails, HttpSession> loggedInUserDtlsMap = new ConcurrentHashMap<ActiveLoginUserDetails, HttpSession>();
public long getUsrId() {
return usrId;
}
public void setUsrId(long usrId) {
this.usrId = usrId;
}
public String getUsrCode() {
return usrCode;
}
public void setUsrCode(String usrCode) {
this.usrCode = usrCode;
}
public String getUsrShortName() {
return usrShortName;
}
public void setUsrShortName(String usrShortName) {
this.usrShortName = usrShortName;
}
public static Map<ActiveLoginUserDetails, HttpSession> getActiveLoginDtls() {
return activeLoginDtls;
}
public static void setActiveLoginDtls(Map<ActiveLoginUserDetails, HttpSession> activeLoginDtls) {
ActiveLoginUserDetails.activeLoginDtls = activeLoginDtls;
}
public static Map<ActiveLoginUserDetails, HttpSession> getLoggedInUserDtlsMap() {
return loggedInUserDtlsMap;
}
public static void setLoggedInUserDtlsMap(
Map<ActiveLoginUserDetails, HttpSession> loggedInUserDtlsMap) {
ActiveLoginUserDetails.loggedInUserDtlsMap = loggedInUserDtlsMap;
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
ActiveLoginUserDetails sessionUsrDtls = (ActiveLoginUserDetails) event.getSession().getAttribute("LoggedInUsers");
Boolean userHasSmInteractiveLoginAction = false;
Boolean multiLoginAllowed = false;
Boolean check = true;
log.info("sessionUsrDtls:::::"+ );
List<ActionDetails> actnDtlsList = (List<ActionDetails>) event.getSession().getAttribute("sessionActnList");
for(ActionDetails actnDtls : actnDtlsList){
if(actnDtls.getActionAccessValue().equalsIgnoreCase("smLogin")){
userHasSmInteractiveLoginAction = true;
}
}
if(userHasSmInteractiveLoginAction){
String amultiLoginAllowedUserCodeList = "adminUser";
String[] usrCodeArr = amultiLoginAllowedUserCodeList.split(",");
for(String tempUserCode : usrCodeArr){
if(sessionUsrDtls.getUsrCode().equalsIgnoreCase(tempUserCode)){
multiLoginAllowed = true;
}
}
}
if(!multiLoginAllowed){
for( Entry<ActiveLoginUserDetails, HttpSession> tempLoginDtls : activeLoginDtls.entrySet()){
ActiveLoginUserDetails temp = tempLoginDtls.getKey();
if(temp.getUsrCode().equals(sessionUsrDtls.getUsrCode())){
if (event.getSession() != null) {
check = false;
event.getSession().invalidate();
log.debug("After Invalidating duplicate session for "+sessionUsrDtls.getUsrCode());
}
}
}
}
if(check){
log.debug("Inside adding user from session:::");
activeLoginDtls.put(this, event.getSession());
}
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
log.debug("Inside removing user from session:::");
activeLoginDtls.remove(this);
loggedInUserDtlsMap.remove(this);
}
}
Он вызывает исключение NullPointerException (для объекта sessionUsrDtls) в строке
if(sessionUsrDtls.getUsrCode().equalsIgnoreCase(tempUserCode)){
, который обозначает, что атрибут не установлен в сеанс.но этот метод будет вызываться только после установки значения в сессию, поэтому не удалось понять, в чем именно заключается проблема.