SpringBoot+Vue+Redis 단일 로그 인 실현(한 곳 은 로그 인 하고 다른 곳 은 로그 인 종료)

수요
사용자 가 브 라 우 저 에 로그 인 한 후 다른 페이지 로 이동 하 는 것 을 실현 합 니 다.사용자 가 다른 곳 에서 다시 로그 인 할 때 앞 에 사용자 가 로그 인 한 페이지 는 로그 인 을 종료 합 니 다(qq 번호 와 같은 방식)
2.사고 방향 실현
사용자 가 전단 에 사용자 정 보 를 입력 하고 로그 인 한 후에 배경 에서 데 이 터 를 받 으 면 데이터 베 이 스 를 먼저 판단 합 니 다.로그 인 에 성공 하면 map 집합 을 만 들 고 사용자 id 를 키 로 하고 token 을 값 으로 합 니 다.먼저 현재 로그 인 사용자 의 id 를 통 해 token 을 가 져 옵 니 다.token 이 존재 하면 이 사용자 가 로그 인 했다 는 것 을 설명 하고 redis 를 호출 하여 token 을 키 로 이전 사용자 의 정 보 를 삭제 하고 호출 방법 으로 새로운 token 을 생 성 합 니 다.또한 token 을 map 집합 에 저장 하고 사용자 정 보 를 redis 에 저장 하 며 token 을 쿠키 에 저장 합 니 다.사용자 가 앞에서 로그 인 한 페이지 로 돌아 갈 때 페이지 를 새로 고치 고 호출 방법 을 사용 합 니 다.백 엔 드 를 통 해 쿠키 의 token 값 을 얻 고 token 을 통 해 redis 에서 사용자 정보 가 존재 하 는 지 확인 합 니 다.존재 하지 않 으 면 전단 은 반환 값 을 통 해 로그 인 페이지 로 다시 돌아 갑 니 다!
3.실현 코드
백 엔 드:
1.SpringBoot 프로젝트 를 만 들 고 User 표를 만 듭 니 다.Vue 를 통 해 작 성 된 것 이기 때문에 앞 뒤 가 분리 되 고 도 메 인 을 넘 어야 합 니 다.저 는 도 메 인 설정 류,그리고 redis 의 util 류 를 작 성 했 습 니 다.되 돌아 오 는 패 키 징 류,쿠키 의 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 를 작성 하여 로그 인 한 업무 논리 처리

@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("    ,    !");
      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("    !");
      return responseResult;
    }
  }
}
Vue 프론트 엔 드
1.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 에서 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.전단 의 코드 는 여기에 붙 이지 않 습 니 다.코드 는 상세 한 주석 이 있 습 니 다.코드 를 다운로드 하여 보 세 요.
4.코드 주소 와 프레젠테이션 효과
로그 인:


오프라인:

dome 코드 주소
링크:https://pan.baidu.com/s/1rXU46LCLpMxDzVEV_CpqFw
추출 코드:yquh
총결산
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 SpringBoot+Vue+Redis 가 단일 로그 인(한 곳 은 로그 인 하고 다른 곳 은 로그 인 을 종료)을 실현 하 는 것 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기