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

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

Java Web指的是什么

Java Web指的是使用Java技术进行Web开发的一种方式。Java在Web开发领域有着广泛的应用,主要通过Java EE(Enterprise Edition)平台来实现。  主要特点和技术包括: 1. Servlets和JSP:     Servlets 是Java编写的服务器端程序,用于处理客户端请求和生成动态网页内容。     JSP(JavaServer Pages)

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

JavaWeb【day09】--(Mybatis)

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

构建高性能WEB之HTTP首部优化

0x00 前言 在讨论浏览器优化之前,首先我们先分析下从客户端发起一个HTTP请求到用户接收到响应之间,都发生了什么?知己知彼,才能百战不殆。这也是作为一个WEB开发者,为什么一定要深入学习TCP/IP等网络知识。 0x01 到底发生什么了? 当用户发起一个HTTP请求时,首先客户端将与服务端之间建立TCP连接,成功建立连接后,服务端将对请求进行处理,并对客户端做出响应,响应内容一般包括响应