JavaWeb学习路线(8)——登录

news2025/2/22 0:08:53

一、基本登录功能

(一)需求: 根据账号与密码判别用户是否可以登录

(二)实现步骤

  • Controller接收传递的JSON格式数据,使用@RequestBody+实体类进行接收,调用Service具体处理。
  • Service创建登录接口,实现类调用Mapper根据条件查询是否存在具体用户,存在则返回具体用户,反之返回null。
  • Mapper创建条件查询接口,利用条件查询SQL查询用户。

(三)代码实现
UserController.java

@RestController //@Controller+@ResponseBody
public class LoginCtroller{
	@PostMapping("/login")
    public int login(@RequestBody User user){
        User u = userService.login(user);
        return u !=null?200:-1;
    }
}

UserService.java

public interface UserService {
    User login(User user);
}

UserServiceImpl.java

@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Override
    public User login(User user) {
        return userMapper.getUserByUsernameAndPassword(user);
    }
}

UserMapper.java

@Mapper
public interface UserMapper {
    @Select("select * from user where username = #{username} and password = #{password}")
    User getUserByUsernameAndPassword(User user);
}

(四)现有登录的缺陷

  • 无法限制用户直接访问内容页。

二、登录校验

(一)概念: 每一次请求都要进行用户登录授权。

(二)登录校验相关技术
在这里插入图片描述

1、登录标记: 一般采用会话技术,在用户登录成功后,每一次请求中都会获取该标记。

2、统一拦截: 两种方式

  • 过滤器 Filter
  • 拦截器 Interceptor

(三)会话技术

1、概念

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

2、客户端会话跟踪 Cookie

(1)Cookie使用过程:

  • 用户登录成功后,服务器创建Cookie并自动发送给浏览器
  • 浏览器接收Cookie并自动存储在浏览器本地
  • 用户使用浏览器向服务器发送请求,浏览器自动将Cookie请求头(Set-Cookie: name=value)发送到服务器的同一拦截层进行校验,校验通过后处理请求。

模拟Cookie在服务器端的操作

@Slf4j
@RestController
public class SessionController {
    @GetMapping("/c1")
    public int cookie1(HttpServletResponse response){
        response.addCookie(new Cookie("login_username","zengoo"));
        return 200;
    }

    @GetMapping("/c2")
    public int cookie(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("login_username")) System.out.println("用户登录的账号为 " + cookie.getValue());
        }
        return 200;
    }
}

执行C1方法请求到服务器效果图
在这里插入图片描述

执行C2方法,获取指定的Cookie内容效果图

在这里插入图片描述

(2)Cookie的优缺点

  • 优点
    • HTTP协议支持的技术
  • 缺点
    • 移动端无法使用Cookie
    • 不安全,用户可以禁用Cookie
    • Cookie不支持跨域

3、服务器会话跟踪技术 Session

(1)Session的使用过程

  • 用户登录成功后常见Session会话,通过Cookie记录SessionID并发送给浏览器
  • 浏览器接收Cookie并存储到本地
  • 当发生请求服务器时,SessionID发送到服务器,服务器查找对应Session进行连接。

(2)模拟Session

@Slf4j
@RestController
public class SessionController {
    @GetMapping("/s1")
    public int session1(HttpSession session){
        log.info("HttpSession-s1:{}",session.hashCode());
        session.setAttribute("login_account","tom1101");
        return 200;
    }

    @GetMapping("/s2")
    public int session2(HttpSession session){
        log.info("HttpSession-s2:{}",session.hashCode());
        Object user = session.getAttribute("login_account");
        log.info("user:{}",user);
        return 200;
    }
}

设置session效果图

在这里插入图片描述
服务端获取Session会话效果图

在这里插入图片描述
(3)Session的优缺点

  • 优点
    • 存储在服务器端,安全性高
  • 缺点
    • 服务器集群环境下无法使用Session(原因是产生Session的服务器与服务分配的服务器可能不是同一台)
    • Cookie的缺点(Session的底层是Cookie)

4、令牌技术

(1)令牌技术的使用过程

  • 用户登录成功后获取从服务器端获取以个令牌(例如token,accessKey…),服务器返回给浏览器
  • 浏览器接收令牌并存储在本地(使用Cookie或Session都可以)
  • 当发生请求服务器时,浏览器发送令牌给服务器,服务器进行校验后处理请求

(2)令牌技术的优缺点

  • 优点
    • 支持PC、移动
    • 解决集群环境下的认证问题
    • 减轻服务器存储压力
  • 缺点
    • 需要手动实现(生成、存储等过程)

