SpringBoot29 登录逻辑、登录状态判断
1 知识点扫盲
浏览器和服务器之间时通过session来确定连接状态的,浏览器第一次请求时服务端会自动生成一个session,并将这个sessionId传回给浏览器,浏览器将这个sessionId存放在cookie中,下一次浏览器访问服务器时就会将这个sessionId以cookie的形式传递到服务器,服务器接送到这个sessionId后就可以判断发送这个请求的浏览器之前是否访问过。
在进行登录认证逻辑时,通常会在登录认证成功后将用户信息保存到session中;整个系统会对出登录和登出操作之外的请求进行拦截,在拦截器中会判断session中是否有用户的数据,如果有就跳转到controller层执行对应的请求,如果没有就直接返回一个提示信息。(PS: 每个客户端第一次访问服务器时服务端都会自动创建一个session)
2 基于SpringBoot的登录状态判断
2.1 整体流程图

2.2 代码实现
2.2.1 创建一个SpringBoot
利用IDEA创建一个SpringBoot项目,只引入web模块
2.2.2 创建一个拦截器
拦截出登录请求以外的所有请求,通过判断session是否有用户信息来判断登录状态

package com.xunyji.springboot_login_session.interceptor; import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; /**
* @author 王杨帅
* @create 2018-09-11 21:31
* @desc 登录状态拦截器
**/
@Slf4j
public class LoginInterceptor implements HandlerInterceptor { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info("==========登录状态拦截"); HttpSession session = request.getSession();
log.info("sessionId为:" + session.getId()); // 获取用户信息,如果没有用户信息直接返回提示信息
Object userInfo = session.getAttribute("userInfo");
if (userInfo == null) {
log.info("没有登录");
response.getWriter().write("Please Login In");
return false;
} else {
log.info("已经登录过啦,用户信息为:" + session.getAttribute("userInfo"));
} return true;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { }
}
LoginInterceptor.java
2.2.3 添加拦截器

package com.xunyji.springboot_login_session.config; import com.xunyji.springboot_login_session.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /**
* @author 王杨帅
* @create 2018-09-11 21:35
* @desc
**/
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/test/login");
}
}
LoginConfig.java
2,2.4 测试控制层
package com.xunyji.springboot_login_session.controller; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; /**
* @author 王杨帅
* @create 2018-09-11 21:17
* @desc
**/
@RestController
@RequestMapping(value = "/test")
@Slf4j
public class TestController { @GetMapping(value = "/test01")
public String test01() {
String info = "测试01";
log.info(info);
return info;
} @GetMapping(value = "/test02")
public String test02() {
String info = "test02";
log.info(info);
return info;
} /**
* 登录逻辑
* @param name 用户名
* @param pwd 用户密码
* @param request
* @return
*/
@GetMapping(value = "/login")
public String login(
@RequestParam(value = "name") String name,
@RequestParam(value = "pwd") String pwd,
HttpServletRequest request
) {
String info = "登录逻辑";
log.info(info); // 登录认证,认证成功后将用户信息放到session中
if (name.equals("fury") && pwd.equals("111111")) {
request.getSession().setAttribute("userInfo", name + " - " + pwd);
info = "登录成功";
} else {
info = "登录失败";
} log.info(info);
return info;
} /**
* 登出操作
* @param request
* @return
*/
@GetMapping(value = "/loginout")
public String loginout(HttpServletRequest request) {
String info = "登出操作";
log.info(info);
HttpSession session = request.getSession(); // 将用户信息从session中删除
session.removeAttribute("userInfo"); Object userInfo = session.getAttribute("userInfo");
if (userInfo == null) {
info = "登出成功";
} else {
info = "登出失败";
}
log.info(info); return info; } }
TestController.java
3 代码汇总

