限制在同一台电脑上只允许有一个用户登录
生活随笔
收集整理的這篇文章主要介紹了
限制在同一台电脑上只允许有一个用户登录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. html 部分
- 2. js部分
- 3. 攔截器部分
- 4. 認證授權部分
- 5. 控制層部分
- 6. 工具類
實現流程:
1.從reqest域中獲取現在登陸的新sessionId
2.根據登陸的用戶名從reqest域中獲取已經登陸的老sessionId
3.判斷老sessionId是否存在和新舊sessionId是否是否一致
如果一直返回當前用戶和當前用戶已經登陸的ip地址
前臺根據返回的結果頁面彈框提示
1. html 部分
<form id="formId" class="layui-form" action="${ctxPath}/login" method="post"><!-- 用戶名 --><div class="layui-form-item"><div class="layui-input-block"><img src="${ctxPath}/assets/common/img/user.png"><input id="username" type="text" name="username" id="username" requiredlay-verify="required" placeholder="輸入用戶名" autocomplete="off" class="layui-input"></div></div><!-- 密碼 --><div class="layui-form-item"><div class="layui-input-block"><img src="${ctxPath}/assets/common/img/password.png"><input type="password" name="password" id="password" required lay-verify="required"placeholder="輸入密碼" autocomplete="off" class="layui-input"></div></div><!-- 記住密碼 --><div class="layui-form-item"><label class="layui-form-label" lay-tips="7天內免登陸"style="width:60px !important;padding:9px 0;margin-right:20px">記住密碼</label><div class="layui-input-block"><input class="radio" type="radio" name="remember" value="on" title="是"><input type="radio" name="remember" value="off" title="否" checked=""></div></div><!-- 登錄按鈕 --><div class="layui-form-item"><button lay-filter="login-submit" id="submit" class="layui-btn layui-btn-primary loginBtn"lay-submit>登錄</button></div></form>2. js部分
<script>layui.use(['layer', 'form'], function () {var $ = layui.jquery;var layer = layui.layer;var form = layui.form;$("#submit").click(function () {$.ajax({url: "/checkLogin",type: 'POST',dataType: 'json',data: {username: $("#username").val()},async: false,success: function (msg) {var ip = msg.data.ip;if (ip != '') {if (window.confirm("用戶'" + $('#username').val() + "'已在" + ip + "登陸,是否在本電腦登陸?")) {falg = true;} else {falg = false;}}$('#formId').submit();}});return falg;});var errorMsg = "${tips!}";if (errorMsg) {layer.msg(errorMsg, {icon: 5, anim: 6});}}); </script>3. 攔截器部分
package com.gblfy.controller;import cn.stylefeng.roses.core.reqres.response.ResponseData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map;/*** 登陸前校驗** @author guobin* @date 2021-01-27*/ @Controller public class CheckLogInController {private final static Logger logger = LoggerFactory.getLogger(CheckLogInController.class);@RequestMapping(value = "/checkLogin", method = RequestMethod.POST)@ResponseBodypublic ResponseData CheckLogin(HttpServletRequest request, HttpServletResponse httpServletResponse) { // Boolean flag = false;//true-已經登陸 false-未登陸或登陸session一樣String ip = "";//返回空-未登錄。非空-已登錄Map<String, Object> mmap = new HashMap<>();try {//獲取當前用戶的sessionIdString sessionId = request.getSession().getId();//當前sessionidString username = request.getParameter("username").trim();//用戶名String sessionIdOld = (String) request.getServletContext().getAttribute(username);//老sessionId//如果老sessionId不為null 且新老sessionId不一致,則當前賬號已有人登陸mmap.put("ip",ip);if (null != sessionIdOld && !"".equals(sessionId) && !sessionId.equals(sessionIdOld)) {ip = (String) request.getServletContext().getAttribute(username + "IP");mmap.put("ip",ip);}} catch (Exception e) {logger.error("從session中獲取用戶登陸ip失敗:", e);ip = "";}return ResponseData.success(mmap);} }4. 認證授權部分
/*** 不需要權限驗證的資源表達式*/List<String> NONE_PERMISSION_RES = CollectionUtil.newLinkedList("/assets/**","/checkLogin","/login", "/global/sessionError", "/kaptcha", "/error", "/global/error");5. 控制層部分
/*** 點擊登錄執行的動作** @author gblfy* @Date 2019/11/23 5:42 PM*/@RequestMapping(value = "/login", method = RequestMethod.POST)public String loginVali(HttpServletRequest request) {String sessionId = request.getSession().getId();String username = super.getPara("username").trim();String password = super.getPara("password").trim();//如果開啟了記住我功能String remember = super.getPara("remember");Subject currentUser = ShiroKit.getSubject();UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray());//如果開啟了記住我功能if ("on".equals(remember)) {token.setRememberMe(true);} else {token.setRememberMe(false);}//執行shiro登錄操作currentUser.login(token);//登錄成功,記錄登錄日志ShiroUser shiroUser = ShiroKit.getUserNotNull();super.getSession().setAttribute("shiroUser", shiroUser);super.getSession().setAttribute("username", shiroUser.getAccount());try {//獲取老sessionIdString sessionIdOld = (String) request.getServletContext().getAttribute(username);if (null != sessionIdOld && !sessionId.equals(sessionIdOld)) {//注銷老sessionHttpSession session = (HttpSession) request.getServletContext().getAttribute(sessionIdOld);session.invalidate();}//獲取老sessionId} catch (Exception e) {e.printStackTrace();//非正常清空session}//重新賦值 request.getSession().getServletContext().setAttribute(username, sessionId);request.getSession().getServletContext().setAttribute(sessionId, request.getSession());request.getSession().getServletContext().setAttribute(username + "IP", Inet4AddresslUtils.getReqIp(request));LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp()));ShiroKit.getSession().setAttribute("sessionFlag", true);return REDIRECT + "/";}6. 工具類
package com.gblfy.controller;import org.slf4j.Logger; import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration;public class Inet4AddresslUtils {private final static Logger logger = LoggerFactory.getLogger(Inet4AddresslUtils.class);/*** 獲取請求主機的ip地址** @param request* @return*/public static String getReqIp(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");if ((ip == null) || (ip.length() == 0) || ("unknown".equalsIgnoreCase(ip))) {ip = request.getHeader("Proxy-Client-IP");}if ((ip == null) || (ip.length() == 0) || ("unknown".equalsIgnoreCase(ip))) {ip = request.getHeader("WL-Proxy-Client-IP");}if ((ip == null) || (ip.length() == 0) || ("unknown".equalsIgnoreCase(ip))) {ip = request.getRemoteAddr();}return ip;}/*** 獲取服務器本機的ip地址** @return*/public static String getInet4Address() {Enumeration<NetworkInterface> nis;String ip = null;try {nis = NetworkInterface.getNetworkInterfaces();for (; nis.hasMoreElements(); ) {NetworkInterface ni = nis.nextElement();Enumeration<InetAddress> ias = ni.getInetAddresses();for (; ias.hasMoreElements(); ) {InetAddress ia = ias.nextElement();if (ia instanceof Inet4Address && !ia.getHostAddress().equals("127.0.0.1")) {ip = ia.getHostAddress();}}}} catch (SocketException e) {logger.error("獲取ip地址異常", e);}return ip;} }總結
以上是生活随笔為你收集整理的限制在同一台电脑上只允许有一个用户登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定时器new Timer().sched
- 下一篇: quarz 定时任务 cron表达式