B051-cms06-退出 回车登录 登录拦截 记住我 SVN

news2025/1/10 2:58:15

目录

      • 注销功能实现
        • 1.找到退出按钮修改请求路径
        • 2.后端删除Session并跳转到登录页面
      • 回车登录功能
      • 登陆拦截
        • 1.编写登录拦截器
        • 2.配置拦截器
      • 记住我
        • 后端实现
        • 页面实现
      • 取消记住我
        • 后端实现
        • 页面实现

注销功能实现

1.找到退出按钮修改请求路径

header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
		<header class="app-header">
    		<a class="app-header__logo" href="index.html">源码</a>
			<a class="app-sidebar__toggle" href="#" data-toggle="sidebar" aria-label="Hide Sidebar"></a>
			<!-- 导航条右边菜单 -->
      		<ul class="app-nav">
        		<!-- 用户菜单 -->
       	 		<li class="dropdown">
        			<a class="app-nav__item" href="#" data-toggle="dropdown" aria-label="Open Profile Menu">
        			<i class="fa fa-user fa-lg"></i></a>
          			<ul class="dropdown-menu settings-menu dropdown-menu-right">
            			<li>
            				<a class="dropdown-item" href="/system/logout">
            				<i class="fa fa-sign-out fa-lg"></i> 退出 </a>
            			</li>
          			</ul>
        		</li>
      		</ul>
		</header>

2.后端删除Session并跳转到登录页面

UserController

	@RequestMapping("/logout")
	public String logout(HttpSession session) {
		// 首先删除Session
		session.invalidate();
		// 跳转到登录页面
		return "login";
	}

回车登录功能

1.整个登录页面绑定键盘按压回车键事件
2.发送抽取之后的登陆请求
login.jsp

	<script type="text/javascript">
     	$(function(){
     		// 抽取登录方法
     		function login(){
     			$(".login-form").ajaxSubmit({
     				success: function(msg){
     					if(msg.success){// 成功
     						// 跳转到后台首页
     						location.href="/system/index";
     					}else{
     						$("#loginError").html("<font color='red' size='4'>"+msg.error+"</font>");
     					}
     				}
     			});
     		}
     		
     		$("#loginBtn").click(function(){
     			login();
     		});
     		
     		// 整个页面绑定键盘按压事件
     		$(document).on("keypress",function(e){
				// console.debug(e.keyCode)
				if(e.keyCode==13){
					login();
				}
			})
     	})
     </script>

登陆拦截

防止直接跳过登录页面直接访问后台页面
在这里插入图片描述

1.编写登录拦截器

LoginInterceptor

public class LoginInterceptor implements HandlerInterceptor {

	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2) throws Exception {
		// 判断session中是否有user
		// 获取session
		Object user = req.getSession().getAttribute("USER_IN_SESSION");
		if(user==null){// 没有登录
			//跳转到登录页面
			resp.sendRedirect("/system/login");
			return false;
		}
		return true;
	}

}

2.配置拦截器

