SpringBoot+JPA+AJAX实现互斥登录

该博客介绍了如何使用HTML、Ajax、Spring Boot和Session实现浏览器端的单点登录功能。当用户在一处登录后,其他浏览器窗口或标签页将无法再次登录,确保了登录的互斥性。主要涉及前端页面的Ajax请求、LoginController的登录处理以及LoginServiceImpl的业务逻辑,通过比较不同Session ID来判断是否已登录。

数据库的建立,建立登录表 

建包,我这个登录写在其他项目里,所以咱们只看有关登录的(Login)模块

 html页面展示

进入登录页面 

 登录成功跳转登录成功后的页面

换个浏览器重新登录

 

会显示已经登录,不能重复登录,路径不会发生改变

代码实现

html页面实现

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
</head>
<body>
账号:<input type="text">
密码:<input type="text">
<input type="button" value="登录" onclick="login()">
</body>
<script>
  function login() {
    $.ajax({
      url:'/logins/login',
      type:'get',
      dataType:'json',
      success:function (data){
        if (data==1) {
          alert("登录成功")
            location.href="/logins/success"
        }
          if (data==0) {
              alert("登录失败你已经在别的浏览器打开!")
          }
      }
    })
  }
</script>
</html>

点击登录发生ajax请求跳转至LoginController

package com.xcj.controller;

import com.xcj.pojo.Login;
import com.xcj.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/logins")
public class LoginController {
    @Autowired
    private LoginService loginService;

    @RequestMapping("/toLogin")
    public String toLogin(){
        return "login";
    }

    @RequestMapping("/login")
    @ResponseBody
    public int login(HttpServletRequest request, Login login){
       return loginService.login(login,request);
    }

    @RequestMapping("/success")
    public String success(){
        return "success";
    }

}

 看下login方法的业务逻辑层

package com.xcj.service.impl;

import com.xcj.pojo.Login;
import com.xcj.respository.LoginRepository;
import com.xcj.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.Optional;

@Service
public class LoginServiceImpl implements LoginService {
    @Autowired
    private LoginRepository loginRepository;
    
    @Override
    public int login(Login login, HttpServletRequest request){
        //定义每次登录产生的会话sessionId
        String loginId;
        //获取session会话sessionId
        String sessionId=(String) request.getSession().getAttribute("id");;
        //根据id查询账号密码方法
        Optional<Login> byId = loginRepository.findById(1);
        //如果找到实体返回它
        if (byId.isPresent()){
            login = byId.get();
            //如果账号密码不为空
            if (login!=null) {
                //登录成功,获取到此次产生的会话sessionId
                loginId = request.getSession().getId();
                //然后把此次产生的会话sessionId传入session会话
                request.getSession().setAttribute("id",loginId);
                try {
                    //如果会话sessionId跟此次登录session会话Id不一样,表示没登陆过
                    if (!sessionId.equals(loginId)) {
                        //登录成功,返回1
                        return 1;
                    }else {
                     //否则如果会话sessionId跟此次登录session会话Id一样,表示登陆过,返回0
                        return 0;
                    }
                }catch (NullPointerException e){
                    return 1;
                }
            }
        }
        return 0;
    }
}

返回1则代表登录成功,跳转登录成功页面,否则登录失败,停留在登录页面

  function login() {
    $.ajax({
      url:'/logins/login',
      type:'get',
      dataType:'json',
      success:function (data){
        if (data==1) {
          alert("登录成功")
            location.href="/logins/success"
        }
          if (data==0) {
              alert("登录失败你已经在别的浏览器打开!")
          }
      }
    })
  }

这样就实现浏览器不能多处登录的互斥功能了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值