亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot+Vue+Redis實現單點登錄(一處登錄另一處退出登錄)

 更新時間:2019年12月04日 12:03:51   作者:夢 隱  
小編接到一個需求,需要實現用戶在瀏覽器登錄后,跳轉到其他頁面,當用戶在其它地方又登錄時,前面用戶登錄的頁面退出登錄,這篇文章主要介紹了SpringBoot+Vue+Redis實現單點登錄,需要的朋友可以參考下

一、需求

實現用戶在瀏覽器登錄后,跳轉到其他頁面,當用戶在其它地方又登錄時,前面用戶登錄的頁面退出登錄(列如qq擠號那種方式)

二、實現思路

用戶在前端填寫用戶信息登錄后,后臺接收數據先去數據庫進行判斷,如果登錄成功,創(chuàng)建map集合,以用戶id為鍵,token為值,先通過當前登錄用戶的id去獲取token,如果token存在說明該用戶已經登錄過,調用redis以token為鍵刪除上個用戶的信息,調用方法生成新token,并將token存入map集合,將用戶信息存入redis,并將token存入cookie。當用戶回到前面登錄的頁面時,刷新頁面,調用方法,通過后端獲取cookie的token值,通過token在redis中查詢用戶信息是否存在,如果不存在,前端通過返回值判斷重新回到登錄頁面!

三、實現代碼

后端:

1、創(chuàng)建SpringBoot項目,創(chuàng)建User表,由于是通過Vue編寫的,所以是前后端分離,需要跨域,我這里編寫了跨域配置類,還有redis的util類,返回的封裝類,cookie的util類,文末有源碼提供,可以自行提取。

2、yum配置文件

spring:
 redis:
  database: 0  #redis的默認數據庫為0
  host: 127.0.0.1 #鏈接redis的ip
  port: 6379 #鏈接redis的端口號
  password:  #鏈接redis的密碼 默認為空
  jedis:
   pool:
    max-total: 200  #鏈接redis的總數目
    max-active: 100 #鏈接redis的最大
    max-idle: 8   #最大的鏈接數量
    min-idle: 5   #最小的鏈接數量
 datasource:
  url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true
  username: root
  password: root
  driver-class-name: com.mysql.jdbc.Driver
 jpa:
  show-sql: true
server:
 port: 8888

REDIS_KEY : USER_TOKEN

3、編寫實體User.class

@Data
@Entity
@Table(name = "user")
public class User {
  @Id
  @Column(name = "id",unique = true,nullable = false)
  private int id;
  @Column(name = "username",nullable = false)
  private String username;
  @Column(name = "password",nullable = false)
  private String password;
}

4、編寫Dao,UserDao.class

public interface UserDao extends JpaRepository<User,Integer> {
  public User findByUsernameAndPassword(String username, String password);
}

5、編寫serviceImpl,UserServiceImpl.class進行登錄的業(yè)務邏輯處理

@Service
public class UserServiceImpl{
  @Autowired
  private UserDao userDao;
  @Autowired
  private JedisDao jedisDao;
  @Value("${REDIS_KEY}")  //從配置文件中取值
  private String KEY;
  private Map<Integer,String> UserLogin = new HashMap<>();
  /**
   * 登錄
   * @param request
   * @param response
   * @param u
   * @return
   */
  public User userlogin(HttpServletRequest request, HttpServletResponse response, User u){
    //查詢登錄是否成功
    User user=userDao.findByUsernameAndPassword(u.getUsername(),u.getPassword());
    //判斷us是否為空
    if(user==null){
      return null;
    }
    //生成token
    String token="user_"+ UUID.randomUUID().toString();
    //從map中獲得redis中的key
    String oldToken = UserLogin.get(user.getId());
    //判斷map中是否存在該id
    if(!StringUtils.isEmpty(oldToken)){
      //刪除redis中老的值
      jedisDao.delValue(oldToken);
    }
    //將新的的key保存到map中
    UserLogin.put(user.getId(),token);
    //將信息存入redis
    jedisDao.setValue(token, JsonUtils.objectToJson(user));
    //將token放入cookie中
    CookieUtils.setCookie(request,response,KEY,token,5*60,true);
    return user;
  }

  /**
   * 判斷是否登錄
   * @param response
   * @param request
   * @return
   */
  public String getUserByToken(HttpServletResponse response, HttpServletRequest request) {
    //從cookie中取出用戶token
    String token=CookieUtils.getCookieValue(request,KEY);
    //從redis中取出用戶信息
    String user= jedisDao.getValue(token);
    return user;
  }
}

6、編寫controller,接收前端請求,返回數據

