SpringbootWeb登录认证

登录校验

会话技术

  • 会话:用户打开浏览器,访问web服务器的资源,会建立会话,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
  • 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自同一浏览器,以便在同一次会话的多次请求间共享数据。
会话跟踪技术
  • 客户端会话跟踪技术 :cookie

  • 服务器会话跟踪技术:session

  • 令牌技术

    腾讯云HTTP文档
    Cookie: HTTP 请求报头包含存储先前通过与所述服务器发送的 HTTP cookies Set-Cookie头。
    Set-Cookie: HTTP 响应报头被用于从服务器向用户代理发送 cookie。
    在这里插入图片描述
    cookie基本操作

@RestController
@Slf4j
public class SessionController {//设置cookie@GetMapping("/c1")public Result cookie1(HttpServletResponse response){response.addCookie(new Cookie("admin","123456"));return Result.success();}//获取cookie@GetMapping("/c2")public Result cookie2(HttpServletRequest request){Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {if(cookie.getName().equals("admin")){System.out.println(cookie.getName()+"|"+cookie.getValue());}}return Result.success();}
}

在这里插入图片描述

在这里插入图片描述
cookie优缺点

  • 优点 :HTTP协议中支持的技术
  • 缺点 :移动APP无法使用cookie,不安全,用户可以自己禁用cookie,cookie不能跨域

Session
在这里插入图片描述

  @GetMapping("/s1")public Result session1(HttpSession session){session.setAttribute("admin","123456");return Result.success();}@GetMapping("/s2")public Result session2(HttpServletRequest request){HttpSession session = request.getSession();Object admin = session.getAttribute("admin");log.info("value:{}",admin);return Result.success();}

在这里插入图片描述
在这里插入图片描述

  • 优点:存储在服务端,安全。
  • 缺点: 服务器集群环境无法直接使用、 cookie的缺点

令牌
在这里插入图片描述

  • 优点:支持PC端、移动端。解决集群环境下的认证问题,减轻服务器存储压力。
  • 缺点: 需要自己实现。
JWT令牌

在这里插入图片描述

	<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>
Map<String, Object> claims =new HashMap<>();claims.put("id",1);claims.put("name","朱元璋");Jwts.builder().signWith(SignatureAlgorithm.HS256,"admin")//签名算法.setClaims(claims)//自定义内容.setExpiration(new Date(System.currentTimeMillis()+60*60*1000))//设置有效期1h.compact();//解析Map<String, Object> claims = Jwts.parser().setSigningKey("admin").parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5pyx5YWD55KLIiwiaWQiOjEsImV4cCI6MTcwMTY2MzM1Nn0.4dJvYxwjDYf_IP42cXDad967XZO3qV-EzPJbh8-aIzg").getBody();System.out.println(claims);

