最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年03月06日 17:23:29   作者:MalcolmF  
這篇文章主要為大家詳細介紹了SpringMVC如何實現(xiàn)賬號只能在一處登陸,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、問題引導(dǎo)

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

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

二、實現(xiàn)步驟

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

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

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

三、實現(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,實現(xiàn)校驗登陸用戶

  @Controller
  public class AdminController extends BaseController{

    @Autowired
    public AdminService adminService;

    /**
    * 校驗登陸管理員
    * @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;
      }
      //如果是其他請求地址,進行攔截 
      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ù)

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中map遍歷方式的選擇問題詳解

    Java中map遍歷方式的選擇問題詳解

    這篇文章主要介紹了Java中map遍歷方式的選擇問題的相關(guān)內(nèi)容,小編覺得挺不錯的,在則里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • java?線程池如何執(zhí)行策略又拒絕哪些策略

    java?線程池如何執(zhí)行策略又拒絕哪些策略

    這篇文章主要介紹了java?線程池如何執(zhí)行策略又拒絕哪些策略,文章通過線程池的執(zhí)行方法?execute()?展開全篇內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • jar命令修改jar包中的application.yml配置文件

    jar命令修改jar包中的application.yml配置文件

    本文主要介紹了jar命令修改jar包中的application.yml配置文件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • JavaWeb中Tomcat底層機制和Servlet運行原理詳解

    JavaWeb中Tomcat底層機制和Servlet運行原理詳解

    這篇文章主要介紹了JavaWeb中Tomcat底層機制和Servlet運行原理詳解,Tomcat是一個開源的Java Web服務(wù)器,它是基于Java Servlet和JavaServer Pages(JSP)技術(shù)的,下面是關(guān)于Tomcat底層機制和Servlet運行原理的簡要說明,需要的朋友可以參考下
    2023-10-10
  • java使用rmi傳輸大文件示例分享

    java使用rmi傳輸大文件示例分享

    由于在rmi中無法傳輸文件流,可以先用FileInputStream將文件讀到一個Byte數(shù)組中,然后把這個Byte數(shù)組作為參數(shù)傳進RMI的方法中,然后在服務(wù)器端將Byte數(shù)組還原為outputStream,這樣就能通過RMI 來傳輸文件了,下面我們來看實例
    2014-01-01
  • 如何修改覆蓋spring boot默認日志策略logback詳解

    如何修改覆蓋spring boot默認日志策略logback詳解

    這篇文章主要給大家介紹了關(guān)于如何修改覆蓋spring boot默認日志策略logback的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • 基于Springboot2.3訪問本地路徑下靜態(tài)資源的方法(解決報錯:Not allowed to load local resource)

    基于Springboot2.3訪問本地路徑下靜態(tài)資源的方法(解決報錯:Not allowed to load local

    這篇文章主要介紹了基于Springboot2.3訪問本地路徑下靜態(tài)資源的方法(解決報錯:Not allowed to load local resource),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 如何配置Spring Boot中的Jackson序列化

    如何配置Spring Boot中的Jackson序列化

    在開發(fā)基于Spring Boot的應(yīng)用程序時,Jackson是默認的JSON序列化和反序列化工具,本文將詳細介紹如何在Spring Boot中配置Jackson,以滿足這些需求,感興趣的朋友一起看看吧
    2025-04-04
  • SparkSQL讀取hive數(shù)據(jù)本地idea運行的方法詳解

    SparkSQL讀取hive數(shù)據(jù)本地idea運行的方法詳解

    這篇文章主要介紹了SparkSQL讀取hive數(shù)據(jù)本地idea運行的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 百度Java面試題 前200頁精選(下)

    百度Java面試題 前200頁精選(下)

    這篇文章主要為大家分享了Java面試資源下篇,百度“Java面試題”前200頁都在這里了,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論

张北县| 华池县| 泸西县| 邵武市| 松阳县| 巨野县| 芦山县| 崇左市| 泌阳县| 塔城市| 霍山县| 清新县| 南汇区| 南平市| 凤山市| 和龙市| 尼玛县| 江安县| 南汇区| 蓬安县| 满洲里市| 长兴县| 阿荣旗| 屏山县| 双城市| 白玉县| 龙门县| 南平市| 拜城县| 陈巴尔虎旗| 和龙市| 香格里拉县| 聂拉木县| 小金县| 宜兴市| 通城县| 刚察县| 江都市| 广南县| 且末县| 花莲县|