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

目录

      • 注销功能实现
        • 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);
			}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux上安装matlab

首先需要下载文件&#xff0c;微人大正版软件下载里有 然后直接点击&#xff0c;就可以就可以安装&#xff0c;不需要使用挂载命令&#xff0c;然后使用 ./install就可以进行安装了&#xff0c;这里记住是得登录自己的人大邮箱&#xff0c;否则无法激活&#xff0c;然后修改安…

LeetCode·每日一题·2490. 回环句·模拟

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/circular-sentence/solutions/2325227/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-x65e/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系作者获得授权&#xff0…

MySQL 主从复制与读写分离

概念 主从复制与读写分离的意义 企业中的业务通常数据量都比较大&#xff0c;而单台数据库在数据存储、安全性和高并发方面都无法满足实际的需求&#xff0c;所以需要配置多台主从数据服务器&#xff0c;以实现主从复制&#xff0c;增加数据可靠性&#xff0c;读写分离&#x…

不是吧,交换机坏了你还只会这么排查?

又见面了&#xff0c;我的网工朋友 上次给你分享了交换机和路由器的对接上网配置案例&#xff0c;还记得吗&#xff1f; 今天这篇&#xff0c;和你聊聊交换机接口故障。 接口故障这件事&#xff0c;对咱们网工来说其实算是家常便饭了。 工作到现在&#xff0c;你复盘一下&a…

实战:求年月日时间前后遇到的坑和解决方式

这里写目录标题 前言正确实例&#xff1a;错误实例&#xff1a; 需求 前言 这周接到一个时间转换任务需要处理&#xff0c;本来没什么问题&#xff0c;后来完成后发现时间有偏差&#xff0c;又重写了一遍代码&#xff0c;感觉很有记录必要性&#xff0c;希望看过的小伙伴可以避…

计算机网络——数据链路层

序言 问&#xff1a;数据链路层在现在的社会起到什么作用&#xff1f; 答&#xff1a;数据链路层在现在的社会起到关键性作用&#xff0c;比如&#xff1a;数据传输和通信&#xff1b;网络连接和互联互通&#xff1b;错误检测和纠正&#xff1b;媒体访问控制&#xff1b;网络性…

启动一个qemu虚拟机

安装qemu&#xff1a; 编译内核&#xff1a; 编译rootfs&#xff1b; 启动&#xff1a; qemu-system-x86_64 -kernel ./linux-4.14.320/arch/x86_64/boot/bzImage -hda ./busybox-1.36.1/rootfs.img -append "root/dev/sda consolettyS0" -nographic 效果图&am…

【Tensorflow object detection API + 微软NNI】图像分类问题完成自动调参,进一步提升模型准确率!

1. 背景&目标 利用Tensorflow object detection API开发并训练图像分类模型&#xff08;例如&#xff0c;Mobilenetv2等&#xff09;&#xff0c;自己直接手动调参&#xff0c;对于模型的准确率提不到极致&#xff0c;利用微软NNI自动调参工具进行调参&#xff0c;进一步提…

Cisco Catalyst 8000 Series Edge Platforms, IOS XE Release Dublin-17.11.01a ED

Cisco Catalyst 8000 Series Edge Platforms, IOS XE Release Dublin-17.11.01a ED Cisco Catalyst 8000 边缘平台系列 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-catalyst-8000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&…

国企一面会问什么?

前言&#xff1a; \textcolor{Green}{前言&#xff1a;} 前言&#xff1a; &#x1f49e;快秋招了&#xff0c;那么这个专栏就专门来记录一下&#xff0c;同时呢整理一下常见面试题 &#x1f49e;部分题目来自自己的面试题&#xff0c;部分题目来自网络整理 国企注重的和私企会…

AI实战营第二期 第七节 《语义分割与MMSegmentation》——笔记8

文章目录 摘要主要特性 案例什么是语义分割应用&#xff1a;无人驾驶汽车应用&#xff1a;人像分割应用&#xff1a;智能遥感应用 : 医疗影像分析 三种分割的区别语义分割的基本思路按颜色分割逐像素份分类全卷积网络 Fully Convolutional Network 2015存在问题 基于多层级特征…

多元回归预测 | Matlab基于灰狼算法(GWO)优化混合核极限学习机HKELM回归预测, GWO-HKELM数据回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于灰狼算法(GWO)优化混合核极限学习机HKELM回归预测, GWO-HKELM数据回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 …

[游戏开发][Unity]出包真机运行花屏(已解决)

花屏真机截屏 原因 原因是启动项目时的第一个场景没有相机是 Skybox或者SolidColor模式&#xff0c;我的启动场景只有一个UI相机&#xff0c;且Clear Flags是DepthOnly 解释&#xff1a; https://blog.csdn.net/yanchezuo/article/details/79002318

三、1如何运用设计原则之SOLID原则写出高质量代码?

你好我是程序员雪球。接下来我们学习一些经典的设计原则。其中包括SOLID&#xff0c;KISS&#xff0c;YAGNI&#xff0c;DRY&#xff0c;LOD等。其实这些设计原则从字面意思理解并不难。但是“看懂”和“会用”是两回事&#xff0c;而“用好”就难上加难了。 先来了解SOLID原则…

(css)el-image图片完整显示,不拉伸收缩

(css)el-image图片完整显示&#xff0c;不拉伸收缩 <el-imagefit"contain" //重要设置src"../../../../1.png"altclass"chenguo_img_img" />

自动驾驶货车编队行驶-车辆通讯应用层数据交互要求

1 范围 本文件规定了合作式自动驾驶货车编队行驶时车辆通信应用层数据交互的通信系统架构、通用要求、 数据交互要求、消息层数据集定义等。本文件仅涉及编队成员内部进行编队控制及成员管理相关的车-车通 信交互&#xff0c;不涉及编队与其他实体&#xff08;云平台、路侧单元…

spring cloud 之 gateway

网关介绍 在微服务架构体系中&#xff0c;一个系统会被拆分为很多个微服务&#xff0c;那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别调用&#xff0c;当然这样是不现实的…

高性能消息中间件 RabbitMQ

一、RabbitMQ概念 1.1 MQ是什么 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复&#xff1a; 异步通信相…

基于Arduino UNO的循迹小车

目录 1.analogWrite函数的使用 2.红外循迹模块介绍 3.循迹小车代码实现 4.实物示例 1.analogWrite函数的使用 用analogWrite来替换digitalWrite 说明 将一个模拟数值写进Arduino引脚。这个操作可以用来控制LED的亮度, 或者控制电机的转速. 在Arduino UNO控制器中&#…

查询Oracle当前用户下,所有数据表的总条数

需求&#xff1a;查询Oracle当前用户下&#xff0c;所有数据表的总条数 方法&#xff1a;存储过程 右键点击Procedures&#xff0c;点击New 点击OK 把存储过程写进去&#xff0c;然后点击编译运行&#xff1a; create or replace procedure tables_count ist_count numbe…