SpringBoot29 登录逻辑、登录状态判断的更多相关文章
- MVC下判断用户登录和授权状态方法
MVC下判断用户登录和授权状态方法 在我们日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题.登录功能(Authentication),针对于所有用户都开放:而授权(Authorization ...
- C# MVC 用户登录状态判断 【C#】list 去重(转载) js 日期格式转换(转载) C#日期转换(转载) Nullable<System.DateTime>日期格式转换 (转载) Asp.Net MVC中Action跳转(转载)
C# MVC 用户登录状态判断 来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类Authenticati ...
- vue用户登录状态判断
之前项目中用来判断是否登录我写了多种方案,但是最终只有一个方案是比较好的,这篇博客就是分享该方案; 先说基本要求: 项目中的登录状态是依据服务器里的状态来作为判断依据; 每一个需要登录后才能操作的接口 ...
- 判断密码是否可见/判断登录的状态/判断在form表单中 定义rules规则验证(iview)
一: 判断密码是否可见判断:type="visiblePassword ? 'text' : 'password'" 是否为false 或者 true 密码为输入框或者文本框点击眼 ...
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑
(1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...
- vue3+element-plus+登录逻辑token+环境搭建
vue3+element-plus+登录逻辑token环境搭建 安装脚手架工具 1 npm i @vue/cli@4.5.13 -g 验证是否安装成功 1 vue -V # 输出 @vue/cli 4 ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第七节--登录逻辑及abp封装的Javascript函数库
经过前几节,我们已经解决数据库,模型,DTO,控制器和注入等问题.那么再来看一下登录逻辑.这里算是前面几节的一个初次试水. 首先我们数据库已经有的相应的数据. 模型和DTO已经建好,所以我们直接在服务 ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第七节--登录逻辑及几种abp封装的Javascript函数库
返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 简介 经过前几节,我们已经解决数据库,模型,DTO,控制器和注入等问题.那么再来看一下登录逻辑.这 ...
- ngx_lua实现登录逻辑
最近在公司做一个简单的portal,本来很简单的,只用ngx_lua就可以实现所有的业务逻辑,不需要upstream上游服务.但被要求接入公司内部的用户校验系统,说白了就是一个登录过程,只允许公司内部 ...
随机推荐
- Android JNI访问Java成员
在 JNI 调用中,不仅仅 Java 可以调用本地方法,本地方法也可以调用 Java 中的方法和成员变量. Java 中的类封装了属性和方法,想要访问 Java 中的属性和方法,首先要获得 Java ...
- C语言(C99标准)在结构体的初始化上与C++的区别
C++中由于有构造函数的概念,所以很多时候初始化工作能够很方便地进行,而且由于C++标准库中有很多实用类(往往是类模板),现代C++能十分容易地编写. 比如现在要构造一个类Object,包含两个字段, ...
- 用命令行cmd 编译小程序
操作命令: C:\Users\Administrator>"C:\Program Files (x86)\MSBuild\12.0\Bin\csc.exe" /out:D: ...
- Zookeeper--集群管理
Zookeeper--集群管理 在多台服务器组成的集群中,需要监控每台服务器的状态,一旦某台服务器挂掉了或有新的机器加入集群,集群都要感知到,从而采取相应的措施.一个主动的集群可以自动感知节点的死亡和 ...
- easyui-datebox设置只能选择年月,设置当前月的第一天和最后一天
来源:https://www.cnblogs.com/xiaoxiao0314/p/7041731.html 1. 设置只能控件只能显示年月:search_date_monthreport为控件id, ...
- 第七周作业——简单FTP
开发简单的FTP: 1. 用户登陆 2. 上传/下载文件 3. 不同用户家目录不同 4. 查看当前目录下文件 5. 充分使用面向对象知识 1.目录结构zuoye-ftp├── chenliang #用 ...
- sqlldr并发
sage: SQLLDR keyword=value [,keyword=value,...] 部分关键字: userid -- ORACLE username/password c ...
- 短URL链接系统
定义: 短网址(Short URL),顾名思义就是在形式上比较短的网址.但不知道有多少人像我一样,由于面试问道才知道有这种系统而对短连接原理好奇,从而进行进一步的研究.在Web 2.0的今天,不得不说 ...
- How To Move a MySQL Data Directory to a New Location on Ubuntu 16.04
16 How To Move a MySQL Data Directory to a New Location on Ubuntu 16.04 PostedJuly 21, 2016 62.1kvie ...
- C# 设计模式-工厂模式(Factory)
1.工厂模式 factory从若干个可能类创建对象. 例如:如果创建一个通信类接口,并有多种实现方式,可以使用factory创建一个实现该接口的对象,factory可以根据我们的选择,来创建适合的对象 ...