web登录校验

2024-09-08 02:20
文章标签 校验 登录 web

本文主要是介绍web登录校验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基础登录功能

在这里插入图片描述
LoginController

@PostMapping("/login")Result login(@RequestBody Emp emp) {log.info("前端,发送了一个登录请求");Emp e = empService.login(emp);return e!=null?Result.success():Result.error("用户" +"名或密码错误");}

Service

@Overridepublic Emp login(Emp emp) {return empMapper.login(emp);}

DAO

   @Select("SELECT * From emp WHERE username=#{username} and" +"password=#{password}")Emp login(Emp emp);

利用Postman进行校验
在这里插入图片描述
乱输得用户名和密码.

退出后,访问相应地页面的url,直接进入了系统的页面.这时候用户名和密码就变得没有意义.

这时候就需要进行登录校验

登录校验

在这里插入图片描述

会话技术

在这里插入图片描述
令牌技术是当前企业开发中最主流的技术

会话跟踪

在这里插入图片描述

在请求时,后端自动给访问的浏览器生成了一个cookie并通过响应头{set-cookie}返回给浏览器。此后浏览器每次发送请求都会向浏览器自动发送这个cookie(cookie请求头)

Cookie
//设置cookie@GetMapping("/c1")public Result cookie(HttpServletResponse response) {// Cookie参数也是一个键值对response.addCookie(new Cookie("logusername","jzr10086"));return Result.success();}

发送请求 http://localhost:8080/c1
在这里插入图片描述
响应头中set-cookie头被设置为指定的参数

获取Cookie
//获取cookie@GetMapping("/c2")public Result cookie2(HttpServletRequest request) {Cookie[] cookies = request.getCookies();for(Cookie cookie : cookies) {if(cookie.getName().equals("logusername")) {System.out.println(cookie.getName()+cookie.getValue());}}return Result.success();}

在这里插入图片描述

访问c2时携带了对应的cookie,这样就建立了一次会话,当服务器停止运行或者浏览器关闭才会结束会话。
在这里插入图片描述

跨域:

在这里插入图片描述
这时候如果服务器端要设置cookie将无法使用。因为服务器端无法跨域访问到前端。

Session

设置Session
//设置session@GetMapping("/s1")public Result session(HttpSession session) {log.info("Http-session-s1:{}" , session.hashCode());session.setAttribute("logusername","jzr10086");return Result.success();}

访问 localhost:8080/s1
在这里插入图片描述
Set-Cookie是Session对象的id;

cookie储存在本地浏览器上
session储存在服务器上

获取Session
//获取session@GetMapping("/s2")public Result session2(HttpSession session) {log.info("Http-session-s2:{}" , session.hashCode());Object obj = session.getAttribute("logusername");log.info("session2:{}" , obj.toString());return Result.success();}

访问s2:
在这里插入图片描述
两次请求的hashcode相同,说明两次请求共用了一个session
在这里插入图片描述

同一个浏览器发送的请求可能被负载均衡服务器转到不同的后端服务器上,导致后端服务器找不到对应的session对象
在这里插入图片描述
在这里插入图片描述

JWT令牌

在这里插入图片描述
缺点:需要自己实现令牌的生成检验等操作

服务端在浏览器请求之后,生成一个令牌并传送给浏览器。此后每次请求都会有服务端校验令牌的有效性。

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

生成校验JWT

依赖:
在这里插入图片描述

		<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

在这里插入图片描述

@Testvoid testGenJwt() {claims.put("id","1");claims.put("name","test");String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256,"jzr666") //生成JWT令牌使用的算法和密钥.setClaims(claims) //自定义内容(载荷).setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)) //设置有效期.compact(); //按照要求生成对应的数字令牌System.out.println(jwt);}

