java - Track User Login Session using HttpSessionBinding Event -
i want track user session check multiple logins same user
the execution of web app follows
in below servletcontextlistener initializing java.util.set store active users , setting servletcontext object should available whole web app
@weblistener public class initilizationclass implements servletcontextlistener { /** * default constructor. */ public initilizationclass() { // todo auto-generated constructor stub } /** * @see servletcontextlistener#contextdestroyed(servletcontextevent) */ public void contextdestroyed(servletcontextevent arg0) { // todo auto-generated method stub } /** * @see servletcontextlistener#contextinitialized(servletcontextevent) */ public void contextinitialized(servletcontextevent arg0) { // todo auto-generated method stub system.out.println("setting initialization parameters"); set<activeuser> allusers = new hashset<activeuser>(); servletcontext sc = arg0.getservletcontext(); sc.setattribute("logins", allusers); } } below servlet code. when user enters username , password, username set activeuser class httpsessionbindinglistener. httpsession initialized store activeuser object in session.
protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { string username=request.getparameter("username"); string password=request.getparameter("pass"); activeuser user = new activeuser(); user.setusername(username); httpsession session = request.getsession(); if(session.isnew()) { session.setattribute("userlogged", user); } else { session.setattribute("userlogged", user); } } now setattribbute in above servlet invoke valuebound method in below class. in method if set empty activeuser object added set. if second login same user same credentials should display message "user logged in name (its username)".
public class activeuser implements httpsessionbindinglistener { private string username = null; private string password = null; public void setusername(string uname) { this.username = uname; } public string getusername() { return this.username; } @override public void valuebound(httpsessionbindingevent arg0) { // todo auto-generated method stub servletcontext sc = arg0.getsession().getservletcontext(); activeuser session = (activeuser) arg0.getsession().getattribute("userlogged"); set<activeuser> user = (set<activeuser>) sc.getattribute("logins"); if(user.isempty()) { system.out.println("a user session has been created"); user.add(session); sc.setattribute("logins", user); } else { for(activeuser users : user) { system.out.println("names "+users.getusername()); // null pointer exception if(session.getusername().equals(users.getusername())) { user.remove(users); system.out.println("user logged in name "+users.getusername()); } } } } @override public void valueunbound(httpsessionbindingevent arg0) { // todo auto-generated method stub } } i getting null pointer exception on line
system.out.println("names "+users.getusername()); on second login
for(activeuser users : user) { system.out.println("names "+users.getusername()); // null pointer exception if(session.getusername().equals(users.getusername())) i think more probable line
session.getusername().equals(users.getusername()) is 1 throwing npe. because valuebound method called when attribute added session, not attribute looking for. check specific attribute
public void valuebound(httpsessionbindingevent arg0) { string attr = (string)arg0.getvalue(); if("userlogged".equals(attr){ //do stuff here } } a couple of other things not related
- the below code makes no sense
if(session.isnew()) { session.setattribute("userlogged", user); } else { session.setattribute("userlogged", user); }
- this technique never work if application deployed in cluster.
Comments
Post a Comment