JWT登录

  @Autowiredprivate EmpService empService;@PostMapping("/login")public Result login(@RequestBody  Emp emp){Emp emp1 = empService.login(emp);//登录成功if(emp1 != null){Map<String, Object> claims = new HashMap<>();claims.put("id",emp1.getId());claims.put("username",emp1.getUsername());String jwt = JwtUtils.generateJwt(claims);return Result.success(jwt);}return Result.error("错误");}

JwtUtils.java


public class JwtUtils {private static String signKey = "admin";private static Long expire = 43200000L;public static String generateJwt(Map<String,Object> claims){String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256,signKey )//签名算法.setClaims(claims)//自定义内容.setExpiration(new Date(System.currentTimeMillis() + expire))//设置有效期1h.compact();return jwt;}public static Claims parseJwt(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}
过滤器 Filter

在这里插入图片描述

Filter快速入门

1.定义Filter类,实现filter接口
2.类上加上@WebFilter注解,配置拦截资源的路径。引导类加@ServletComponentScan开启servlet组件支持
在这里插入图片描述

//放行
filterChain.doFilter(servletRequest,servletResponse);
//放行之后的逻辑

放行之后会回到doFilter中,执行放行之后的逻辑。

过滤器链

在这里插入图片描述

登录校验Filter-流程

在这里插入图片描述

@WebFilter("/*")
@Slf4j
import com.alibaba.fastjson.JSONObject;
import com.example.demo.pojo.Result;
import com.example.demo.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import java.io.IOException;
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;//1.获取请求urlString url = request.getRequestURL().toString();//2.判断请求url是否包含login,如果包含,说明是登录操作,放行if(url.contains("login")){filterChain.doFilter(servletRequest,servletResponse);return;}//3.获取请求头中的令牌 tokenString jwt = request.getHeader("token");//4.判断令牌是否存在,如果不存在,返回错误结果,未登录if(!StringUtils.hasLength(jwt)){Result error = Result.error("NOT_LOGIN");//对象--JSONString notLogin = JSONObject.toJSONString(error);response.getWriter().write(notLogin);log.info("令牌不存在");return;}//5.解析token 解析失败返回try { //快捷键ctrl+alt+tJwtUtils.parseJwt(jwt);} catch (Exception e) {e.printStackTrace();Result error = Result.error("NOT_LOGIN");//对象--JSONString notLogin = JSONObject.toJSONString(error);response.getWriter().write(notLogin);log.info("token解析失败");return;}//6.放行log.info("放行");filterChain.doFilter(servletRequest,servletResponse);}
}
拦截器 Interceptor

在这里插入图片描述

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override //目标资源方法运行前返回true:放行public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}@Override //目标资源方法运行后运行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Override//视图渲染完毕后运行,最后运行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
import com.example.demo.filter.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");}
}

拦截路径
在这里插入图片描述
在这里插入图片描述

拦截器-执行流程

在这里插入图片描述

