WEB管理员删除在线用户的处理办法
程序员文章站
2022-06-30 10:28:15
...
最近用户抱怨使用二个浏览器登录WEB界面,一台登录管理员,另外一台登录普通用户,管理员在删除当前普通用户以后,这个普通用户还能继续做其他的操作。按照他们的想法是这个普通户用被踢出去。
经过检查发现现有的代码修改起来很是麻烦,于是就打算把所有的登录用户信息放在APPLICATION里面,然后当管理员删除某个用户的时候拿到所有的MAP记录,找到需要删除的用户然后停掉SESSION。
处理的办法
Setp1:写一个过滤器,得到所有登录用户的信息.
Step2:在 delete方法里面拿到MAP的所有信息,然后比较出需要删除的用户。
本来管理员是不可以删除当前在线用户的,但是既然要改,也是没有办法的。只能采用这样的办法。
经过检查发现现有的代码修改起来很是麻烦,于是就打算把所有的登录用户信息放在APPLICATION里面,然后当管理员删除某个用户的时候拿到所有的MAP记录,找到需要删除的用户然后停掉SESSION。
处理的办法
Setp1:写一个过滤器,得到所有登录用户的信息.
<filter>
<filter-name>CheckUserOnline</filter-name>
<filter-class>com.warlock.stat.cdrgui.util.UserSingleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CheckUserOnline</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import com.warlock.stat.cdrgui.admin.app.web.common.SessionManager;
import com.warlock.stat.cdrgui.admin.entity.UserInfo;
public class UserSingleFilter implements Filter{
private Logger log = Logger.getLogger(getClass());
private FilterConfig filterConfig;
@Override
public void destroy() {
this.filterConfig = null;
}
/**
* Check the user login and store the all user info into application
* @param req - ServletRequest
* @param resp - ServletResponse
* @param chain - FilterChain
*
*/
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
HttpSession session = request.getSession();
boolean isLogin = false;
if(session.getAttribute(SessionManager.SESSION_USER)!=null){
isLogin = true;
}
log.info("isLogin :"+isLogin);
if(isLogin){
UserInfo useInfo = (UserInfo)session.getAttribute(SessionManager.SESSION_USER);
String currSessionID = session.getId();
String userId = useInfo.getUserId();
Map userLoginMap = null;
if(session.getServletContext().getAttribute("userLoginMap")!=null){
userLoginMap =(Map)session.getServletContext().getAttribute("userLoginMap");
if(userLoginMap!=null && userLoginMap.size()>0){
if(!userLoginMap.containsKey(currSessionID+userId)){
userLoginMap.put(currSessionID+userId, session);
}
}else{
userLoginMap.put(currSessionID+userId, session);
}
}else{
userLoginMap = new HashMap();
userLoginMap.put(currSessionID+userId, session);
}
if(userLoginMap!=null){
session.getServletContext().setAttribute("userLoginMap", userLoginMap);
}
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
}
Step2:在 delete方法里面拿到MAP的所有信息,然后比较出需要删除的用户。
//When delete the online user, get the all user info from Application and termination sessions
logger.info(" Delete user name is :"+targetUser);
Map usrAllMap = null;
Map usrSpeMap = null;
if(request.getSession().getServletContext().getAttribute("userLoginMap")!=null){
usrAllMap = (Map)request.getSession().getServletContext().getAttribute("userLoginMap");
if(usrAllMap!=null && usrAllMap.size()>0){
String tmpKey = null;
Iterator iterator = usrAllMap.keySet().iterator();
usrSpeMap = new HashMap();
String strValue = "";
while (iterator.hasNext()){
tmpKey = iterator.next().toString();
if(tmpKey.endsWith(targetUser)){
HttpSession sessiontmp = (HttpSession)usrAllMap.get(tmpKey); sessiontmp.removeAttribute(SessionManager.SESSION_USER);
sessiontmp.invalidate();
usrSpeMap.put(tmpKey, strValue);
logger.info("Remove the online user");
}
}
if(usrSpeMap!=null && usrSpeMap.size()>0){
Iterator iteUsrMap = usrSpeMap.keySet().iterator();
while(iteUsrMap.hasNext()){
logger.info("Remove the user from Map");
usrAllMap.remove(iteUsrMap.next());
}
}
}
}
本来管理员是不可以删除当前在线用户的,但是既然要改,也是没有办法的。只能采用这样的办法。
推荐阅读