javaWeb个人学习02

会话技术

会话:

用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束.在一次会话中包含多次请求和响应

会话跟踪:

一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一个浏览器,以便在同一次会话的多次请求之间共享数据

会话跟踪方案:

客户端会话跟踪技术: Cookie
服务端会话跟踪技术: Session
令牌技术

会话跟踪方案的对比:

Cookie:

优点: HTTP协议中支持的技术
请求的时候(Cookie:name=value)
响应的时候 (Set-Cookie: name=value)
设置Cookie:

// 这里的response 是 HttpServletResponse类的
response.addCookie(new Cookie("CookieName", "CookieValue"));

获取Cookie:

// 这里的request 来自于HttpServletRequest 
Cookie[] cookies = request.getCookies(); // 获取所有的Cookie
// 遍历的时候 可以用foreach进行遍历
for(Cookie cookie : cookies)

缺点:
移动端APP无法使用Cookie
不安全,用户可以自己禁用Cookie
Cookie不能跨域

Session:

优点:储存在服务器端,安全

缺点:服务器集群环境下无法直接使用Session, 以及Cookie的缺点,因为Session的底层是基于Cookie实现的

往HttpSession中存储数据:

// session 是来自于HttpSession类里面的
session.setAttribute("name", "value"); // 往session中存储数据

从HttpSession中获取值:

// 这里的 request是来自于HttpServletRequest类里面的
HttpSession session = request.getSession();
Object t = session.getAttribute("name"); // 从session中获取数据

令牌技术(JWT):

 优点: 支持pc端,移动端,解决集群环境下的认证问题,减轻服务器端存储压力

 缺点:需要自己实现

简介:(JSON Web Token)

JWT以json数据格式安全的传输信息

组成:

第一部分:Header(头), 记录令牌类型, 签名算法
第二部分:Payload(有效载荷), 携带一些自定义信息 默认信息等
第三部分: Signature(签名), 防止Token被篡改,确保安全性, 将header payload 并加入指定密钥,通过指定签名算法计算而来

 生成:

先引入依赖:

设置 拿到jwt令牌

Map<String, Object> claims = new HashMao<>();
claims.put("id", 1);
claims.put("name", "Tom");

String jwt = Jwts.builder()
//第一个参数是用的是什么算法 第二个参数是你自定义的密钥
            .signWith(SignatureAlgorithm.HS256, "FindYou");
            .setClaims(claims); // 自定义内容(载荷)
            // 下面这个设置的有效期是1小时后 注意是参数的单位是毫秒值
            .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)); //设置有效期
            .compact();
 解析:

解析过期的令牌会发生异常

Claims claims = Jwts.parser()
        .setSigningKey("FindYou") // 这个是你之前设置的密钥
        .parseClaimsJws("这里传的是你之前获得的jwt令牌 也就是一串字符串")
        .getBody(); // 获得第二部分 也就是存储的对象信息

            

 注意事项:

过滤器(Filter)

概述:

代码演示:d

@WebFilter(urlPatterns = "/*") // 拦截的url
public class DemoFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截到了");
        filterChain.doFilter(servletRequest, servletResponse); // 放行
    }
}

 在登录校验中 过滤器的用法思路:

代码:

@Slf4j
@WebFilter(urlPatterns = "/*") // 拦截的url
public class DemoFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        // 获取请求的url
        String url = req.getRequestURL().toString();
        log.info("请求的url = {}", url);

        //判断url之中 是否有login 要是包含的话 直接放行
        if(url.contains("login")) {
            filterChain.doFilter(servletRequest, servletResponse); // 放行
            return;
        }
        // 获取请求头中的令牌
        String jwt = req.getHeader("token"); // 拿到令牌
        if(!StringUtils.hasLength(jwt)) { // 这样为空 或者是为null 就返回错误的信息
            log.info("请求头token为空");
            Result error = Result.error("NOT_LOGIN");
            // 将对象转换为json的数据
            String notLogin = JSONObject.toJSONString(error);// 转换为json格式的字符串
            resp.getWriter().write(notLogin); // 响应给浏览器
            return;
        }
        //解析token
        try {
            JwtsUtils.parseJWT(jwt);
        }catch (Exception e) { // 解析失败
            e.printStackTrace();
            log.info("解析令牌失败 返回未登录错误信息");
            Result error = Result.error("NOT_LOGIN");
            // 将对象转换为json的数据
            String notLogin = JSONObject.toJSONString(error);// 转换为json格式的字符串
            resp.getWriter().write(notLogin); // 响应给浏览器
            return;
        }
        // 放行
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python Matplotlib Tkinter-->tab切换3

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox import …

【leetcode】破解闯关密码 模板字符串

/*** param {number[]} password* return {string}*/ var crackPassword function(password) {return minNumspassword.sort((a,b)>{if(${a}${b}-${b}${a}>0){return 1;}else{return -1;}}).join(""); };巧用模板字符串对数组进行排序

react 路由的基本原理及实现

1. react 路由原理 不同路径渲染不同的组件 有两种实现方式 ● HasRouter 利用hash实现路由切换 ● BrowserRouter 实现h5 API实现路由切换 1. 1 HasRouter 利用hash 实现路由切换 1.2 BrowserRouter 利用h5 Api实现路由的切换 1.2.1 history HTML5规范给我们提供了一个…

HTML5 CSS3 提高

一&#xff0c;HTML5的新特性 这些新特性都有兼容性问题&#xff0c;基本是IE9以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这些新特性。 1.1新增语义化标签 注意&#xff1a; 1这种语义化标签主要是针对搜索引擎的 2这些新标签在页面…

第十四天-网络爬虫基础

