JWT令牌、过滤器Filter、拦截器Interceptor
目录
JWT令牌
简介
JWT生成
解析JWT
登陆后下发令牌
过滤器(Filter)
Filter快速入门
Filter拦截路径
过滤器链
登录校验Filter-流程
拦截器(Interceptor)
Interceptor 快速入门
拦截路径
登录校验流程
JWT令牌
简介
全称:JSON Web Token(https://iwt.io/)
定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。
组成:
第一部分:Header(头),记录令牌类型、签名算法等。例如:{"alg":"HS256","type":"JWT"}
第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。例如 {"id":"1","username":"Tom"}
第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、pavload,并加入指定秘钥,通过指定签名算法计算而来。
场景:登录认证,
登录成功后,生成令牌
后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理
JWT生成
在pom.xml 导入依赖
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>
测试
//生成JWT@Testpublic void testGenJwt(){Map<String,Object>claims=new HashMap<>();claims.put("id",1);claims.put("name","Tom");String jwt = Jwts.builder().setClaims(claims)//自定义内容.signWith(SignatureAlgorithm.HS256, "itking")//签名算法.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期为一个小时.compact();System.out.println(jwt);}
返回生成的JWT令牌
解析JWT
@Testpublic void testParseJwt(){Claims claims = Jwts.parser().setSigningKey("itking")//指定签名密钥.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiVG9tIiwiaWQiOjEsImV4cCI6MTcxODM2ODM3N30.iRwBkPs6CGuUrZpz1YBjh0QubkpEnY6ArxddkVlMclI")//解析令牌.getBody();System.out.println(claims);}
JWT校验时使用的签名秘钥,必须和生成IWT令牌时使用的秘钥是配套的
如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法
登陆后下发令牌
令牌生成:登录成功后,生成JWT令牌,并返回给前端,
令牌校验:在请求到达服务端后,对令牌进行统一拦截、校验
需要附加一个工具类JwtUtils类
package com.example.Utils;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;public class JwtUtils {private static String signKey = "itking";private static Long expire = 43200000L;/*** 生成JWT令牌* @param claims JWT第二部分负载 payload 中存储的内容* @return*/public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}
再更改一下LoginController
package com.example.Controller;import com.example.Pojo.Emp;
import com.example.Pojo.Result;
import com.example.Service.EmpService;
import com.example.Utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@RestController
public class LoginController {@Autowiredprivate EmpService empService;@PostMapping("/login")public Result login(@RequestBody Emp emp){Emp e= empService.login(emp);//登陆成功,生成令牌,下发令牌if(e!=null){Map<String, Object> claims=new HashMap<>();claims.put("id",e.getId());claims.put("name",e.getName());claims.put("username",e.getUsername());String jwt = JwtUtils.generateJwt(claims);return Result.success(jwt);}//登陆失败,返回错误信息return Result.error("用户名或密码错误");}
}
测试
过滤器(Filter)
概念:Filter 过滤器,是JavaWeb 三大组件(Servlet、Filter、Listener)之一
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等
Filter快速入门
定义Filter:定义一个类,实现 Filter接口,并重写其所有方法。
配置Filter: filter类上加 @Webfilter 注解,配置拦截资源的路径。引导类上加 @ServletComponentScan 开启Servlet组件支持
初始化与销毁已经默认实现了
DemoFilter类
package com.example.Filter;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {//初始化方法,只调用一次@Overridepublic 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("拦截到请求");//放行filterChain.doFilter(servletRequest,servletResponse);}//销毁方法,只调用一次@Overridepublic void destroy() {System.out.println("destroy销毁方法执行了");}
}
还要在启动类加上@ServletComponentScan
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@ServletComponentScan//开启了对servlet组件的支持
@SpringBootApplication
public class TliasWebManagementApplication {public static void main(String[] args) {SpringApplication.run(TliasWebManagementApplication.class, args);}}
放行后访问对应资源,资源访问完成后,还会回到Filter中吗?
会
如果回到Filter中,是重新执行还是执行放行后的逻辑呢?
执行放行后逻辑
Filter拦截路径
Filter 可以根据需求,配置不同的拦截资源路径
拦截路径 | urlPatterns值 | 含义 |
拦截具体路径 | /login | 只有访问 /login 路径时,才会被拦截 |
目录拦截 | /emps/* | 访问/emps下的所有资源,都会被拦截 |
拦截所有路径 | /* | 访问所有资源,都会被拦截 |
过滤器链
介绍:一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链
顺序:注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序。
所有的请求,拦截到了之后,都需要校验令牌吗?
有一个例外,登录请求
拦截到请求后,什么情况下才可以放行,执行业务操作?
有令牌,且令牌校验通过(合法);否则都返回未登录错误结果
登录校验Filter-流程
- 获取请求url。
- 判断请求url中是否包含login,如果包含,说明是登录操作,放行
- 获取请求头中的令牌(token)
- 判断令牌是否存在,如果不存在,返回错误结果(未登录)
- 解析token,如果解析失败,返回错误结果(未登录)
- 放行。
package com.example.Filter;import com.alibaba.fastjson.JSONObject;
import com.example.Pojo.Result;
import com.example.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.util.StringUtils;import java.io.IOException;@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req= (HttpServletRequest) servletRequest;HttpServletResponse resp= (HttpServletResponse) servletResponse;//1获取请求url。String url=req.getRequestURI().toString();log.info("请求的url:{}",url);//2判断请求url中是否包含login,如果包含,说明是登录操作,放行if(url.contains("login")){log.info("登陆操作,放行");filterChain.doFilter(servletRequest,servletResponse);return;}//3获取请求头中的令牌(token)String jwt=req.getHeader("token");//4判断令牌是否存在,如果不存在,返回错误结果(未登录)if(!StringUtils.hasLength(jwt)){log.info("请求头token为空,返回未登陆信息");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}//5解析token,如果解析失败,返回错误结果(未登录)try {JwtUtils.parseJWT(jwt);} catch (Exception e) {e.printStackTrace();log.info("解析令牌失败,返回未登录信息");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}//6放行log.info("令牌合法,放行");filterChain.doFilter(servletRequest,servletResponse);}
}
拦截器(Interceptor)
概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行
作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。
Interceptor 快速入门
1.定义拦截器,实现HandlerInterceptor接口,并重写其所有方法
2.注册拦截器
先创建一个包+类
然后实现这个接口
再按ctrl+o重写里面的方法
package com.example.Interceptor;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override//目标资源方法运行前运行,返回true:放行,放回false,不放行public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle运行了");return true;}@Override//标资源方法运行后运行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle运行了");}@Override//视图渲染完毕后运行,最后运行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion运行了");}
}
再写个配置类
package com.example.Config;import com.example.Interceptor.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("/**");}
}
拦截路径
拦截路径 | 含义 | 举例 |
/* | 一级路径 | 能匹配/depts,/emps,/login,不能匹配/depts/1 |
/** | 任意级路径 | 能匹配/depts,/depts/1,/depts/1/2 |
/depts/* | /depts下的一级路径 | 能匹配/depts/1,不能匹配/depts/1/2,/depts |
/depts/** | /depts下的任意级路径 | 能匹配/depts,/depts/1,/depts/1/2,不能匹配/emps/1 |
Filter 与Interceptor
接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。
登录校验流程
这个与Filter差不多
package com.example.Interceptor;import com.alibaba.fastjson.JSONObject;
import com.example.Pojo.Result;
import com.example.Utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override//目标资源方法运行前运行,返回true:放行,放回false,不放行public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String url=request.getRequestURI().toString();log.info("请求的url:{}",url);//2判断请求url中是否包含login,如果包含,说明是登录操作,放行if(url.contains("login")){log.info("登陆操作,放行");return true;}//3获取请求头中的令牌(token)String jwt=request.getHeader("token");//4判断令牌是否存在,如果不存在,返回错误结果(未登录)if(!StringUtils.hasLength(jwt)){log.info("请求头token为空,返回未登陆信息");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);response.getWriter().write(notLogin);return false;}//5解析token,如果解析失败,返回错误结果(未登录)try {JwtUtils.parseJWT(jwt);} catch (Exception e) {e.printStackTrace();log.info("解析令牌失败,返回未登录信息");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);response.getWriter().write(notLogin);return false;}//6放行log.info("令牌合法,放行");return true;}@Override//标资源方法运行后运行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle运行了");}@Override//视图渲染完毕后运行,最后运行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion运行了");}
}
努力遇见更好的自己!!!
相关文章:
JWT令牌、过滤器Filter、拦截器Interceptor
目录 JWT令牌 简介 JWT生成 解析JWT 登陆后下发令牌 过滤器(Filter) Filter快速入门 Filter拦截路径 过滤器链 登录校验Filter-流程 拦截器(Interceptor) Interceptor 快速入门 拦截路径 登录校验流程 JWT令牌 简介 全称:JSON Web Token(https://iwt.io/) …...
iText7画发票PDF——小tips
itext7教程: 1、https://blog.csdn.net/allway2/article/details/124295097 2、https://max.book118.com/html/2017/0720/123235195.shtm 3、https://www.cnblogs.com/fonks/p/15090635.html 4、https://www.cnblogs.com/sky-chen/p/13026203.html 5、官方ÿ…...
跟着刘二大人学pytorch(第---10---节课之卷积神经网络)
文章目录 0 前言0.1 课程链接:0.2 课件下载地址: 回忆卷积卷积过程(以输入为单通道、1个卷积核为例)卷积过程(以输入为3通道、1个卷积核为例)卷积过程(以输入为N通道、1个卷积核为例)…...
transformer实战
1.pipeline() 首先下载transformer,之后 from transformers import pipeline# 加载一个用于文本分类的pipeline # Use a pipeline as a high-level helperpipe pipeline("zero-shot-classification", model"https://hf-mirror.com/morit/chinese_…...
【Starrocks docker-compose部署】
一、docker-compose部署starrocks 官方的docker-compose地址:docker-compose地址 version: "3.9" services:starrocks-fe-0:image: starrocks/fe-ubuntu:latesthostname: starrocks-fe-0container_name: starrocks-fe-0command:- /bin/bash- -c- |/opt/starrocks/f…...
Nginx 精解:正则表达式、location 匹配与 rewrite 重写
一、常见的 Nginx 正则表达式 在 Nginx 配置中,正则表达式用于匹配和重写 URL 请求。以下是一些常见的 Nginx 正则表达式示例: 当涉及正则表达式时,理解各个特殊字符的含义是非常重要的。以下是每个特殊字符的例子: ^࿱…...
代码随想录算法训练营Day37|56.合并区间、738.单调递增的数字、968.监控二叉树
合并区间 56. 合并区间 - 力扣(LeetCode) 和之前的思路类似,先创建一个ans二维数组,创建start和end来指明添加进入ans数组的区间下标,先对数组按照首元素排序从小到大排序后,根据当前元素是否小于下一个元…...
Web前端开发12章:深入探索与实战解析
Web前端开发12章:深入探索与实战解析 在数字化浪潮的推动下,Web前端开发技术日新月异,成为了构建互联网应用的重要基石。本文将以12章的篇幅,从四个方面、五个方面、六个方面和七个方面,深入探索Web前端开发的精髓&am…...
八股操作系统和计算机网络
5.线程间的同步的方式有哪些? 6.PCB(不熟悉) 进程状态 什么是僵尸进程和孤儿进程? 进程调度算法 死锁的理解 举个发生死锁的例子 解决死锁的方式 内存管理做了哪些事情 什么是内存碎片 常见的内存管理 段表通过什么数据结构实现地址映射 分段机制为什么会…...
正能量情感语录热门素材文案去哪里找?文案素材网站分享
正能量情感语录热门素材文案去哪里找?文案素材网站分享 想为你的作品注入正能量和情感温度?不知如何获取热门情感语录素材?别担心,今天我将为大家推荐一些海外知名的素材网站,让你轻松找到受欢迎的文案素材ÿ…...
bean实例化
黑马程序员SSM 文章目录 一、bean是如何创建的二、实例化bean的三种方式3.1 构造方法(常用)3.2 静态工厂3.3 实例化工厂(了解)3.4 FactoryBean 一、bean是如何创建的 Spring 创建bean的时候使用的是无参构造 二、实例化bean的三…...
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...
【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存
💭 写在前面:我们将再次扩展之前的C语言,让我们向这种语言引入“作用域”的概念。 目录 0x00 C- 语言:有块的作用域 0x01 C- 语言:更新的语法 0x02 新的语义域 0x03 环境 vs. 内存 0x00 C- 语言:有块的…...
React native 使用Animated 优化连续setState 性能问题
再部分场景下我们需要连续更新state刷新页面。一般情况刷新使用setstate没有问题,当需要连续刷新的情况会有明显的性能问题。 场景:自定义可拖动抽屉组件 新增需求在抽屉活动是更新主页面组件样式,此时需要动态传递抽屉高度修改主页组件属性…...
Qt中的事件循环
Gui框架一般都是基于事件驱动的,Qt也不例外,在 Qt 框架中,事件循环(Event Loop)是一个核心机制,负责管理和分发应用程序中的所有事件和消息。它确保了应用程序能够响应用户输入、定时器事件、窗口系统事件等…...
JVM常用概念之线程本地分配缓冲区(ThreadLocal Allocation Buffer,TLAB)
当实例化一个Java类时,运行时环境必须为相关实例分配存储空间,在JRE中此存储空间分配操作是由内存管理器实现的(其实是JVM的垃圾回收器),由于内存管理器通常使用与运行时目标语言不同的语言编写(例如&#…...
大模型生成的常见Top-k、Top-p、Temperature参数
参考: https://zhuanlan.zhihu.com/p/669661536 topK,topP https://www.douyin.com/video/7380126984573127945 主要是softmax产生的词表每个词的概率分布后, topK,比如K3,表示采样概率最大的前3个,其他全…...
ppt添加圆角矩形,并调整圆角弧度方法
一、背景 我们看的论文,许多好看的图都是用PPT做的,下面介绍用ppt添加圆角矩形,并调整圆角弧度方法。 二、ppt添加圆角矩形,并调整圆角弧度 添加矩形: 在顶部工具栏中,点击“插入”选项卡。 在“插图”…...
测评要求+基本措施+对应产品
基本要求项测评项基本措施对应产品 网络架构 网络架构 网络架构应保证网络各个部分的带宽满足业务高峰期需要;带宽管理流量控制系统 网络架构 网络架构 网络架构应避免将重要网络区域部署在边界处,重要网络区域与其他网络区域之间应采取可靠的技术隔离手…...
什么是git?
前言 Git 是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。是的,我对git的介绍就一条,想看简介的可以去百度一下😘😘😘 为什么要用git? OK,想象一下…...
C/C++中内存开辟与柔性数组
C/C中内存的开辟 在C中,我们都知道有三个区: 1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指…...
编程App软件优化是什么
编程App软件优化是什么 在数字化时代,编程App软件已成为我们日常生活和工作中不可或缺的一部分。然而,随着技术的不断进步和用户需求的日益多样化,如何对编程App软件进行优化,以提供更高效、更流畅的用户体验,成为了开…...
爱了爱了,11款超良心App推荐!
AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/今天,我们向你推荐十款与众不同但又不错的win10软件,它们都有各自的功能和优点,相信你一定会喜欢。 1.图片处…...
Linux基础指令(二)(文件、权限等)
目录 普通文件的操作 touch cat 翻页 标准输出重定向: 标准输出重定向种类: 管道符:| 压缩指令: zip gzip tar Linux下最常见的打包指令 其他系统指令: 快捷…...
爆火的治愈系插画工具又来了,额度居然有18w,根本花不完?
AI治愈插画又又又来了 今天给大家推荐一款完全免费的软件,用过的人都说好! 先来看看我生成的图 制作过程非常简单,输入你想要生成的画面咒语。 工具地址:https://www.qiyuai.net/ 模型目前有两种 我上面的图就是用的第一种通用…...
Qt 实战(4)信号与槽 | 4.3、信号连接信号
文章目录 一、信号连接信号1、什么是信号连接信号?2、如何实现信号连接信号3、总结 前言: 在Qt框架中,信号与槽(Signals and Slots)机制是对象间通信的核心。通常情况下,我们习惯于将信号连接到槽函数上&am…...
Day 16:3040. 相同分数的最大操作数目II
Leetcode 相同分数的最大操作数目II 给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个: 选择 nums 中最前面两个元素并且删除它们。选择 nums 中最后两个元素并且删除它们。选择 nums 中第一个和最后一…...
Go基础编程 - 07 - 字典(map)及其约束
字典(map) 下一篇:结构体1. 声明2. nil 值字典3. 判断某个键是否存在4. 遍历5. delete() 删除键值对6. 约束7. 扩展 上一篇:指针 下一篇:结构体 map 是一种无序的基于 key-value 的数据结构,Go 语言中的 …...
WebSocket 快速入门 与 应用
WebSocket 是一种在 Web 应用程序中实现实时、双向通信的技术。它允许客户端和服务器之间建立持久性的连接,以便可以在两者之间双向传输数据。 以下是 WebSocket 的一些关键特点和工作原理: 0.特点: 双向通信:WebSocket 允许服务…...
使用Spring Cloud设计电商系统架构
在当今互联网高速发展的时代,电子商务系统成为了商家与用户互动的主要方式之一。为了能够更好地应对高并发、可扩展性、灵活性等需求,微服务架构逐渐成为设计电商系统的首选方案。Spring Cloud作为一个成熟的微服务框架,为开发人员提供了一整…...
百度网站怎么做视频播放器/首页图片点击率如何提高
1、Viasfora (关键字跟括号其他的高亮清晰分类) 2.ClaudiaIDE (VS代码背景替换也可以换自己想要的图片) 3.VSCommands for Visual Studio 2013 代码显示增强:它可以在尾部显示方法或过程名字 4.Indent Guides &#x…...
怎么在一起做网站上拿货/竞价托管是啥意思
我一直坚持在Linux下钻研计算机软件的相关知识,三个半月前学完了《数据库系统概论》这本书。在学习中我使用了MySQL作为练兵场,但当我学到书的后半部分的时候,发现MySQL有一些问题: 1、MySQL没有角色权限控制功能,也就…...
中国建设银行邀约提额网站/扬州百度推广公司
1、查找某条数据的创建时间同个月内的所有数据 SELECT * FROM 表名 WHERE DATE_FORMAT( create_time, %Y%m ) DATE_FORMAT( 2021-01-01 , %Y%m ) create_time:表里表示创建时间的字段名 2021-01-01 :选择的某条数据创建时间的年月日 2、使用select…...
外贸网站布局/谷歌商店官网
文章目录1.判断单链表是否带环为什么快指针走2步,慢指针走1步一定可以相遇如果快指针每次不是走两个节点,是否还会相遇2.找入环点1.判断单链表是否带环 给定一个单链表,如果带环返回true,不带环返回false. 这里设了两个指针&…...
做游戏视频网站/找广告商的平台
阿里云监控系统支持用户自定义监控类型,具有极强的监控扩展能力,支持用户自己编写监控插件实现自定义监控类型。编写完后将插件放到Agent安装目录下面的scripts目录下面,如果是linux服务器则是/usr/local/cms/scripts目录下面。 监控插件不管…...
可以做围棋题的网站/搜索引擎付费推广
title: 【D3.js】1.16-更改 SVG 元素的颜色 date: 2022-12-02 14:24 tags: [JavaScript,CSS,HTML,D3.js,SVG] 至此,一个较为完整的rect图已经完成了,但是所有的rect都是黑色。 一、学习目标 如何着色 .attr(“fill”,“navy”); 二、题目 添加 attr() 方…...