SpringSession入门
1. 背景传统的session只能保存在内存中,且与Cookie绑定,只能从Cookie中获取sessionId,然后在应用中使用。 但是现在的开发环境中,除了传统的web项目,还有基于分布式的项目,这种项目传统的单体应用session是根本没法使用的除此之外,现在手机APP也逐步多了起来,基于 CS架构的 应用兴起,而手机是不支持Cookie的,因此,也无法使用传统的Cookie-Session的模式 2. SpringSessionSpringSession 是 Spring 官方开源的框架,旨在提供会话管理的解决方案。它可以与各种后端存储(如内存、数据库、Redis 等)集成,以便将会话数据存储在可扩展的分布式环境中。Spring Session 不仅可以用于传统的 Web 应用程序,还可以用于微服务架构中的分布式系统。 SpringSession实现的session存储不依赖内存,因此,项目重启之后session依然有效。 2.1. Spring Session 的核心概念在深入研究 Spring Session 之前,让我们了解一些核心概念: 2.1.1....
SpringSession基于Jdbc数据库实现
1. 说明springSession 基于 Redis实现需要集成redis,框架本身只做了兼容redis存储,如果没有redis的话是会报错的。 2. 框架搭建2.1. 引入依赖123456789101112131415161718192021<dependencies> <dependenc> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--sessionJDBC的实现--> <dependency> <groupId>org.springframework.session</groupId> ...
SpringSession基于Redis实现
1. 说明springSession 基于 Redis实现需要集成redis,框架本身只做了兼容redis存储,如果没有redis的话是会报错的。 2. 框架搭建2.1. 引入依赖12345678910111213<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId></dependency><!--redis本身的配置等--><dependency> ...
nginx配置IP自动封禁
1. 说明网上搜了一下关于Nginx自动封禁IP的教程,基本从一个博客中复制的,而且还有问题,这里重新写一篇关于IP自动封禁的 思路是配置一个conf文件存放封禁的IP,然后编写一个脚本从Nginx访问日志access.log中提取封禁的IP,然后存放在conf中 2. IP封禁原理nginx默认支持IP封禁的,使用语法为 12345678910111213# 禁止访问deny 192.168.1.1;#禁止一个网段访问deny 192.168.2.0/24;#允许访问allow 192.168.1.4;#允许一个网段访问allow 192.168.3.0/24;#允许所有allow all;# 禁止所有deny all; 如果遇到了冲突,以最前面的为准 配置在http模块或者server中均可,例如: 12345678910111213http { #http模式公共配置 #禁止访问 deny 192.168.2.0/24; server { # 域名,端口等配置 ...
Java加载本地路径文件
说明Java中加载文件是通过ClassLoader来加载的,先获取到文件路径,然后在通过File或InputStream加载到内存中 一般加载的访问有lass.getResource和class.getClassloader().getResource()两种 class.getResource() 默认从自己所在的包的路径开始加载, class.getClassloader().getResource() 默认从classpath路径加载,也就是项目的resources目录开始 示例代码Java类的路径在工程目录下的src/main/java/com/kewen/demo/classloader/ResourceTesta资源文件路径为工程目录下的src/main/resources/com/kewen/demo/classloader/a.jsonb资源文件路径为工程目录下的src/main/resources/b.json 1234567891011public class ResourceTest { public static void...
Maven插件及编译配置
插件指定打包版本123456789101112<plugins> <plugin> <!-- 编译时使用 JDK 版本 --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>8</source> <target>8</target> </configuration> </plugin></plugins> SpringBoot 打包插件1234567891011<plugins> ...
Netty基础工程搭建
概念Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。 Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Netty 都是异步的。 Netty 是最流行的 NIO 框架,它已经得到成百上千的商业、商用项目验证,许多框架和开源组件的底层 rpc 都是使用的 Netty,如 Dubbo、Elasticsearch 等等。下面是官网给出的一些 Netty 的特性: 设计方面 对各种传输协议提供统一的 API(使用阻塞和非阻塞套接字时候使用的是同一个 API,只是需要设置的参数不一样)。基于一个灵活、可扩展的事件模型来实现关注点清晰分离。高度可定制的线程模型——单线程、一个或多个线程池。真正的无数据报套接字(UDP)的支持(since 3.1)。易用性 完善的 Javadoc 文档和示例代码。不需要额外的依赖,JDK 5...
JSqlParser使用语法
1. 查询语句构造 select1select * from user 1234567891011public void plainSelect() throws JSQLParserException { Statement parse = CCJSqlParserUtil.parse("select * from user"); Select select = (Select) parse; PlainSelect plainSelect = select.getPlainSelect();}//或者使用下面的构造public void plainSelect2() throws JSQLParserException { Select select = SelectUtils.buildSelectFromTable(new Table("user")); PlainSelect plainSelect = select.getPlainSelect(); ...
JSqlParser强大的SQL改写工具-概念
1. 说明JParser 是一个好用的SQL处理工具,它的强大之处在于可以解析SQL并根据条件随意修改SQL 对于需要某些全局特性的SQL,如添加租户,删除SQL改为逻辑删除、构建动态表等可以实现统一处理,避免业务开发疏忽某些条件参数等。 当然,SQL改写避免不了性能的损耗,它需要解析SQL,修改完成之后再构造SQL,对于高并发场景还是应当慎用 2. 概念对于JParser来说,我也是一个初学者,现在将一些对于框架的理解分析一下。 2.1. Expression:表达式大多数方法都是基于它的实现,而且基本上后续大部分的入参都是它,基本属于顶级的存在 2.2. Select 查询这是对于查询语句的封装,是一个抽象接口,select查询语句就会解析成它。 其实现类有以下集中 PlainSelect 一般的查询语句 ParenthesedSelect:带括号的查询语句,一般用于in子句中 WithItem: with as( )...
MybatisPlus插件使用
插件原理MybatisPlus的插件是基于mybatis的intercepter扩展来的,其本质是在mybatis的一个插件维护一组自己的插件组,并挨个执行 其主类为MybatisPlusInterceptor 12345678910111213141516171819202122232425@Intercepts( { @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}), @Signature(type = StatementHandler.class, method = "getBoundSql", args = {}), @Signature(type = Executor.class, method = "update", args =...