简体   繁体   中英

Spring MVC @SessionAttributes

here's my code for the controller: I have put my object in a map in the "doLogin" method below and I am trying to access it in my "logout" function but I am getting null value when I am trying to fetch value of my session attribute using "map.get(key)"

@Controller
@SessionAttributes(value={"session1"})
public class CredentialsController {

    @Autowired
     private Authentication authenticationDao;

    @Autowired
     private User userDao;

    @RequestMapping(value="/start",method=RequestMethod.GET)   //Default Method
    public  String  doStart(@ModelAttribute CredentialsBean credentialsBean)  
    {
        return "login";
    }

    @RequestMapping(value="/login",method=RequestMethod.GET)   //Default Method
    public  String  doLogin(@ModelAttribute CredentialsBean credentialsBean,Map<String,Object> map)
    {   
        String result="";
        if(credentialsBean!=null){
            if(authenticationDao.authenticate(credentialsBean)){
                String userType=authenticationDao.authorize(credentialsBean.getUserID());
                if(userType.equalsIgnoreCase("A")){

                    CredentialsBean cBean= authenticationDao.changeLoginStatus(credentialsBean, 1);
                    map.put("session1",cBean);  ----->Here I am putting the object inside a map .
                    result= "admin";
                    //map.put("username",credentialsBean.getProfileBean().getFirstName());
                }
                else{


                    CredentialsBean cBean=authenticationDao.changeLoginStatus(credentialsBean, 1);
                    map.put("session1",cBean.getUserID());
                    //System.out.println(cBean.getUserID());
                    result= "customer";

                    //map.put("username",credentialsBean.getProfileBean().getFirstName());
                }
            }
            else{
                result="ERROR";
            }
        }

        return result;
    }

    @RequestMapping(value="/logout",method=RequestMethod.GET)   //Default Method
    public  String  doLogout(Map<String,Object >  map)
    {
        CredentialsBean credentialsBean=(CredentialsBean)map.get("session1");

        //System.out.println(userID);
        System.out.println(credentialsBean.getUserID());
        if(credentialsBean!=null){
            if(userDao.logout(credentialsBean.getUserID())){
                return "logout";
            }
            else{
                return "error1";
            }

        }
        else{
            return "error";
        }
    }
}

Here is the way I would do it: in your doLogin method you should add HttpSession session :

@RequestMapping(value="/login",method=RequestMethod.GET)   //Default Method
public  String  doLogin(@ModelAttribute CredentialsBean credentialsBean, HttpSession session)
{   
    String result="";
    if(credentialsBean!=null){
        if(authenticationDao.authenticate(credentialsBean)){
            String userType=authenticationDao.authorize(credentialsBean.getUserID());
            if(userType.equalsIgnoreCase("A")){

                CredentialsBean cBean= authenticationDao.changeLoginStatus(credentialsBean, 1);
                // add object to session
                session.setAttribute("session1",cBean);
                result= "admin";
                //map.put("username",credentialsBean.getProfileBean().getFirstName());
            }
            else{
                CredentialsBean cBean=authenticationDao.changeLoginStatus(credentialsBean, 1);
                session.setAttribute("session1",cBean);
                result= "customer";
            }
        }
        else{
            result="ERROR";
        }
    }

    return result;
}

Note, that you should add to session objects of the same type in order to safely retrieve it later (because now you added different objects cBean and cBean.getUserID() for the same key session1 )


Then in your logout:

    @RequestMapping(value="/logout",method=RequestMethod.GET)   //Default Method
    public  String  doLogout(HttpSession session)
    {
        CredentialsBean credentialsBean=(CredentialsBean)session.getAttribute("session1");
       .....
}

But anyway, since you're implementing login\\logout here I encourage you to learn more about Spring Security.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM