java 单个用户的多重并发会话_单个用户的多重并发会话限制/限制单客户端同时登录多个用户...
我使用的是SSH2框架,做安全測試需要限制:1.單個用戶的多重并發會話限制 2. 限制單客戶端同時登錄多個用戶 。這兩個內容,沒有采用在web.xml中配置過濾器的方式,我處理的方式是如果一個用戶在第二臺電腦上登錄了就踢掉上一臺電腦登錄的用戶,如果同一個臺電腦有第二個用戶登錄 ,就踢掉之前登錄的帳號。
所以,是在登錄的方法中做的處理。
在登錄方法中加入如下兩行語句,作為程序的入口:
SessionListener.isAlreadyEnter(getHttpRequest().getSession(),this.getUserCode(),loginUser);
getHttpRequest().getSession().setAttribute("isLoginIn", "LoginIn");
在SessionListener類中做相關的踢出處理:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.struts2.ServletActionContext;
import com.hhwy.iepip.framework.message.Message;
import com.opensymphony.xwork2.ActionContext;
public class SessionListener implements HttpSessionListener,ServletRequestListener,HttpSessionAttributeListener{
public static Map sessionMap = new HashMap();
public static Map sessionMap1 = new HashMap();
private static Boolean onlyOne = Boolean.valueOf(Message.getMessage("session.onlyone"));
private HttpServletRequest request ;
/**獲取request對象*/
public void requestInitialized(ServletRequestEvent event) {
request = (HttpServletRequest)event.getServletRequest();
}
/**以下是實現HttpSessionListener中的方法:該方法登錄與否都會執行**/
public void sessionCreated(HttpSessionEvent se){
}
/**以下是實現HttpSessionListener中的方法**/
public void sessionDestroyed(HttpSessionEvent se){
hUserName.remove(se.getSession().getId());
UserObject.remove(se.getSession().getId());
if(sessionMap!=null){
sessionMap.remove(se.getSession().getId());
}
if(sessionMap1!=null){
sessionMap1.remove(se.getSession().getId());
}
}
/**
* isAlreadyEnter-用于判斷用戶是否已經登錄以及相應的處理方法
*
*/
public static boolean isAlreadyEnter(HttpSession session,String sUserName,LoginUserInfo loginTriggers){
boolean flag = false;
return flag;
}
/**
* 此方法,可以在登錄時候添加一個session 用以判斷是否已經登錄,然后再進行登錄人登錄控制
*/
public void attributeAdded(HttpSessionBindingEvent event) {
//如果只允許一個賬號一處登陸,單臺客戶端電腦只允許一個用戶登錄
if(onlyOne.booleanValue()){
String name = event.getName();
if(name.equals("isLoginIn")){
// 單臺客戶端電腦只允許一個用戶登錄
String ipAddr = this.getIpAddr(request);
//如果原先已登錄,則踢出原先登陸的
if(sessionMap1.containsKey(ipAddr) ){
try{
sessionMap1.get(ipAddr).invalidate();
}catch(Exception e){}
sessionMap1.remove(ipAddr);
}
if(ipAddr != null && event.getSession().isNew())
sessionMap1.put(ipAddr, event.getSession());
//只允許一個賬號一個客戶端登陸
String userName= getUserName(event);
if(sessionMap.containsKey(userName) ){
try{
sessionMap.get(userName).invalidate();
}catch(Exception e){}
sessionMap.remove(userName);
}
if(userName != null && event.getSession().isNew())
sessionMap.put(userName, event.getSession());
}
}
}
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
/*獲取session中存儲的用戶名*/
private String getUserName(HttpSessionBindingEvent se) {
String userName = null;
return userName;
}
public void attributeRemoved(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
}
}
總結
以上是生活随笔為你收集整理的java 单个用户的多重并发会话_单个用户的多重并发会话限制/限制单客户端同时登录多个用户...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 常量区存放 new_java常
- 下一篇: java领单_Java-单例模式