登录校验Interceptor登录拦截
@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {@Override //目标资源方法运行前返回true:放行public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.获取请求urlString url = request.getRequestURL().toString();//2.判断请求url是否包含login,如果包含,说明是登录操作,放行if(url.contains("login")){return true;}//3.获取请求头中的令牌 tokenString jwt = request.getHeader("token");//4.判断令牌是否存在,如果不存在,返回错误结果,未登录if(!StringUtils.hasLength(jwt)){Result error = Result.error("NOT_LOGIN");//对象--JSONString notLogin = JSONObject.toJSONString(error);response.getWriter().write(notLogin);log.info("令牌不存在");return false;}//5.解析token 解析失败返回try { //快捷键ctrl+alt+tJwtUtils.parseJwt(jwt);} catch (Exception e) {e.printStackTrace();Result error = Result.error("NOT_LOGIN");//对象--JSONString notLogin = JSONObject.toJSONString(error);response.getWriter().write(notLogin);log.info("token解析失败");return false;}//6.放行log.info("放行");return true;}@Override //目标资源方法运行后运行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Override//视图渲染完毕后运行,最后运行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
异常处理

全局异常处理器
在这里插入图片描述

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public Result ex(Exception ex) {ex.printStackTrace();return Result.error("对不起,操作失败,请联系管理员");}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis quicklist源码+listpack源码(6.0+以上版本)

ziplist设计上的问题&#xff0c;每一次增删改都需要计算前面元素的空间和长度&#xff08;prevlen&#xff09;&#xff0c;这种设计缺陷非常明显&#xff0c;一旦其中一个entry发生修改&#xff0c;以这个entry后面开始&#xff0c;全部需要重新计算prevlen&#xff0c;因此诞…

SQL Sever 基础知识 - 数据筛选(2)

SQL Sever 基础知识 - 四、数据筛选 第3节 NULL3.1 NULL 和三值逻辑3.2 IS NULL / IS NOT NULL 第4节 AND4.1 AND 运算符简介4.2 AND 运算符示例4.2.1 一个 AND 运算符4.2.2 多个 AND 运算符4.2.3 将 AND 运算符与其他逻辑运算符一起使用 第5节 OR5.1 OR 运算符简介5.2 OR 运算…

web前端之css变量的妙用、通过JavaScrip改变css文件中的属性值、querySelector、setProperty

MENU 效果图htmlJavaScripstylequerySelectorsetProperty 效果图 html <div id"idBox" class"p_r w_680 h_160 b_1s_red"><div id"idItem" class"p_a l_0 t_30 w_100 h_100 bc_rgba_255_00_05 radius_50_"></div> …

stm32L071KB单片机字节对齐问题

字节对齐问题由来很关键 字节对齐问题由来 字节对齐问题由来 在移植同事代码的时候发现到一个赋值变量的地方就会出现死机&#xff0c;进入hardfault,怎么也找不不到原因&#xff0c;最后没办法去了github https://github.com/armink/CmBacktrace/blob/master/README_ZH.md Cm…

WPS论文写作——公式和公式序号格式化

首先新建一个表格&#xff0c;表格尺寸按你的需求来确定&#xff0c;直接 插入--》表格 即可。 然后在表格对应位置填上公式&#xff08;公式要用公式编辑器&#xff09;和公式序号&#xff0c;然后可以按照单独的单元格或者整行或整列等来设置样式&#xff0c;比如居中对齐、…

TCL - 库编译过程和官方手册

文章目录 TCL - 库编译过程和官方手册概述笔记编译步骤TCL官方手册END TCL - 库编译过程和官方手册 概述 想看看sqlite3的官方demo工程, 没看到. 想编译一下sqlite3源码, 看看编译后有没有example 工程. 看了sqlite3的官方说明, 他们工程使用tcl来编译的. 一听tcl, 咋这么耳熟…

windows 11 家庭版怎样安装docker

这里写自定义目录标题 一、安装wsl1、开启硬件虚拟化2、安装wsl3.升级WSL到WSL24、下载安装linux分支5、测试运行6、出现如下问题7、迁移到非系统盘8、文件资源管理器9、配置网络10、更新和升级 一、安装wsl 1、开启硬件虚拟化 检查是否开启Hyper-V, 适用于Linux的Windows子系…

883重要知识点

&#xff08;1&#xff09;程序结构分三种&#xff1a;顺序结构&#xff0c;选择结构&#xff0c;循环结构。 &#xff08;2&#xff09;该程序都要从main&#xff08;&#xff09;开始&#xff0c;然后从最上面往下。 &#xff08;3&#xff09;计算机的数据在电脑中保存以二…

IDEA构建springBoot新项目时JDK只有17和21,无法选择JDK8解决方案

今天创建springboot新项目时&#xff0c;发现IDEA里JDK选项只有17和21&#xff0c;无法选择本机的JDK8&#xff0c;网上查资料后发现是springboot2.7于11.24号后停止维护&#xff0c;基于2.7和java8的spring Initializ官方不再维护&#xff0c;解决方案是在server URL栏&#x…

Elasticsearch:为现代搜索工作流程和生成式人工智能应用程序铺平道路

作者&#xff1a;Matt Riley Elastic 的创新投资支持开放的生态系统和更简单的开发者体验。 在本博客中&#xff0c;我们希望分享 Elastic 为简化你构建 AI 应用程序的体验而进行的投资。 我们知道&#xff0c;开发人员必须在当今快速发展的人工智能环境中保持灵活性。 然而&a…

【c】序列中整数去重

数组中的元素不好直接删除&#xff0c;我们可以把重复的数做标记&#xff0c;将他赋值为0&#xff0c;然后正常打印数组&#xff0c;为0的跳过 #include<stdio.h> int main() {int n;scanf("%d",&n);int arr[n1];for(int i1;i<n;i){scanf("%d&quo…

【DBeaver】驱动添加-Hive和星环

驱动 Hive驱动 hive驱动可以直接去官网下载官网地址&#xff0c;填一下个人信息。 如果想直接下载可以去我上次的资源下地址&#xff0c;需要用zip解压。 星环驱动 星环驱动是我第一次接触&#xff0c;是国产的基于开源Hive驱动自研的产品&#xff0c;我看到官网上有很多类…