1.什么是爬虫 1.爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;&#xff0c;是按照一定规则&#xff0c;自动的抓取万维网中的程序或者脚本&#xff0c;是搜索引擎的重要组成&#xff1b;比如&#xff1a;百度、 2.爬虫应用&#xff1a;1.搜索引擎&…

XXE 漏洞简单研究

近期在做个基础的 web 常见漏洞的 ppt&#xff0c;主要参考 OWASP TOP 10 2017RC2&#xff0c;此版本中增加了 XXE 攻击&#xff0c;所以自己简单的研究下 XXE 攻击。XXE&#xff08;XML External Entity&#xff09;XML 外部实体&#xff0c;当前端和后端通信数据采用 xml&…

阿里云ECS服务器vCPU是什么意思?

阿里云ECS服务器vCPU和CPU是什么意思&#xff1f;CPU和vCPU有什么区别&#xff1f;一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定&#xff0c;CPU是中央处理器&#xff0c;一个CPU可以包含若干个物理核&#xff0c;通过超线程HT&#xff08;Hyper-Threading&am…

矩阵的范数 matrix norm Frobenius norm 弗罗贝尼乌斯 范数

1&#xff0c;矩阵范数的定义 矩阵的范数&#xff0c;matrix norm即矩阵的模&#xff1b;它把一个矩阵空间变成为赋范线性空间&#xff1b; 从一个矩阵空间映射到非负实数的函数 满足以下条件&#xff1a; 1&#xff0c;严格的正定性。对于 , 则 ; and if , must ; 2&…

【Python】Code2flow学习笔记

1 Code2flow介绍 Code2flow是一个代码可视化工具库&#xff0c;旨在帮助开发人员更好地理解和分析代码&#xff1a; 可以将Python代码转换为流程图&#xff0c;以直观的方式展示代码的执行流程和逻辑结构。具有简单易用、高度可定制化和美观的特点&#xff0c;适用于各种代码…

团结引擎——DotNet Wasm方案

参考&#xff1a;团结引擎 DotNet WebAssembly(Wasm) 介绍 一、当前编译流程 通过IL2CPP将C#转成C/C&#xff1b;通过Emscripen将C/C转成WebAssembly&#xff1b; 二、 当前存在问题 IL2CPP在处理类似泛型、反射结构时&#xff0c;由于缺少运行时信息&#xff0c;必须全量生…

基于Springboot的计算机知识竞赛网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的计算机知识竞赛网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

11 PLL IP核

PLL IP 核简介 锁相环&#xff08;PLL&#xff09;作为一种反馈控制电路&#xff0c;其特点是利用外部输入的参考信号来控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪&#xff0c;所以锁相环通常用于闭环跟踪电路。锁相环在工作…

六、防御保护---防火墙内容安全篇

六、防御保护---防火墙内容安全篇 一、IAE&#xff08;Intelligent Awareness Engine&#xff09;引擎二、深度检测技术(DFI和DPI&#xff09;2.1 DPI -- 深度包检测技术2.1.1 基于“特征字”的检测技术2.1.2 基于应用网关的检测技术2.1.3 基于行为模式的检测技术 2.2 DFI -- 深…

MySQL的事务与隔离级别

1. 什么是事务&#xff1f; 数据库中的事务是指对数据库执行一批操作&#xff0c;而这些操作最终要么全部执行成功&#xff0c;要么全部失败&#xff0c;不会存在部分成功的情况。这个时候就需要用到事务。 最经典的例子就是转账&#xff0c;你要给朋友小白转 1000 块钱&…

【Java 基础】Java 数组、方法极致精讲

《Java 零基础入门到精通》专栏持续更新中。通过本专栏你将学习到 Java 从入门到进阶再到实战的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 订阅专栏后添加我微信或者进交流群,进群可找我领取 前端/Java/大数据/Python/低…

华为手动ipv6-to-ipv4隧道

中间r2的两个接口配置两个地址就行了&#xff0c;其它什么都不用配置 两边出接口R1和R3手动隧道建立&#xff1a;先把IPV4打通&#xff0c;并配置默认路由 再起隧道接口上进行配置&#xff0c;再配置带隧道的默认路由 PC上和上联接口网关只有IPV6地址 最终两个PC可以ping通 …

vue3的echarts从后端获取数据,用于绘制图表

场景需求&#xff1a;后端采用flask通过pymysql从数据库获取数据&#xff0c;并返回给前端。前端vue3利用axios获取数据并运用到echarts绘制图表。 第一步&#xff0c;vue中引入echarts 首先vue下载echarts npm install echarts 然后在main.js文件写如下代码 import {create…

Python入门到精通(九)——Python数据可视化

Python数据可视化 一、JSON数据格式 1、定义 2、python数据和JSON数据转换 二、pyecharts 三、折线图 四、地图 五、动态柱状图 一、JSON数据格式 1、定义 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据JSON本质上是一个带有特定格式的字符…

网络初识(概念入门)

目录 1.局域网VS广域网 1.1局域网 1.2广域网 2.五元组 2.1 IP和端口 2.1.1 IP 2.1.2端口号 2.2协议 3.协议分层 4. TCP/IP五层模型 5.封装和分用 5.1封装 5.2分用 1.局域网VS广域网 1.1局域网 简单介绍&#xff1a;指在某一特定区域内由多台计算机组成的互联网组…

Vue概念详解【目录】

本专栏简介&#xff1a; 这个专栏是关于 Vue2 和 Vue3 各种概念的大集合&#xff01;它深入挖掘原理&#xff0c;分析各种优势和劣势&#xff0c;适配各种应用场景&#xff0c;部分内容还列出了代码示例&#xff0c;以清晰地讲述原理。在这里&#xff0c;你将全面了解 Vue2 和…
最新文章