一、問題引導(dǎo)

成都創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)蔚縣,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
在Web開發(fā)中,實(shí)現(xiàn)一個賬號只能在一處登陸有兩種形式:1.當(dāng)某個賬號在某處登陸后,如果再在其他處登陸,將前一個賬號擠掉;2.當(dāng)某個賬號登陸后,此賬號在其他設(shè)備登陸提示已經(jīng)登陸,無法登陸。 正常的應(yīng)用邏輯第一種應(yīng)用較為廣泛,因此此篇文章討論一下第一種邏輯在spring mvc開發(fā)中一種較為簡單的實(shí)現(xiàn)方式。
然而在沒有長連接如WebSocket或者異步請求輪詢的情況下,我們之前登陸的賬號只能在下一次請求(同步或異步)才能獲取被擠掉的狀態(tài)(如頁面跳轉(zhuǎn))。
二、實(shí)現(xiàn)步驟
1.建立一個靜態(tài)Map,用來存放賬號和sessionID的對應(yīng)關(guān)系
2.在登陸時,校驗(yàn)Map中是否已存在此賬號,如果不存在說明是第一次登陸,將賬號和sessionID的對應(yīng)關(guān)系存放到靜態(tài)Map中;如果Map中存在此賬號,并且sessionID和本次請求的sessionID不一致,將Map中的sessionID替換掉,因此之前登陸的賬戶在發(fā)送下一次非登錄和校驗(yàn)的請求會被攔截。
3.創(chuàng)建攔截器,攔截除登陸和校驗(yàn)url以外的所有請求。判斷請求的sessionID和靜態(tài)Map中此賬戶對應(yīng)的sessionID是否一致。如果不一致,跳轉(zhuǎn)到登陸頁面。
三、實(shí)現(xiàn)代碼
1.創(chuàng)建一個內(nèi)存數(shù)據(jù)類,用于存放靜態(tài)的數(shù)據(jù),并初始化:
public class MemoryData {
private static Map<String, String> sessionIDMap = new HashMap<String,String>();
public static Map<String, String> getSessionIDMap() {
return sessionIDMap;
}
public static void setSessionIDMap(Map<String, String> sessionIDMap) {
MemoryData.sessionIDMap = sessionIDMap;
}
}
2.創(chuàng)建Controller,實(shí)現(xiàn)校驗(yàn)登陸用戶
@Controller
public class AdminController extends BaseController{
@Autowired
public AdminService adminService;
/**
* 校驗(yàn)登陸管理員
* @param request
* @param response
* @throws IOException
*/
@RequestMapping(value="/checkadmin")
public void checkUserInfo(HttpServletRequest request,HttpServletResponse response) throws IOException{
//1在數(shù)據(jù)庫查找用戶
AdminBean admin = adminService.queryUserInfo(usernameS);
//2將admin存放到Session中
request.getSession().setAttribute("admin", admin);
//3在sessionIDMap中存放此用戶sessionID
String sessionID = request.getRequestedSessionId();
String user = admin.getUsername();
if (!MemoryData.getSessionIDMap().containsKey(user)) { //不存在,首次登陸,放入Map
MemoryData.getSessionIDMap().put(user, sessionID);
}else if(MemoryData.getSessionIDMap().containsKey(user)&&!StringUtils.equals(sessionID, MemoryData.getSessionIDMap().get(user))){
MemoryData.getSessionIDMap().remove(user);
MemoryData.getSessionIDMap().put(user, sessionID);
}
}
}
3.創(chuàng)建攔截器
public class SingleUserInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
String url = request.getRequestURI();
//如果攔截到的是登錄的頁面的話放行
if(url.indexOf("login.do")>=0||url.indexOf("checkadmin.do")>=0){
return true;
}
//如果是其他請求地址,進(jìn)行攔截
AdminBean admin = (AdminBean) request.getSession().getAttribute("admin");
if(admin!=null){
String sessionid = MemoryData.getSessionIDMap().get(admin.getUsername());
//如果用戶名存在放心(即登錄放行)
if(sessionid.equals(request.getSession().getId())){
return true;
}else{ //如果請求的sessionID和此賬號Map中存放的sessionID不一致,跳轉(zhuǎn)到登陸頁
//判斷如果是異步請求,設(shè)置響應(yīng)頭 sessionstatus為timeout,自動跳轉(zhuǎn),否則重定向
if(request.getHeader("x-requested-with")!=null
&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
response.setHeader("sessionstatus","timeout");
return false;
}else{
String indexurl=request.getContextPath()+"/login.do";
response.sendRedirect(indexurl);
return false;
}
}
}
//如果session中沒有admin,跳轉(zhuǎn)到登陸頁
request.getRequestDispatcher(request.getContextPath()+"/index.do").forward(request, response);
return false;
}
}
4.在springmvc.xml配置文件中添加攔截器
<!--配置攔截器, 多個攔截器,順序執(zhí)行 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.jiefupay.newplat.controller.SingleUserInterceptor"/> </mvc:interceptor> </mvc:interceptors>
四、后續(xù)
此種方式實(shí)現(xiàn)一個賬號只能在一處登陸是一種較簡單的方法,當(dāng)然也可以通過移除session的方式實(shí)現(xiàn)。本文皆由本人親測實(shí)現(xiàn),如有錯誤,歡迎指正。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
當(dāng)前名稱:SpringMVC實(shí)現(xiàn)賬號只能在一處登陸
瀏覽路徑:http://chinadenli.net/article8/iicoip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、App開發(fā)、網(wǎng)站設(shè)計(jì)、網(wǎng)站營銷、云服務(wù)器、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)