HttpSessionBindingListener генерирует исключение NullPointerException на сервере TomCat - PullRequest
0 голосов
/ 10 октября 2018

Я использую 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)){

, который обозначает, что атрибут не установлен в сеанс.но этот метод будет вызываться только после установки значения в сессию, поэтому не удалось понять, в чем именно заключается проблема.

...