数据库的建立,建立登录表
建包,我这个登录写在其他项目里,所以咱们只看有关登录的(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("登录失败你已经在别的浏览器打开!")
}
}
})
}
这样就实现浏览器不能多处登录的互斥功能了
该博客介绍了如何使用HTML、Ajax、Spring Boot和Session实现浏览器端的单点登录功能。当用户在一处登录后,其他浏览器窗口或标签页将无法再次登录,确保了登录的互斥性。主要涉及前端页面的Ajax请求、LoginController的登录处理以及LoginServiceImpl的业务逻辑,通过比较不同Session ID来判断是否已登录。

2696

被折叠的 条评论
为什么被折叠?