@RestController
public class LoginController {
  @Autowired
  private UserServiceImpl userService;
  /**
   * 登錄
   * @param response
   * @param request
   * @param user
   * @param model
   * @return
   */
  @PostMapping("/login")
  public ResponseResult Login(HttpServletResponse response , HttpServletRequest request, @RequestBody User user, Model model){
    ResponseResult responseResult=new ResponseResult();
    try {
      User user2 = userService.userlogin(request, response, user);
      if (user2!=null){
        responseResult.setState(200);
        responseResult.setMsg("登錄成功!");
        return responseResult;
      }else{
        responseResult.setState(202);
        responseResult.setMsg("用戶名或密碼錯誤!");
        return responseResult;
      }
    }catch (Exception e) {
      responseResult.setState(500);
      responseResult.setMsg("發(fā)生錯誤,登錄失敗!");
      return responseResult;
    }
  }
  /**
   * 判斷是否登錄
   * @param response
   * @param request
   * @return
   * @throws Exception
   */
  @GetMapping("/toLogin")
  public ResponseResult getUserInfo(HttpServletResponse response , HttpServletRequest request) throws Exception {
    ResponseResult responseResult=new ResponseResult();
    try{
      String token = userService.getUserByToken(response, request);
      if(token!=null){
        responseResult.setState(200);
        responseResult.setMsg("登錄中!");
        return responseResult;
      }else{
        responseResult.setState(202);
        responseResult.setMsg("在別處登錄!");
        return responseResult;
      }
    }catch (Exception e){
      response.setStatus(500);
      responseResult.setMsg("發(fā)生錯誤!");
      return responseResult;
    }
  }
}

Vue前端

1、創(chuàng)建Vue項目:vue init webpack 項目名稱
2、引入axios:npm install --save axios vue-axios
3、引入element:npm i element-ui -S
4、在src的main.js下配置

import axios from 'axios'
import VueAxios from 'vue-axios'
// element-ui 引入文件
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
//注冊 VueAxios, axios
Vue.use(VueAxios, axios)
Vue.use(ElementUI)
//配置axios支持cookie
axios.defaults.withCredentials = true;

5、在src的components下創(chuàng)建login.vue,userinfo.vue,并在src的router下配置訪問地址

import Vue from 'vue'
import Router from 'vue-router'
import login from '@/components/login'
import UserInfo from '@/components/userinfo'

Vue.use(Router)

export default new Router({
 routes: [{
  path: '/login',
  component: login
 }, {
  path: '/user_info',
  component: UserInfo
 }]

})

6、前端的代碼這里就不貼出了,代碼是有詳細的注釋,請自行下載代碼查看

四、代碼地址和演示效果

登錄:

下線:

dome代碼地址

鏈接: https://pan.baidu.com/s/1rXU46LCLpMxDzVEV_CpqFw

提取碼: yquh

總結

以上所述是小編給大家介紹的SpringBoot+Vue+Redis實現單點登錄(一處登錄另一處退出登錄),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

相關文章

  • Java面試題沖刺第二十八天--數據庫(5)

    Java面試題沖刺第二十八天--數據庫(5)

    這篇文章主要為大家分享了最有價值的三道關于數據庫的面試題,涵蓋內容全面,包括數據結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Spring手動生成web.xml配置文件過程詳解

    Spring手動生成web.xml配置文件過程詳解

    這篇文章主要介紹了Spring手動生成web.xml配置文件過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • java 關鍵字static詳細介紹及如何使用

    java 關鍵字static詳細介紹及如何使用

    這篇文章主要介紹了java 關鍵字static詳細介紹及如何使用的相關資料,需要的朋友可以參考下
    2017-03-03
  • JdbcTemplate方法介紹與增刪改查操作實現

    JdbcTemplate方法介紹與增刪改查操作實現

    這篇文章主要給大家介紹了關于JdbcTemplate方法與增刪改查操作實現的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用JdbcTemplate具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-11-11
  • Java實現一個簡易聊天室流程

    Java實現一個簡易聊天室流程

    這篇文章主要介紹了我的java課程設計一個多人聊天室(socket+多線程)本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • java selenium 操作瀏覽器實例

    java selenium 操作瀏覽器實例

    本文主要介紹java selenium 操作瀏覽器,這里整理了相關資料,并附示例代碼,有需要的小伙伴可以參考下
    2016-08-08
  • python中jieba庫(中文分詞庫)使用安裝教程

    python中jieba庫(中文分詞庫)使用安裝教程

    這篇文章主要介紹了python中jieba庫(中文分詞庫)使用安裝教程,jieba庫是通過中文詞庫的方式來識別分詞的。它首先利用一個中文詞庫,通過詞庫計算漢字之間構成詞語的關聯(lián)概率,所以通過計算漢字之間的概率,就可以形成分詞的結果,需要的朋友可以參考下
    2023-04-04
  • jsoup?框架的使用小結

    jsoup?框架的使用小結

    jsoup 是一款基于Java的HTML解析器,它提供了一套非常省力的API,不但能直接解析某個URL地址、HTML文本內容,而且還能通過類似于 DOM、CSS 或者jQuery的方法來操作數據,所以jsoup也可以被當做爬蟲工具使用,這篇文章主要介紹了jsoup使用,需要的朋友可以參考下
    2023-04-04
  • java數據結構關于棧的實例應用

    java數據結構關于棧的實例應用

    大家好,本篇文章主要講的是java數據結構關于棧的實例應用,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Java實戰(zhàn)之實現物流配送系統(tǒng)示例詳解

    Java實戰(zhàn)之實現物流配送系統(tǒng)示例詳解

    這篇文章主要介紹了一個java實戰(zhàn)項目:通過java、SSM、JSP、mysql和redis實現一個物流配送系統(tǒng)。文中的示例代碼非常詳細,需要的朋友可以參考一下
    2021-12-12

最新評論