欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

SpringMVC實(shí)現(xiàn)賬號(hào)只能在一處登陸

一、問題引導(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),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

在Web開發(fā)中,實(shí)現(xiàn)一個(gè)賬號(hào)只能在一處登陸有兩種形式:1.當(dāng)某個(gè)賬號(hào)在某處登陸后,如果再在其他處登陸,將前一個(gè)賬號(hào)擠掉;2.當(dāng)某個(gè)賬號(hào)登陸后,此賬號(hào)在其他設(shè)備登陸提示已經(jīng)登陸,無法登陸。 正常的應(yīng)用邏輯第一種應(yīng)用較為廣泛,因此此篇文章討論一下第一種邏輯在spring mvc開發(fā)中一種較為簡(jiǎn)單的實(shí)現(xiàn)方式。

然而在沒有長(zhǎng)連接如WebSocket或者異步請(qǐng)求輪詢的情況下,我們之前登陸的賬號(hào)只能在下一次請(qǐng)求(同步或異步)才能獲取被擠掉的狀態(tài)(如頁面跳轉(zhuǎn))。 

二、實(shí)現(xiàn)步驟

1.建立一個(gè)靜態(tài)Map,用來存放賬號(hào)和sessionID的對(duì)應(yīng)關(guān)系

2.在登陸時(shí),校驗(yàn)Map中是否已存在此賬號(hào),如果不存在說明是第一次登陸,將賬號(hào)和sessionID的對(duì)應(yīng)關(guān)系存放到靜態(tài)Map中;如果Map中存在此賬號(hào),并且sessionID和本次請(qǐng)求的sessionID不一致,將Map中的sessionID替換掉,因此之前登陸的賬戶在發(fā)送下一次非登錄和校驗(yàn)的請(qǐng)求會(huì)被攔截。

3.創(chuàng)建攔截器,攔截除登陸和校驗(yàn)url以外的所有請(qǐng)求。判斷請(qǐng)求的sessionID和靜態(tài)Map中此賬戶對(duì)應(yīng)的sessionID是否一致。如果不一致,跳轉(zhuǎn)到登陸頁面。

三、實(shí)現(xiàn)代碼

1.創(chuàng)建一個(gè)內(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ù)庫(kù)查找用戶
      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;
      }
      //如果是其他請(qǐng)求地址,進(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{ //如果請(qǐng)求的sessionID和此賬號(hào)Map中存放的sessionID不一致,跳轉(zhuǎn)到登陸頁

          //判斷如果是異步請(qǐng)求,設(shè)置響應(yīng)頭 sessionstatus為timeout,自動(dòng)跳轉(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配置文件中添加攔截器

  <!--配置攔截器, 多個(gè)攔截器,順序執(zhí)行 -->
  <mvc:interceptors> 
    <mvc:interceptor>
      <mvc:mapping path="/**"/>
      <bean class="com.jiefupay.newplat.controller.SingleUserInterceptor"/>
     </mvc:interceptor> 
  </mvc:interceptors>

 四、后續(xù)

此種方式實(shí)現(xiàn)一個(gè)賬號(hào)只能在一處登陸是一種較簡(jiǎn)單的方法,當(dāng)然也可以通過移除session的方式實(shí)現(xiàn)。本文皆由本人親測(cè)實(shí)現(xiàn),如有錯(cuò)誤,歡迎指正。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

當(dāng)前名稱:SpringMVC實(shí)現(xiàn)賬號(hào)只能在一處登陸
瀏覽路徑:http://aaarwkj.com/article8/iicoip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、App開發(fā)網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷云服務(wù)器、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
午夜激情在线观看网页| 高清av网站大全网站| 精品一级人片内射视频| 久久精品国产亚洲av波多| 国产精品日本一区二区三区在线| 亚洲综合国产一二三四五区| 精品人妻一区二区三区不卡| 国产传媒在线免费播放| 熟女人妻精品一二三四| 色噜噜人妻av中文字幕| 免费观看亚洲成人av| 日韩在线国产精品一区| 成人福利午夜一区二区| 欧美日韩国产激情在线观看| 欧美激情片免费在线观看| 国产成人公开免费视频| 色综合婷婷九月中文字幕| 欧美中文日韩国产字幕| 国产精品推荐在线观看| 日韩欧美一区二区狠狠插| 日本一级二级三级在线看| 日韩新片一区二区三区| 日本中文字幕黄色人妻| 亚洲国产成人精品福利| 国产综合亚洲欧美日韩在线| 国产日本欧美一区二区三区| 亚洲福利影院一区久久| 少妇按摩高潮呻吟av| 99久久婷婷免费国产综合精品| av免费观看男人的天堂| 日韩欧美黄色三级视频| 伊人欧美一区二区三区| 精品一区二区三区女同| 中午字幕久久亚洲精品| 国产精品99久久久久久宅男九| 射精视频在线观看免费| 曰韩精品一区二区三区乱码| 亚洲另类综合日韩一区| 国产三级网站在线观看播放| 91在线免费观看国产精品| 十八禁在线观看点击进入|