首页 文章 精选 留言 我的

精选列表

搜索[Springboot],共4376篇文章
优秀的个人博客,低调大师

重塑企业级数据检索底座:基于腾讯云环境的ElasticSearch 8.X + SpringBoot 3.X 最佳实践

在数字化转型步入深水区的今天,企业面对的数据正呈现出多模态、高维度、海量级的特点。从电商平台的毫秒级商品检索,到金融风控的实时日志溯源,传统的基于关系型数据库的模糊查询机制已彻底触及性能天花板。作为当前业界最强大的分布式搜索与分析引擎,Elasticsearch(简称ES)在此背景下扮演着不可替代的基础设施角色。

优秀的个人博客,低调大师

java B2B2C Springboot电子商务平台源码-SSO单点登录之OAuth2.0登录认证

之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一、oauth中的角色 client:调用资源服务器API的应用 Oauth 2.0 Provider:包括Authorization Server和Resource Server (1)Authorization Server:认证服务器,进行认证和授权 (2)Resource Server:资源服务器,保护受保护的资源 user:资源的拥有者 二、下面详细介绍一下Oauth 2.0 Provider Authorization Server: (1)AuthorizationEndpoint:进行授权的服务,Default URL: /oauth/authorize (2)TokenEndpoint:获取token的服务,Default URL: /oauth/token Resource Server: OAuth2AuthenticationProcessingFilter:给带有访问令牌的请求加载认证 三、下面再来详细介绍一下Authorization Server: 一般情况下,创建两个配置类,一个继承AuthorizationServerConfigurerAdapter,一个继承WebSecurityConfigurerAdapter,再去复写里面的方法。 主要出现的两种注解: 1、@EnableAuthorizationServer:声明一个认证服务器,当用此注解后,应用启动后将自动生成几个Endpoint:(注:其实实现一个认证服务器就是这么简单,加一个注解就搞定,当然真正用到生产环境还是要进行一些配置和复写工作的。) /oauth/authorize:验证 /oauth/token:获取token /oauth/confirm_access:用户授权 /oauth/error:认证失败 /oauth/check_token:资源服务器用来校验token /oauth/token_key:如果jwt模式则可以用此来从认证服务器获取公钥 以上这些endpoint都在源码里的endpoint包里面。 2、@Beans:需要实现AuthorizationServerConfigurer AuthorizationServerConfigurer包含三种配置: ClientDetailsServiceConfigurer:client客户端的信息配置,client信息包括:clientId、secret、scope、authorizedGrantTypes、authorities (1)scope:表示权限范围,可选项,用户授权页面时进行选择 (2)authorizedGrantTypes:有四种授权方式 Authorization Code:用验证获取code,再用code去获取token(用的最多的方式,也是最安全的方式) Implicit: 隐式授权模式 Client Credentials (用來取得 App Access Token) Resource Owner Password Credentials (3)authorities:授予client的权限 这里的具体实现有多种,in-memory、JdbcClientDetailsService、jwt等。 AuthorizationServerSecurityConfigurer:声明安全约束,哪些允许访问,哪些不允许访问 AuthorizationServerEndpointsConfigurer:声明授权和token的端点以及token的服务的一些配置信息,比如采用什么存储方式、token的有效期等 client的信息的读取:在ClientDetailsServiceConfigurer类里面进行配置,可以有in-memory、jdbc等多种读取方式。 jdbc需要调用JdbcClientDetailsService类,此类需要传入相应的DataSource. 下面再介绍一下如何管理token: AuthorizationServerTokenServices接口:声明必要的关于token的操作 (1)当token创建后,保存起来,以便之后的接受访问令牌的资源可以引用它。 (2)访问令牌用来加载认证 接口的实现也有多种,DefaultTokenServices是其默认实现,他使用了默认的InMemoryTokenStore,不会持久化token; token存储方式共有三种分别是: (1)InMemoryTokenStore:存放内存中,不会持久化 (2)JdbcTokenStore:存放数据库中 (3)Jwt: json web token 授权类型: 可以通过AuthorizationServerEndpointsConfigurer来进行配置,默认情况下,支持除了密码外的所有授权类型。相关授权类型的一些类: (1)authenticationManager:直接注入一个AuthenticationManager,自动开启密码授权类型 (2)userDetailsService:如果注入UserDetailsService,那么将会启动刷新token授权类型,会判断用户是否还是存活的 (3)authorizationCodeServices:AuthorizationCodeServices的实例,auth code 授权类型的服务 (4)implicitGrantService:imlpicit grant (5)tokenGranter: endpoint的URL的配置: (1)AuthorizationServerEndpointsConfigurer的pathMapping()方法,有两个参数,第一个是默认的URL路径,第二个是自定义的路径 (2)WebSecurityConfigurer的实例,可以配置哪些路径不需要保护,哪些需要保护。默认全都保护。 自定义UI: (1)有时候,我们可能需要自定义的登录页面和认证页面。登陆页面的话,只需要创建一个login为前缀名的网页即可,在代码里,设置为允许访问,这样,系统会自动执行你的登陆页。此登陆页的action要注意一下,必须是跳转到认证的地址。 (2)另外一个是授权页,让你勾选选项的页面。此页面可以参考源码里的实现,自己生成一个controller的类,再创建一个对应的web页面即可实现自定义的功能。 下面梳理一下授权获取token流程: (1)端口号换成你自己的认证服务器的端口号,client_id也换成你自己的,response_type类型为code。 localhost:8080/uaa/oauth/authorize?client_id=client&response_type=code&redirect_uri=http://www.baidu.com (2)这时候你将获得一个code值:http:www.baidu.com/?code=G0C20Z (3)使用此code值来获取最终的token: curl -X POST -H “Cant-Type: application/x-www-form-urlencoded” -d ‘grant_type=authorization_code&code=G0C20Z&redirect_uri=http://www.baidu.com’ “http:client:secret@localhost:8080/uaa/oauth/token” 返回值: {“access_token”:“b251b453-cc08-4520-9dd0-9aedf58e6ca3”,“token_type”:“bearer”,“expires_in”:2591324,“scope”:“app”} (4)用此token值来调用资源服务器内容(如果资源服务器和认证服务器在同一个应用中,那么资源服务器会自己解析token值,如果不在,那么你要自己去做处理) curl -H “Authorization: Bearer b251b453-cc08-4520-9dd0-9aedf58e6ca3” “localhost:8081/service2(此处换上你自己的url)” 四、Resource Server:保护资源,需要令牌才能访问在配置类上加上注解@EnableResourceServer即启动。使用ResourceServerConfigurer进行配置: (1)tokenServices:ResourceServerTokenServices的实例,声明了token的服务 (2)resourceId:资源Id,由auth Server验证。 (3)其它一些扩展点,比如可以从请求中提取token的tokenExtractor (4)一些自定义的资源保护配置,通过HttpSecurity来设置 使用token的方式也有两种: (1)Bearer Token(https传输方式保证传输过程的安全):主流 (2)Mac(http+sign) 如何访问资源服务器中的API? 如果资源服务器和授权服务器在同一个应用程序中,并且您使用DefaultTokenServices,那么您不必太考虑这一点,因为它实现所有必要的接口,因此它是自动一致的。如果您的资源服务器是一个单独的应用程序,那么您必须确保您匹配授权服务器的功能,并提供知道如何正确解码令牌的ResourceServerTokenServices。与授权服务器一样,您可以经常使用DefaultTokenServices,并且选项大多通过TokenStore(后端存储或本地编码)表示。 (1)在校验request中的token时,使用RemoteTokenServices去调用AuthServer中的/auth/check_token。 (2)共享数据库,使用Jdbc存储和校验token,避免再去访问AuthServer。 (3)使用JWT签名的方式,资源服务器自己直接进行校验,不借助任何中间媒介。 五、oauth client 在客户端获取到token之后,想去调用下游服务API时,为了能将token进行传递,可以使用RestTemplate.然后使用restTemplate进行调用Api。 注: scopes和authorities的区别: scopes是client权限,至少授予一个scope的权限,否则报错。 authorities是用户权限。 以上是我从网上找到的一篇写的不错的博客,希望可以帮助大家快速了解OAuth2.0,下一篇文章我们正式介绍OAuth2.0在当前框架中的使用。 java B2B2C 仿淘宝电子商城系统