(3)JWT令牌技术

  • 简介
    • 全称: JSON Web Token(官网:https://jwt.io/)
    • 作用: 定义了一种简洁的(JWT是字符串)、自包含(可以插入自定义的数据)的格式,用于在通信双方以JSON数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。
    • 结构:
      • 第一部分:Header(头),记录令牌类型,签名算法等。例如 {“alg”:“HS256”,“type”:“JWT”}
      • 第二部分:Payload(有效载荷),自定义的内容、默认信息等。例如 {“id”:“1”,“username”:“Tom”}
      • 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定密钥,通过指定签名算法计算而来。
    • JWT使用
      • 引入JWT依赖。io.jsonwebtoken.jjwt - 0.9.1
    • 使用JWT的注意事项
      • JWT校验时必须使用对应的签名密钥
      • JWT令牌失效的原因:
        • 令牌被篡改
        • 令牌到期

生产JWT

public class DataTest {
    @Test
    public void getJWT(){
        //载荷内容
        Map<String,Object> claims = new HashMap<>();
        claims.put("id",1);
        claims.put("username","tom");

        String jwt = Jwts.builder()
                .signWith(SignatureAlgorithm.HS256,"zengoo")//签名算法Base64+签名密钥"zengoo"
                .setClaims(claims) //载荷
                .setExpiration(new Date(System.currentTimeMillis()+ (12*3600*1000))) //有效期
                .compact();
                
        System.out.println(jwt);
    }
}

/*打印结果*/
eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjg4MDYzMzUwLCJ1c2VybmFtZSI6InRvbSJ9.occWRYeyio23As2Xd0RilmZtASE3wF0bYc_6F3OFE-M

解析令牌

    @Test
    public void parseJWT(){
        Claims claim = Jwts.parser()
                .setSigningKey("zengoo") //签名密钥
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjg4MDYzMzUwLCJ1c2VybmFtZSI6InRvbSJ9.occWRYeyio23As2Xd0RilmZtASE3wF0bYc_6F3OFE-M") //JWT内容
                .getBody();
        System.out.println(claim);
    }
/*打印输入*/
{id=1, exp=1688063350, username=tom}

(四)Filter 过滤器

1、简介

  • 概念: Filter 过滤器,是JavaWeb 三大组件(Servlet、Filter、Listener)之一。
  • 作用: 过滤器可以把资源的请求拦截下来,完成通用操作,例如:登录校验、统一编码处理、敏感词字符处理等。

2、使用

(1)定义Filter: 定义一个类,实现Filter接口,并重写方法。

@WebFilter(urlPatterns = "/*") //拦截所有请求
public class LoginFilter implements Filter {
    //初始化方法,web服务器启动,创建Filter时调用,仅调用一次
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }
    //对请求方法进行拦截处理,可多次调用
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //处理代码
        System.out.println("拦截方法执行");
        //放开请求
        filterChain.doFilter(servletRequest,servletResponse);
    }

    //销毁方法,服务器关闭时调用,仅调用一次
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

(2)配置Filter: Filter类加上 @WebFilter注解,配置拦截资源的路径,启动类上加 @ServletComponentScan注解,开启Servlet组件支持。

@ServletComponentScan //开启Servlet组件扫描
@SpringBootApplication
public class SpringbootMybatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatisApplication.class, args);
    }
}

3、过滤器的细节问题

(1)执行流程

  • web服务器启动,过滤器启动初始化方法init
  • 浏览器发送任意一个请求给web服务器,过滤器拦截该请求
  • 过滤器启动doFilter方法判别请求或处理请求内容,确认无误后提交给FilterChain类的doFilter()方法放开请求访问资源。
  • 若还有需要处理的逻辑,则可在放开请求后编写执行。

(2)拦截路径

  • 常见拦截路径