在这里插入图片描述
运行单元测试类,生成了对应的令牌。
可以通过公钥解密之后看到对应的JWT令牌内容,但是内容不可被更改。对应得JWT令牌不可被伪造。
·
利用对应的密钥进行解码

 @Testvoid praseJwt(){Claims claim = Jwts.parser().setSigningKey("jzr666") //指定签名密钥.parseClaimsJwt("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidGVzdCIsImlkIjoiMSIsImV4cCI6MTcyNTY4Mjk1NH0.O3q9xHqoMJAf1Pm1vdmmUzADXsUsBoQLaKa-Vc3bVsQ") //注意是jws不是jwt.getBody();System.out.println(claim);}

获取到了载荷中存放的内容
在这里插入图片描述
如果篡改令牌中的任意一个字符,在解析的时候都会报错。令牌过期之后,解析也会报错

登陆后下发令牌

在这里插入图片描述
通过Result响应以Json格式返回给前端
在这里插入图片描述
以后前端在每次请求时,都会将令牌携带到服务端(通过请求头的token)。

过滤器Filter

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

快速入门

在这里插入图片描述

实现接口并重写三个方法:
在这里插入图片描述
在启动类中加入ServletComponentScan,因为Filter组件并不属于SpringBoot的内容

package com.yuyu.realproject.Filter;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;import java.io.IOException;//表示拦截所有请求
@WebFilter("/*")
public class DemoFilter implements Filter {@Override//初始化方法,只调用一次public void init(FilterConfig filterConfig) throws ServletException {System.out.println("Init初始化方法执行了");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("doFilter初始化方法执行了");//调用doFilter方法放行,继续访问对应的资源filterChain.doFilter(servletRequest, servletResponse);}@Override //销毁方法,只调用一次public void destroy() {System.out.println("拦截到了请求");}
}

在请求之前的emps查询接口时,首先被doFilter函数拦截,然后执行filterChain的doFilter操作放行,然后开始执行查询操作
在这里插入图片描述
从控制台的日志中可以看到idoFilter函数的执行过程
在这里插入图片描述
记得要再过滤器的Controller类上加上WebFilter注解。

详解
执行流程

1.放行前逻辑
2.放行操作,进行前端请求的操作
3.执行完毕,放行后逻辑
在这里插入图片描述
在这里插入图片描述

拦截路径

在这里插入图片描述

过滤器链

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

DoFilter实际上是将当前的服务放行到下一个过滤器,如果后面没有过滤器了,则访问对应的web资源

类名在软件包中排名越靠前,越早执行。由于Java类在软件包中按照字符串的顺序进行排序,所以只需要重构类名,就能得到所需要的执行顺序。
在这里插入图片描述
小结:
在这里插入图片描述

登录校验(利用过滤器实现)

在这里插入图片描述
1.执行登录请求时并不需要Jwt令牌
2.Jwt令牌存在且有效就允许放行

过程:
在这里插入图片描述
登录检验过滤器的实现

package com.yuyu.realproject.Filter;import com.alibaba.fastjson.JSONObject;
import com.yuyu.realproject.Pojo.Result;
import com.yuyu.realproject.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import java.io.IOException;@Slf4j
@WebFilter("/*")
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;String url = request.getRequestURI().toString();if (url.contains("login")) {log.info("登录请求,直接放行");filterChain.doFilter(request, response);return;}String Jwt = request.getHeader("token");if(StringUtils.hasLength(Jwt)){log.info("请求头中没有相应地令牌");Result error = Result.error("not login in");//手动转换json对象,使用阿里的fastjson工具包String notlogin = JSONObject.toJSONString(error);//直接将登录失败的信息相应给浏览器response.getWriter().write(notlogin);return;}try{JwtUtils.praseJwt(Jwt);}catch (Exception e){e.printStackTrace();log.info("当前令牌无效");Result error = Result.error("not login in");//手动转换json对象,使用阿里的fastjson工具包String notlogin = JSONObject.toJSONString(error);//直接将登录失败的信息相应给浏览器response.getWriter().write(notlogin);return;}//如果登录成功,直接放行filterChain.doFilter(request,response);}
}

e.printStackTrace()是 Java 中的一种异常处理机制中的语句。
以下是关于它的详细解释:
基本含义
在 Java 编程中,当程序运行过程中发生异常(Exception)时,可以通过try - catch语句块来捕获异常。e.printStackTrace()通常放在catch块中,其中e是捕获到的异常对象。它的主要作用是打印异常的堆栈跟踪信息。

前端看到Not_login标识会自动重定向到登录页面。 也就是说这步操作是在前端实现的

拦截器Interceptor

拦截器和Fillter的区别在于是由Spring提供的?
在这里插入图片描述
在这里插入图片描述
1.进行HandlerInterceptor的实现

@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {//按ctrl+o进行生成//目标资源方法运行前运行,返回true放行,返回false不放行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println ("preHandler 运行了");return true;}//目标资源方法运行后运行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println ("postHandler 运行了");}@Override //视图渲染完成后运行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println ("运行完了");}
}

2.进行拦截器的配置,添加拦截器,记得加上configuration注解

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;//添加拦截器的配置@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor (loginInterceptor).addPathPatterns("/**");}
}

在这里插入图片描述
从日志中可以看到,拦截器的preHandler首先执行,return true之后,放行进入登录的Controller,执行结束后执行postController。当所有操作结束之后,这个请求由一个afterCompletion进行终结
在这里插入图片描述

拦截路径的配置:
在这里插入图片描述
不同拦截路径的配置
在这里插入图片描述
在这里插入图片描述

过滤器和拦截器的区别

当过滤器和拦截器同时存在时:

登录校验:
和过滤器的逻辑基本类似。

异常处理

在这里插入图片描述
出现异常的时候,返回的异常并不符合开发文档中定义的错误,所以前端无法对这样的异常进行处理。

如果需要新增的部门已经存在,由于部门表中用部门名称作为主键,sql的insert语句会报错,服务器会返回500错误。但是前端不抓包的话并不会发现这样的错误。

在这里插入图片描述

方案:全局异常处理器

在这里插入图片描述
在这里插入图片描述
加上RestControllerAdvice注解,在捕获异常的方法中要加上ExceptionHandler注解
在这里插入图片描述
这样所有的异常都会返回异常的Json数据。
这个注解包含ResponseBody,会将返回的对象转化为Json格式,所以不需要自己手动转换

@RestControllerAdvice
public class exceptionHandler {@ExceptionHandler(Exception.class)public Result ex(Exception e){e.printStackTrace ();return Result.error ("服务访问失败,请练习管理员");}}

这样就把异常转化成了前端可以处理的Result
在这里插入图片描述

这篇关于web登录校验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

SpringBoot项目Web拦截器使用的多种方式

《SpringBoot项目Web拦截器使用的多种方式》在SpringBoot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制,下面给大家介绍Sprin... 目录一、实现 HandlerInterceptor 接口1、创建HandlerInterceptor实

Python FastAPI实现JWT校验的完整指南

《PythonFastAPI实现JWT校验的完整指南》在现代Web开发中,构建安全的API接口是开发者必须面对的核心挑战之一,本文将深入探讨如何基于FastAPI实现JWT(JSONWebToken... 目录一、JWT认证的核心原理二、项目初始化与环境配置三、安全密码处理机制四、JWT令牌的生成与验证五、

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

Spring Validation中9个数据校验工具使用指南

《SpringValidation中9个数据校验工具使用指南》SpringValidation作为Spring生态系统的重要组成部分,提供了一套强大而灵活的数据校验机制,本文给大家介绍了Spring... 目录1. Bean Validation基础注解常用注解示例在控制器中应用2. 自定义约束验证器定义自

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发