applicationContext-mvc.xml

	<!-- 拦截器 -->
	<mvc:interceptors>
		<!-- 拦截器 -->
		<mvc:interceptor>
			<!-- 要拦截的配置,该配置必须写在不拦截的上面,/*拦截一级请求,/**拦截多级请求 -->
			<mvc:mapping path="/system/**"  />
			<!-- 设置不拦截的配置 -->
			<mvc:exclude-mapping path="/system/login"/>
			<!-- <mvc:exclude-mapping path="/upload"/> -->
			<!-- 配置拦截器 -->
			<bean class="cn.itsource.interceptor.LoginInterceptor" />  
		</mvc:interceptor>
	</mvc:interceptors>

记住我

有勾选记住我,账号密码正确,通过Cookie将账号密码显示到输入框中

<div class="animated-checkbox">
    <label>
        <input id="remember" name="remember" type="checkbox" value="1"><span class="label-text">记住我</span>
    </label>
</div>

后端实现

UserController

	@RequestMapping(value="/login",method=RequestMethod.POST)
	@ResponseBody
	public AjaxResult login(Integer remember,String username,String password,HttpSession session,HttpServletRequest req,HttpServletResponse resp){
		
		try {
			User user = service.login(username,password);
			// 把用户信息放入session中
			session.setAttribute("USER_IN_SESSION", user);
			
			// 判断是否勾选记住我
			if(remember!=null){
				
				// 创建cookie
				Cookie c1 = new Cookie("username", username);
				Cookie c2 = new Cookie("password", password);
				
				// 设置路径
				c1.setPath("/");
				c2.setPath("/");
				
				// 记住我时间     cookie存活时间
				c1.setMaxAge(7*24*60*60);
				c2.setMaxAge(7*24*60*60);
				
				// 添加到浏览器
				resp.addCookie(c1);
				resp.addCookie(c2);
			}
						
			return new AjaxResult();
		} catch (Exception e) {
			// 从exception中取错误信息
			return new AjaxResult(false, e.getMessage());
		}
	}

页面实现

用户名、密码和记住我标签加上id,用来填充数据

<div class="form-group">
    <label class="control-label">用户名</label>
    <input class="form-control" type="text" id="username"  name="username" placeholder="用户名" autofocus>
</div>
<div class="form-group">
    <label class="control-label">密码</label>
    <input class="form-control" type="password" id="password" name="password" placeholder="密码">
</div>
<div class="form-group">
    <div class="utility">
        <div class="animated-checkbox">
            <label>
                <input id="remember" name="remember" type="checkbox" value="1"><span class="label-text">记住我</span>
            </label>
        </div>
    </div>
</div>

login.jsp

			// 记住我功能
			var cookies = document.cookie;
			if(cookies.indexOf("username=")!=-1){ // 记住我了
				//console.debug(cookies);
				// 根据;切割
				var arr = cookies.split(";")
				//console.debug(arr);
				//遍历
				for(var i in arr){
					//console.debug(arr[i])
					// 判断是否包含username
					if(arr[i].indexOf("username")!=-1){
						var username = arr[i].substring(arr[i].indexOf("=")+1);
						// 回显
						$("#username").val(username);
						//console.debug(username);
					}
					if(arr[i].indexOf("password")!=-1){ // 获取密码
						var password = arr[i].substring(arr[i].indexOf("=")+1);
						// 回显
						$("#password").val(password);
						// 选中记住我
						$("#remember").prop("checked",true);
					}
				}
			}

取消记住我

后端实现

UserController

	@RequestMapping(value="/login",method=RequestMethod.POST)
	@ResponseBody
	public AjaxResult login(Integer remember,String username,String password,HttpSession session,HttpServletRequest req,HttpServletResponse resp){
		
		try {
			User user = service.login(username,password);
			// 把用户信息放入session中
			session.setAttribute("USER_IN_SESSION", user);
			
			// 判断是否勾选记住我
			if(remember!=null){
				
				// 创建cookie
				Cookie c1 = new Cookie("username", username);
				Cookie c2 = new Cookie("password", password);
				
				// 设置路径
				c1.setPath("/");
				c2.setPath("/");
				
				// 记住我时间     cookie存活时间
				c1.setMaxAge(7*24*60*60);
				c2.setMaxAge(7*24*60*60);
				
				// 添加到浏览器
				resp.addCookie(c1);
				resp.addCookie(c2);
				
			}else{// 取消记住我
				//获取cookies
				Cookie[] cookies = req.getCookies();
				for (Cookie cookie : cookies) {
					if(cookie.getName().equals("username") || cookie.getName().equals("password")){
						// 删除cookie
						cookie.setMaxAge(0);
						// 设置路径
						cookie.setPath("/");
						// 重新添加
						resp.addCookie(cookie);
					}
				}
			}
			return new AjaxResult();
		} catch (Exception e) {
			// 从exception中取错误信息
			return new AjaxResult(false, e.getMessage());
		}
	}

页面实现

login.jsp

			// 记住我功能
			var cookies = document.cookie;
			if(cookies.indexOf("username=")!=-1){ // 记住我了
				//console.debug(cookies);
				// 根据;切割
				var arr = cookies.split(";")
				//console.debug(arr);
				//遍历
				for(var i in arr){
					//console.debug(arr[i])
					// 判断是否包含username
					if(arr[i].indexOf("username")!=-1){
						var username = arr[i].substring(arr[i].indexOf("=")+1);
						// 回显
						$("#username").val(username);
						//console.debug(username);
					}
					if(arr[i].indexOf("password")!=-1){ // 获取密码
						var password = arr[i].substring(arr[i].indexOf("=")+1);
						// 回显
						$("#password").val(password);
						// 选中记住我
						$("#remember").prop("checked",true);
					}
				}
			}else{
				// 取消记住我
				$("#username").val("");
				$("#password").val("");
				$("#remember").prop("checked",false);
			}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/690922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

翻过那座山——Jenkins编译发布web程序(.net framework web application)

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;我们面对的不是…

无法登录github解决方法

140.82.113.4 github.com 199.232.69.194 github.global.ssl.fastly.net 185.199.108.153 assets-cdn.github.com 185.199.109.153 assets-cdn.github.com 185.199.110.153 assets-cdn.github.com 185.199.111.153 assets-cdn.github.com 注意以管理员方式运行notepad才能保存 …

Github上标星40K的Java面试笔记,解决95%以上的Java面试

该文档在Github上收获40Kstar的Java面试神技&#xff08;这赞数&#xff0c;质量多高就不用我多说了吧&#xff09;非常全面&#xff0c;包涵Java基础、Java集合、JavaWeb、Java异常、OOP、IO与NIO、反射、注解、多线程、JVM、MySQL、MongoDB、Spring全家桶、计算机网络、分布式…

集成学习(ensemble learning)应如何入门?

集成学习算法之间的主要区别在于以下3个方面: 提供给个体学习器的训练数据不同; 产生个体学习器的过程不同; 学习结果的组合方式不同&#xff0c;从这三个方面去学。 多样性 数据样本多样性&#xff1a;产生数据多样性的方法主要有3种: 输入样本扰动; 输入属性扰动; 输出表示…

掌握Python的常用模块pandas

Pandas 简介 Pandas 是 Python 的核心数据分析支持库&#xff0c;提供了快速、灵活、明确的数据结构&#xff0c;旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具&#xff0c;其长远目标是成为最强大、最灵活、可以支持…

10 编码转换问题

文章目录 字符编码问题编码转换问题ANSI转UnicodeUnicode转ANSIUtf8转 ANSIutf8 转UnicodeANSI 转UTF-8Unicode 转 UTF-8 全部代码 字符编码问题 Windows API 函数 MessageBoxA:MessageBox 内部实现&#xff0c;字符串编码(ANSI)转换成了Unicode,在调用MessageboxW MessageBox:…

助推RASP2.0 领航ADR新赛道 边界无限打造应用安全防护新范式

2023年以来&#xff0c;数字安全一词多次被提及&#xff0c;成为了我们生活和工作中的一项重要课题。近日&#xff0c;由数世咨询、CIO时代联合主办&#xff0c;新基建创新研究院作为智库支持的“第三届数字安全大会”在北京隆重举办&#xff0c;本届大会以“风险驱动”为主题&…

第26章 uView 内置路由使用注意事项

1 uView 内置路由不支持通过“localhost”域名直接获取数据。 在前后分离开发中“axios” 路由支持使用“localhost”域名或IP地址获取后端的数据&#xff0c;所以不管是IIS部署还是后端调试通过“axios” 路由都能获取数据&#xff0c;对于.NetCore的前后端分离开发来说“axio…

python爬虫之Scrapy框架--保存图片(详解)

目录 Scrapy 使用ImagePipeline 保存图片 使用图片管道 具体步骤 安装相关的依赖库 创建Scrapy项目 配置settings.py 定义Item 编写Spider 运行Spider Scrapy 自定义ImagePipeline 自定义图片管道 Scrapy 使用ImagePipeline 保存图片 Scrapy提供了一个 ImagePipelin…

使用原生AJAX请求数据

一、什么是AJAX AJAX英文全称 Asynchronous Javascript And XML&#xff08;异步的JavaScript和XML&#xff09;&#xff0c;是指一种创建交互式网页应用的网页开发技术&#xff0c;用于浏览器和服务器之间进行数据交互。AJAX在浏览器与Web服务器之间使用异步数据传输&#xf…

【Jetpack】Navigation 导航组件 ③ ( 为 Navigation Graph 页面跳转 action 添加跳转动画 )

文章目录 一、为 Navigation Graph 添加跳转动画1、进入 Navigation Graph 配置的 Design 模式2、选中 action 跳转3、为 action 跳转设置 enterAnim 进入动画4、为 action 跳转设置 exitAnim 退出动画5、通过代码为 action 跳转设置进入 / 退出动画6、执行效果 代码地址 : CS…

DBeaver连接mysql时报错com.mysql.cj.jdbc.Driver的解决方法【修改驱动下载的maven地址和重新下载驱动】

文章目录 说明解决方法1、打开DBeaver点击窗口-->窗口-->首选项-->链接-->点击驱动-->Maven-->添加2、删除已有的驱动3、重新创建mysql链接 说明 网上下载了最新版本的DBeaver软件&#xff0c;但是链接mysql的时候驱动下载失败&#xff0c;所以就报下面错误…

Cisco Secure Client 5.0.03072 (macOS, Linux, Windows iOS, Andrord)

Cisco Secure Client 5.0.03072 (macOS, Linux, Windows & iOS, Andrord) 思科安全客户端&#xff08;包括 AnyConnect&#xff09; 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-secure-client-5/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出…

半小时摸清一个行业:ChatGPT+麦肯锡关键词法

大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。 说实话&#xff0c;在行业分析中「关键词分析法」最早见诸于冯唐&#xff0c;并非是麦肯锡公司的方法论。 冯唐作为麦肯锡前合伙人&#xff0c;讲了快速掌握一个行业的基本方法&#xff0c;一共有三个看似…

ChatGPT最新版多功能批量写作工具揭秘

随着人工智能技术的不断进步&#xff0c;自然语言处理领域也取得了巨大的突破。其中&#xff0c;ChatGPT作为一款强大的多功能批量写作工具&#xff0c;备受关注。它的最新版本将用户体验提升到了一个新的高度。本文将从多个方面详细阐述ChatGPT最新版的功能和优势。 自动摘要功…

进程与线程的区别,特点比较区别与联系

进程与线程的区别、关系 定义关系比较对于系统调度来说&#xff1a;从拥有资源来说&#xff1a;并发性上下文&#xff1a;系统开销使用多线程的主要目的&#xff1a; 定义 进程&#xff1a;进程是程序执行的实例&#xff0c;包括程序计数器和寄存器和变量的当前值 进程依赖于程…

漏洞复现-fastjson1.2.24-RCE

0x00 实验环境 攻击机&#xff1a;Win 10、Win Server2012 R2&#xff08;公网环境&#xff0c;恶意java文件所在服务器&#xff09; 靶机也可作为攻击机&#xff1a;Ubuntu18 &#xff08;公网环境&#xff0c;docker搭建的vulhub靶场&#xff09;&#xff08;兼顾反弹shell…

创造与布局:剖析 Java 对象创建过程以及内存布局

目录 前言创建对象过程对象布局普通对象数组对象如何观察 Object 大小对象头组成部分 对象如何定位对象如何分配总结 前言 上下文提及到了类的加载过程&#xff0c;详细介绍了加载类的每个阶段&#xff1a;Loading、Linking、Initialize&#xff0c;在其中也说明了静态变量赋…

【无标题】asdasd

【4】Ubuntu网络图标消失 sudo service network-manager stop ----->停止网络服务 sudo rm /var/lib/NetworkManager/NetworkManager.state ----->删除配置文件 sudo service network-manager start ----->重启网络服务 sudo vim /etc/NetworkManager/NetworkMana…

Linux RPM包安装、卸载和升级(rpm命令)详解

下面讲解一下&#xff0c;如何使用 rpm 命令对 RPM 二进制包进行安装、卸载和升级操作。我们以安装 apache 程序为例。 RPM包默认安装路径 通常情况下&#xff0c;RPM 包采用系统默认的安装路径&#xff0c;所有安装文件会按照类别分散安装到下表所示的目录中。 RPM 包默认安…