优秀的个人博客,低调大师

java B2B2C 源码 多级分销Springboot多租户电子商城系统-springcloud项目redis分布式锁

在springcloud项目开发中redis分布式锁使用主要有两个场景 需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码请加企鹅求求 :二一四七七七五六三三 1.订单重复提交或支付提交等,防止刷单2.对某个业务进行锁定,例如:当用户同一时间,进行对账户充值和提现操作,那么这里需要根据用户ID对账户进行锁定,只有一个完成了才可以进行第二个。开发实现方式1.pom.xml中引入jar包,最好引入到基础模块中,其他模块通用 <!-- redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 创建redis操作类RedisGlobalLock(自定义)redis提供RedisTemplate方法redis提供三个方法:(1)lock 获取锁并锁定 本方法是立即获取锁状态,如果获取成功并锁定,如果获取失败(2)tryLock 尝试获取锁并锁定 本方式是在指定时间尝试获取锁(3)unlock 释放锁 当业务处理完毕必须释放锁重点:lock和tryLock区别:lock是实时获取,tryLock是尝试在一段时间内一直在获取 @Service public class RedisGlobalLock { private static Log log = LogFactory.getLog(RedisGlobalLock.class); private static final String TYPE_NAME = RedisGlobalLock.class.getTypeName(); /** 默认30ms尝试一次 */ private final static long LOCK_TRY_INTERVAL = 30L; /** 默认尝试20s */ private final static long LOCK_TRY_TIMEOUT = 20 * 1000L; /** 单个业务持有锁的时间30s,防止死锁 */ private final static long LOCK_EXPIRE = 30 * 1000L; @Autowired private RedisTemplate<String, Object> redisTemplate; /** * 获取锁 * @param key 锁Key * @return 是否获取锁 */ public boolean lock(String key) { return getLock(key, 0, LOCK_EXPIRE, TimeUnit.MILLISECONDS); } /** * 获取锁 * @param key 锁Key * @param expire 有效期 * @param expireUnit 有效期时间单位 * @return 是否获取锁 */ public boolean lock(String key, long expire, TimeUnit expireUnit) { return getLock(key, 0, expire, expireUnit); } /** * 尝试获取锁 * @param key 锁Key * @return 是否获取锁 */ public boolean tryLock(String key) { return tryLock(key, LOCK_TRY_TIMEOUT, TimeUnit.MILLISECONDS); } /** * 尝试获取锁 * @param key 锁Key * @param timeout 等待超时时间 * @param unit 等待超时时间单位 * @return 是否获取锁 */ public boolean tryLock(String key, long timeout, TimeUnit unit) { // 超时时间转成毫秒 timeout = TimeUnit.MILLISECONDS.convert(timeout, unit); return getLock(key,timeout, LOCK_EXPIRE, TimeUnit.MILLISECONDS); } /** * 尝试获取锁 * @param key 锁Key * @param timeout 等待超时时间 * @param timeoutUnit 等待超时时间单位 * @param expire 有效期 * @param expireUnit 有效期时间单位 * @return */ public boolean tryLock(String key, long timeout, TimeUnit timeoutUnit, long expire, TimeUnit expireUnit) { // 超时时间转成毫秒 timeout = TimeUnit.MILLISECONDS.convert(timeout, timeoutUnit); return getLock(key,timeout, expire, expireUnit); } /** * 释放锁 * @param key 锁Key */ public void unlock(String key) { key = getPrefix(TYPE_NAME) + key; Long oldExpireTime = (Long) redisTemplate.opsForValue().get(key); if(null != oldExpireTime && oldExpireTime >= System.currentTimeMillis()) { // 大于过期时间,则删除key redisTemplate.delete(key); } } /** * 获取锁 * @param key 锁键值 * @param timeout 超时时间 * @param time 全局锁生命周期 * @param unit 时间单位 * @return 是否获取到锁 */ private boolean getLock(String key, long timeout, long time, TimeUnit unit) { key = getPrefix(TYPE_NAME) + key; try { long startTimeMillis = System.currentTimeMillis(); do { long newValue = System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(time, unit); Boolean isOk = redisTemplate.opsForValue().setIfAbsent(key, newValue); if(isOk) { // 获得锁 redisTemplate.expire(key, time, unit); return true; } // 获取过期时间 Long oldExpireTime = (Long) redisTemplate.opsForValue().get(key); if(null == oldExpireTime) { oldExpireTime = 0L; } if(oldExpireTime >= System.currentTimeMillis()) { // 不小于系统时间并且过了超时时间,则不获取锁 if((System.currentTimeMillis() - startTimeMillis) > timeout) { return false; } // 休眠 Thread.sleep(LOCK_TRY_INTERVAL); } // 新的过期时间 long newExpireTime = System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(time, unit); Long currentExpireTime = (Long) redisTemplate.opsForValue().getAndSet(key, newExpireTime); if(null == currentExpireTime) { currentExpireTime = 0L; } if(currentExpireTime.equals(oldExpireTime)) { // 获取到锁 redisTemplate.expire(key, time, unit); return true; } } while (true); } catch (Exception e) { return false; } } /** * 获取缓存标识前缀 * @param typeName 类名 * @return 前缀 */ protected final String getPrefix(String typeName) { return typeName; } } 在业务逻辑层引入redis操作类 @Resource private RedisGlobalLock redisGlobalLock; // 1、获取分布式锁防止重复调用 ===================================================== String key = PayDistributePrefix.PAY_MEMBER_ACCOUNT + memberId; if(redisGlobalLock.lock(key)) { try{ System.out.println("--处理业务---"); }catch (Exception e){ throw e; }finally { // 4、释放分布式锁 ================================================================ redisGlobalLock.unlock(key); } }else{ // 如果没有获取锁 Ensure.that(true).isTrue("17000706"); } 所有锁业务必须释放锁,防止死锁 Java B2B2C多用户商城 springcloud架构

优秀的个人博客,低调大师

SpringCloud+SpringBoot b2b2c 分布式微服务商城电商之手机端首页模块设计分析

近期我参与了公司电子商务平台中“首页”模块设计, 电商平台首页功能大概分为几个区域,如下: 一、导航区域: 左上角定位入口 搜索功能入口 消息通知入口 商品分类入口 二、广告区域: Banner滚动广告,通过后台发布,可以连接:商品、外部H5连接、店铺、开店、其他活动等 三、二级频道模块区域: 平台设置了:特惠商品区、品质生活、9块9、校园专区、套餐体验、一县一特、生活神器、健康养生、女神诱惑、海哇吃货、萌娃专区、水果摊、服饰服装、酒店行业、海哇品茶、大清仓、便宜好货、旅游。 功能截图如下: 四、短视频、直播带货、VR全景、精选等区域: 短视频带货区域:平台提供短视频带货模式,创作者发布视频并从平台选择需要代理的商品,消费者浏览视频并消费后带给商家流量,创作者获取分润分成 VR全景区:通过定位,平台将本地城市附近入驻的商家以VR全景模式展示给用户,提供用户线上体验并消费 精选区:平台将优质商品推荐到精选区域供用户选择消费 直播带货区:用户开通直播服务后,平台提供直播带货模式,主播进行直播并从平台选择需要代理的商品,通过浏览视频带给商家流量,主播将获取利润分成 功能截图如下: 平台、技术、架构、设计思想 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号商城、小程序商城、APP端(IOS/Android)、微服务平台(业务服务)、系统服务(SpringCloud相关:Eureka、Config、Gateway) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis、RabbitMQ、 3. 前端框架 VUE、Uniapp、Bootstrap/H5/CSS3、IOS、Android、小程序 4. 核心思想 分布式、微服务、云架构、模块化、原子化、热插拔 5. 开发模式 前后端分离、微服务开发、持续集成、集群部署、前后端分离、支持阿里Docker 以上是我的一点总结,希望能够帮助到更多的朋友了解分布式微服务电子商务平台首页模块设计! 看完如果对你有帮助,感谢点赞支持!

优秀的个人博客,低调大师

SpringCloud+SpringBoot b2b2c 分布式微服务商城电商之直播带货模块设计分析

近期我参与了公司电子商务平台中“海播”模块设计,其中包括直播、短视频带货两个模块,下面介绍一下直播带货模块: 业务流程如下 第一步:商家以“商家入驻”模式入驻电子商务平台后,对自己的店铺进行装修、发布商品等操作(具体会在后面商家详情里面进行讲解)。 第二步:商家对商品设置分销,商家在发布商品的时候,设置商品分销比例,如:一个杯子标价为120元,其中拿出20元进行分销设计,其中14元钱设置为一级分销,剩下的6元钱设置为二级分销。 第三步:如果用户在平台上进行直播带货,首先要开通直播服务,如:上传真实资料,购买主播服务(不是所有人都可以进行免费直播)。 第四步:主播提交资料后,后台进行严格审核后方可直播。 第五步: 成为主播后,主播可以打开主播端,可直接进行直播,如:创建直播间、分享直播间、创建预播、可以去平台选择自己要带的货(商品),数据统计等。 平台、技术、架构、设计思想 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号商城、小程序商城、APP端(IOS/Android)、微服务平台(业务服务)、系统服务(SpringCloud相关:Eureka、Config、Gateway) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis、RabbitMQ、 3. 前端框架 VUE、Uniapp、Bootstrap/H5/CSS3、IOS、Android、小程序 4. 核心思想 分布式、微服务、云架构、模块化、原子化、热插拔 5. 开发模式 前后端分离、微服务开发、持续集成、集群部署、前后端分离、支持阿里Docker 创建直播间介绍 进入主播端,点击“创建直播”,进入创建直播界面,添加直播间封面、直播标题、添加宝贝(商品),如下图: 前端直播列表(C端观看) 后台管理截图 以上是我的一点总结,希望能够帮助到更多的朋友了解分布式微服务电子商务平台直播带货设计! 看完如果对你有帮助,感谢点赞支持!

优秀的个人博客,低调大师

SpringCloud+SpringBoot b2b2c 分布式微服务商城电商之短视频带货模块设计分析

近期我参与了公司电子商务平台中“海播”模块设计,其中包括直播、短视频带货两个模块,下面介绍一下短视频带货模块: 业务模式如下 商家以“商家入驻”模式入驻电子商务平台后,对自己的店铺进行装修、发布商品等操作(具体会在后面商家详情里面进行讲解) 商家在发布商品的时候,设置商品分销比例,如:一个杯子标价为120元,其中拿出20元进行分销设计,其中14元钱设置为一级分销,剩下的6元钱设置为二级分销 通过短视频带货的普通用户,可以去平台选择自己要带的货(商品),通过商家设置的分销模式进行赚钱。 普通用户可以进行短视频带货(具体短视频的发布等操作后面会详细介绍到) 平台、技术、架构、设计思想 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号商城、小程序商城、APP端(IOS/Android)、微服务平台(业务服务)、系统服务(SpringCloud相关:Eureka、Config、Gateway) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis、RabbitMQ、 3. 前端框架 VUE、Uniapp、Bootstrap/H5/CSS3、IOS、Android、小程序 4. 核心思想 分布式、微服务、云架构、模块化、原子化、热插拔 5. 开发模式 前后端分离、微服务开发、持续集成、集群部署、前后端分离、支持阿里Docker 后端功能截图 消费端功能截图 以上是我的一点总结,希望能够帮助到更多的朋友了解分布式微服务电子商务平台短视频带货设计! 看完如果对你有帮助,感谢点赞支持!

优秀的个人博客,低调大师

🔥 无耳 Solon AI v3.1.2 发布(兼容 Java 8 ~ 24),支持 SpringBoot2,jFinal,Vert.X 等第三方框架

Solon AI Solon AI ,是一套大语言模型的 Java 通用开发工具包(是Solon的二级项目)。特点: 一套接口支持不同提供者、不同大模型调用(通过方言适配) 支持 Function Call 支持 RAG 支持 AI-Flow(与Solon Flow配合) 支持同步接口与流式接口 支持会话记忆 支持聊天生成模型(ChatModel) 、图片生成模型(ImageModel) 、多态模型等 支持嵌入模型(EmbeddingModel) 、排序模型(RankingModel) 支持 Java 8 到 Java 24 支持 Spring、jFinal、Vert.x 等 Solon 以外的框架 等......更多内容,参考官网介绍 通过 Hello world 了解下: 添加应用配置 solon.ai.chat: demo: apiUrl: "http://127.0.0.1:11434/api/chat" # 使用完整地址(而不是 api_base) provider: "ollama" # 使用 ollama 服务时,需要配置 provider model: "llama3.2" # 或 deepseek-r1:7b 效果测试 @Configuration public class DemoConfig { @Bean public ChatModel build(@Inject("${solon.ai.chat.demo}") ChatConfig config) { return ChatModel.of(config).build(); } @Bean public void test(ChatModel chatModel) throws IOException { //一次性返回 ChatResponse resp = chatModel.prompt("hello").call(); //打印消息 System.out.println(resp.getMessage()); } } 最近更新了什么? 新增 solon-ai-repo-chroma 插件 优化 solon-ai-repo-tcvectordb 插件相似度处理 优化 solon-ai-repo-elasticsearch 插件相似度处理 项目仓库地址? gitee:https://gitee.com/opensolon/solon-ai gitcode:https://gitcode.com/opensolon/solon-ai github:https://github.com/opensolon/solon-ai 官网? https://solon.noear.org/article/learn-solon-ai

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册