路径方式举例说明
具体路径/login访问 /login 时拦截
目录拦截/userAPI/*访问 /userAPI 下的资源时拦截
拦截所有/*访问所有资源都会被拦截

(3)过滤器链

  • 概念: 一个web应用中,可配置多个过滤器,多个过滤器形成的过滤通道形成了一个过滤链。
  • 作用: 按照类名顺序通过过滤器链,服务器端可以通过多个过滤器进行多次额外加工。

(五)Interceptor 拦截器

1、简介

  • 概念: Spring框架中提供的一种动态拦截方法调用的机制,类似于过滤器,所以拦截器的作用范围是整个Spring框架,其它的资源不进行拦截。
  • 作用: 拦截请求,在指定的方法调用前后,根据业务需求执行预先设定的代码。

2、使用拦截器
(1)定义拦截器: 实现HandlerInterceptor 接口,并重写所有方法

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override   //Controller之前执行,true——放开拦截;false——不放开
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("前期处理");
        return true;
    }

    @Override   //Controller之后执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("请求被拦截");
    }

    @Override   //视图渲染完毕后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("后期处理");
    }
}

(2)注册拦截器

@Configuration
public class LoginConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	//注册拦截器并配置拦截路径与非拦截路径
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/loign");
    }
}

3、拦截器的细节问题

(1)执行流程

  • web服务器启动,先启动Filter类init()方法。
  • 浏览器发送请求,服务器接收请求后过滤器Filter先进行拦截,通过前端控制器DispatcherServlet转发给拦截器Interceptor,在请求进入控制器Controller前对数据进行处理,判断可放开后,请求进入资源访问。
  • 请求访问资源完毕后,返回拦截器进行加工,再转发给前端控制器,再转发给过滤器,最终返回到浏览器。

在这里插入图片描述

(2)拦截路径

  • 常见拦截路径
路径方式举例说明
一级路径/*拦截/login,/list,不能拦截 /depts/1
任意拦截/**全路径拦截
某一路径下的一级路径/depts/*能拦截 /depts/1,不能拦截 /depts/1/2 ,/depts
某一路径下的所有路径/depts/**能拦截 /depts下的所有路径

(六)过滤器与拦截器的区别

  • 接口规范: 过滤器 —— Filter;拦截器 —— HandlerInterceptor
  • 拦截范围: 过滤器—— 拦截所有资源 ; 拦截器 —— 拦截Spring环境下的资源

三、异常处理

两种解决方案

  • 方案一: 在Controller的所有方法中进行try…catch处理
  • 方案二: 定义全局异常处理器

(一)异常处理器的使用

1、定义异常处理器

@RestControllerAdvice   //声明控制器异常处理,相当于@ControllerAdvice + @ResponseBody
public class GlobalExceptionHandler {
    //统一进行异常处理,并向浏览器返回异常结果
    @ExceptionHandler(Exception.class)	//定义捕获的异常类型 Exception是所有异常的父类
    public int ex(Exception ex){
        ex.printStackTrace();
        return 500;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

循环购应运而生,让老百姓敢于消费、有钱消费、愿意消费

​小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 无论…

7 植物背景分离、RGB、HSV特征提取案例(matlab程序)

学习目标&#xff1a;背景分离和RGB等特征提取 1.简述 叶片RGB图像背景精确分离的方法,包括以下图像背景分离方法:S1:选取叶片,所得到的原始图像;S2:采用MATLAB 2016R软件将RGB图像转化为HSV图像,以饱和度0.190.21为界限,将小于界限的图像明度调整为0,并转化为灰度图;S3:用edg…

Redis高并发分布式锁

文章目录 高并发场景秒杀抢购超卖Bug高并发场景秒杀抢购Demo测试结果 JVM级别锁使用nginx对本地服务进行负载均衡 Redis实现分布式锁Redis分布式锁实现DemoRedis分布式锁有关问题 分布式锁性能的提升减少锁的粒度使用异步处理 高并发场景秒杀抢购超卖Bug 在今天的数字化世界中&…

供应商索赔(金税数据)导入并创建凭证(ALV长篇备忘三)

情境/背景:供应商三包索赔款项源起QMS质量系统&#xff0c;联动金税系统完成发票开具&#xff0c;最终在SAP系统中创建完成财务凭证。该流程为手工操作&#xff0c;费时费力且效率低下容易出错。 目标/任务:把QMS供应商三包索赔业务搬上线,同SAP FI顾问梳理功能说明书&#xf…

2023-06-29:redis中什么是热点Key?该如何解决?

2023-06-29&#xff1a;redis中什么是热点Key&#xff1f;该如何解决&#xff1f; 答案2023-06-29&#xff1a; 在Redis中&#xff0c;经常被访问的key被称为热点key。 产生原因和危害 原因 热点key问题产生的原因可以归纳为以下两种情况&#xff1a; 用户对于某些数据的…

安卓弹出popup之XPopup

弹窗自己写的话。虽然很简单。但不够丝滑。如果要优雅点的。又要添加动画。但是。。。如果用上了XPopup&#xff0c;动画别人帮你写。爽不爽&#xff1f;丝滑不丝滑。。&#xff1f; 丝滑第一步。先引入依赖 implementation com.github.li-xiaojun:XPopup:2.9.19如果没有这些…

git版本回退操作

本文 git 相关命令&#xff1a; git reset&#xff1a;回退版本&#xff0c;可指定某一次提交的版本。git reset [--soft | --mixed | --hard] commitId。git revert&#xff1a;撤销某个提交&#xff0c;做反向操作&#xff0c;生成新的commitId&#xff0c;原有提交记录保留…

基于java+swing+mysql图书管理系统V7.0

基于javaswingmysql图书管理系统V7.0 一、系统介绍二、功能展示1.项目骨架2.数据库表3.项目内容4.主界面5.登陆6、借阅管理7、修改读者信息8、图书验收9、新书订购 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java SE项目&#xff08;awtswing&…

(四)python实战——Sqlite3数据库表的增、删、查、改操作案例

前言 Sqlite3是一个轻量级的数据库&#xff0c;本节内容我们介绍一下如何在python环境中使用Sqlite数据库&#xff0c;完成数据库表的简单增、删、查、改操作。开始本节内容之前&#xff0c;我们需要先安装好python环境&#xff0c;我们使用的是python3的环境。 正文 ①创建…

【Docker】利用Dockerfile制作个人的镜像文件详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

如何避免死锁--方法三--scoped_lock

scoped_lock是c17新增的一种模板&#xff0c;也是RAII模式。其是可变参数&#xff0c;可以接受各种互斥类型作为参数模板&#xff0c;可以指定多个互斥量。 前文中我们说到&#xff0c;lock可以锁定多个互斥量&#xff0c;scoped_lock也可以做到。 void thread1() {cout <&…

【网络互联设备】网络杂谈(15)之网桥、路由器、网关、集线器、交换机、中继器的作用与概念

涉及知识点 网桥、路由器、网关、集线器、交换机、中继器的作用与概念&#xff0c;常见的网络互联设备&#xff0c;什么是网桥、路由器、网关、集线器、交换机、中继器。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不…

STM32F103基于HAL工程挂载FatFS驱动SD卡实现IAP功能

STM32F103基于HAL工程挂载FatFS驱动SD卡实现IAP功能 &#x1f3ac;基于SD卡IAP升级演示&#xff1a; &#x1f4cd;相关篇《STM32F103基于HAL工程挂载FatFS驱动SD卡》 &#x1f4cc;《使用STM32F103的串口实现IAP程序升级功能》 &#x1f449;&#x1f3fb;ST相关文档&…

并发-JMM-CPU缓存一致性协议MESI

回顾 指令重排 第一V读&#xff0c;都不能指令重排&#xff1b;第二个V写&#xff0c;都不能指令重排 普通读写&#xff0c;写读都会发生指令重排&#xff0c;V写普通读写会发生指令重排&#xff0c;普通读写V读会发生指令重排 CPU缓存一致性协议MESI java—》cpu的执行过程…

Three.js教程:高光网格材质Phong

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 其他系列工具&#xff1a; NSDT简石数字孪生 高光网格材质Phong 高光网格材质MeshPhongMaterial和基础网格材质MeshBasicMaterial、漫反射网格材质MeshLambertMaterial一样都是网格模型的Mesh的材质。 高光网格材质MeshPho…

Web测试的主要内容和测试方法有哪些?

Web测试的主要内容&#xff1a; 一、输入框 二、搜索功能 三、增加、修改功能 四、删除功能 五、注册、登录模块 六、上传图片测试 七、查询结果列表 八、返回键检查 九、回车键检查 十、刷新键检查 Web测试的测试方法&#xff1a; 1.在测试时&#xff0c;与网络有关的步骤或者…

npm报错(npm ERR! Unexpected token ‘.‘)

使用 nvm 将 node 切换到高版本后&#xff0c;运行 npm 相关的命令报的这个错 解决办法&#xff1a; 1、通过nvm list 命令查看当前都安装的node版本列表&#xff0c;依次通过 nvm uninstall [version] 命令将已经安装的 node 版本依次删除。 [version] 代表 node 版本号。 2…

目标检测 pytorch复现Yolov4目标检测项目

目标检测 pytorch复现Yolov4目标检测项目 YOLOV4介绍YOLOV4结构解析1、主干特征提取网络Backbone2、特征金字塔3、YoloHead利用获得到的特征进行预测4、预测结果的解码 YOLOV4的训练1、YOLOV4的改进训练技巧2、loss组成 训练自己的YoloV4模型 YOLOV4介绍 YOLOV4结构解析 1、主…

官宣了!B站将以视频播放分钟数代替播放次数

6月26日&#xff0c;哔哩哔哩&#xff08;以下简称“B站”&#xff09;迎来了14周年庆。B站董事长兼CEO陈睿进行了以“很高兴遇见你”为主题的演讲。 在B站14岁的时候&#xff0c;陈睿就演讲向大家宣布&#xff1a;为了更好地挖掘B站的优质内容&#xff0c;B站将以播放分钟数替…

pyocd打包为exe后调用弹黑窗及pyocd的api调用的问题

打包为exe的程序中调用了cmd窗口&#xff0c;调用的时候会自动弹窗&#xff0c;这个弹窗用pyinstaller的-w的方法是不行的&#xff0c;参考RT-ThreadStudio的方法是如下图写一个.bat文件&#xff0c;关闭弹窗回显 echo off cd /D %~dp0 pyocd.exe %* 但一个原因是 它是0.1.1版…