hello各位小伙伴,今天我们来继续学习如何通过SpringBoot开发微信公众号。还没阅读过上篇文章的小伙伴建议先看看上文,有助于理解本文:SpringBoot开发微信公众号后台上篇文章中我们将微信服务器和我们自己的服务器对接起来了,并且在自己的服务器上也能收到微信服务器发来的消息,本文我们要看的就是如何给微信服务器回复消息。消息分类在讨论如何给微信服务器回复消息之前,我们需要先来了解下微信服务器发来的消息主要有哪些类型以及我们回复给微信的消息都有哪些类型。在上文中大家了解到,微信发送来的xml消息中有一个MsgType字段,这个字段就是用来标记消息的类型。这个类型可以标记出这条消息是普通消
Hello各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用SpringBoot开发微信公众号后台。很多小伙伴可能注意到松哥的个人网站(http://www.javaboy.org)前一阵子上线了一个公众号内回复口令解锁网站文章的功能,还有之前就有的公众号内回复口令获取超2TB免费视频教程的功能(免费视频教程),这两个都是松哥基于SpringBoot来做的,最近松哥打算通过一个系列的文章,来向小伙伴们介绍下如何通过SpringBoot来开发公众号后台。1.缘起今年5月份的时候,我想把我自己之前收集到的一些视频教程分享给公众号上的小伙伴,可是这些视频教程大太了,无法一次分享,单次分享分享链
邮件发送其实是一个非常常见的需求,用户注册,找回密码等地方,都会用到,使用JavaSE代码发送邮件,步骤还是挺繁琐的,SpringBoot中对于邮件发送,提供了相关的自动化配置类,使得邮件发送变得非常容易,本文我们就来一探究竟!看看使用SpringBoot发送邮件的5中姿势。邮件基础我们经常会听到各种各样的邮件协议,比如SMTP、POP3、IMAP,那么这些协议有什么作用,有什么区别?我们先来讨论一下这个问题。SMTP是一个基于TCP/IP的应用层协议,江湖地位有点类似于HTTP,SMTP服务器默认监听的端口号为25。看到这里,小伙伴们可能会想到既然SMTP协议是基于TCP/IP的应用层协议,
之前松哥和大家分享过一篇将SpringBoot项目部署到远程Docker上的文章:一键部署SpringBoot到远程Docker容器但是这种部署有一个问题,就是一个小小的helloworld构建成镜像之后,竟然都有660MB+,这就有点过分了;而且这种方式步骤繁琐,很多人看了头大。因此松哥今天想再和大家聊一聊另外一种方案Jib,这是谷歌开源的一个容器化运行方案,使用它我们将SpringBoot进行容器化部署只要两步:第一步配置MavenPlugin第二步构建我们一起来看看。Jib在之前那篇文章中,我们将SpringBoot项目进行容器化部署,要求开发人员要有一定的Docker技能作为支撑,然而
不知道各位小伙伴在生产环境都是怎么部署SpringBoot的,打成jar直接一键运行?打成war扔到Tomcat容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案。不同于传统的单体应用,微服务由于服务数量众多,在部署的时候出问题的可能性更大,这个时候,结合Docker来部署,就可以很好的解决这个问题,这也是目前使用较多的方案之一。将SpringBoot项目打包到Docker容器中部署,有很多不同的方法,今天松哥主要来和大家聊一聊如何将SpringBoot项目一键打包到远程Docker容器,然后通过运行一个镜像的方式来启动一个SpringBoot项目。至于其他的SpringBoot结合D
前两天被人问到这样一个问题:“松哥,为什么我的SpringBoot项目打包成的jar,被其他项目依赖之后,总是报找不到类的错误?”大伙有这样的疑问,就是因为还没搞清楚可执行jar和普通jar到底有什么区别?今天松哥就和大家来聊一聊这个问题。多了一个插件SpringBoot中默认打包成的jar叫做可执行jar,这种jar不同于普通的jar,普通的jar不可以通过java-jarxxx.jar命令执行,普通的jar主要是被其他应用依赖,SpringBoot打成的jar可以执行,但是不可以被其他的应用所依赖,即使强制依赖,也无法获取里边的类。但是可执行jar并不是SpringBoot独有的,Java
回顾热部署SpringBoot中的热部署相信大家都用过吧,只需要添加spring-boot-devtools依赖就可以轻松实现热部署。SpringBoot中热部署最最关键的原理就是两个不同的classloader:baseclassloaderrestartclassloader其中baseclassloader用来加载那些不会变化的类,例如各种第三方依赖,而restartclassloader则用来加载那些会发生变化的类,例如你自己写的代码。SpringBoot中热部署的原理就是当代码发生变化时,baseclassloader不变,而restartclassloader则会被废弃,被另一个新
hello各位小伙伴,国庆节终于过完啦,松哥也回来啦,今天开始咱们继续发干货!关于SpringSecurity,松哥之前发过多篇文章和大家聊聊这个安全框架的使用:手把手带你入门SpringSecurity!SpringSecurity登录添加验证码SpringSecurity登录使用JSON格式数据SpringSecurity中的角色继承问题SpringSecurity中使用JWT!SpringSecurity结合OAuth2不过,今天要和小伙伴们聊一聊SpringSecurity中的另外一个问题,那就是在SpringSecurity中未获认证的请求默认会重定向到登录页,但是在前后端分离的登录
在前后端分离的项目中,登录策略也有不少,不过JWT算是目前比较流行的一种解决方案了,本文就和大家来分享一下如何将SpringSecurity和JWT结合在一起使用,进而实现前后端分离时的登录解决方案。1无状态登录1.1什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如Tomcat中的Session。例如登录:用户登录后,我们把用户的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session,然后下次请求,用户携带cookie值来(这一步有浏览器自动完成),我们就能识别到对应session,从
今天想和小伙伴们来聊一聊SpringSecurity中的角色继承问题。角色继承实际上是一个很常见的需求,因为大部分公司治理可能都是金字塔形的,上司可能具备下属的部分甚至所有权限,这一现实场景,反映到我们的代码中,就是角色继承了。SpringSecurity中为开发者提供了相关的角色继承解决方案,但是这一解决方案在最近的SpringSecurity版本变迁中,使用方法有所变化。今天除了和小伙伴们分享角色继承外,也来顺便说说这种变化,避免小伙伴们踩坑,同时购买了我的书的小伙伴也需要留意,书是基于SpringBoot2.0.4这个版本写的,这个话题和最新版SpringBoot的还是有一点差别。版本分
在使用SpringSecurity中,大伙都知道默认的登录数据是通过key/value的形式来传递的,默认情况下不支持JSON格式的登录数据,如果有这种需求,就需要自己来解决,本文主要和小伙伴来聊聊这个话题。基本登录方案在说如何使用JSON登录之前,我们还是先来看看基本的登录吧,本文为了简单,SpringSecurity在使用中就不连接数据库了,直接在内存中配置用户名和密码,具体操作步骤如下:创建SpringBoot工程首先创建SpringBoot工程,添加SpringSecurity依赖,如下:<dependency><groupId>org.springframew
登录添加验证码是一个非常常见的需求,网上也有非常成熟的解决方案,其实,要是自己自定义登录实现这个并不难,但是如果需要在SpringSecurity框架中实现这个功能,还得稍费一点功夫,本文就和小伙伴来分享下在SpringSecurity框架中如何添加验证码。关于SpringSecurity基本配置,这里就不再多说,小伙伴有不懂的可以参考我的书《SpringBoot+Vue全栈开发实战》,本文主要来看如何加入验证码功能。准备验证码要有验证码,首先得先准备好验证码,本文采用Java自画的验证码,代码如下:/***生成验证码的工具类*/publicclassVerifyCode{privateint
SpringSecurity是Spring家族中的一个安全管理框架,实际上,在SpringBoot出现之前,SpringSecurity就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是Shiro的天下。相对于Shiro,在SSM/SSH中整合SpringSecurity都是比较麻烦的操作,所以,SpringSecurity虽然功能比Shiro强大,但是使用反而没有Shiro多(Shiro虽然功能没有SpringSecurity多,但是对于大部分项目而言,Shiro也够用了)。自从有了SpringBoot之后,SpringBoot对于SpringSecurity提供了自动化配置方案
在SpringBoot中做权限管理,一般来说,主流的方案是SpringSecurity,但是,仅仅从技术角度来说,也可以使用Shiro。今天松哥就来和大家聊聊SpringBoot整合Shiro的话题!一般来说,SpringSecurity和Shiro的比较如下:SpringSecurity是一个重量级的安全管理框架;Shiro则是一个轻量级的安全管理框架SpringSecurity概念复杂,配置繁琐;Shiro概念简单、配置简单SpringSecurity功能强大;Shiro功能简单…虽然Shiro功能简单,但是也能满足大部分的业务场景。所以在传统的SSM项目中,一般来说,可以整合Shiro。
RESTful,到现在相信已经没人不知道这个东西了吧!关于RESTful的概念,我这里就不做过多介绍了,传统的Struts对RESTful支持不够友好,但是SpringMVC对于RESTful提供了很好的支持,常见的相关注解有:@RestController@GetMapping@PutMapping@PostMapping@DeleteMapping@ResponseBody...这些注解都是和RESTful相关的,在移动互联网中,RESTful得到了非常广泛的使用。RESTful这个概念提出来很早,但是以前没有移动互联网时,我们做的大部分应用都是前后端不分的,在这种架构的应用中,数据基本上
用惯了Redis,很多人已经忘记了还有另一个缓存方案Ehcache,是的,在Redis一统江湖的时代,Ehcache渐渐有点没落了,不过,我们还是有必要了解下Ehcache,在有的场景下,我们还是会用到Ehcache。今天松哥就来和大家聊聊SpringBoot中使用Ehcache的情况。相信看完本文,大家对于[SpringBoot操作Redis,三种方案全解析!]一文中的第二种方案会有更加深刻的理解。Ehcache也是Java领域比较优秀的缓存方案之一,Ehcache这个缓存的名字很有意思,正着念反着念,都是Ehcache,SpringBoot中对此也提供了很好的支持,这个支持主要是通过Spr
经过SpringBoot的整合封装与自动化配置,在SpringBoot中整合Redis已经变得非常容易了,开发者只需要引入SpringDataRedis依赖,然后简单配下redis的基本信息,系统就会提供一个RedisTemplate供开发者使用,但是今天松哥想和大伙聊的不是这种用法,而是结合Cache的用法。Spring3.1中开始引入了令人激动的Cache,在SpringBoot中,可以非常方便的使用Redis来作为Cache的实现,进而实现数据的缓存。工程创建首先创建一个SpringBoot工程,注意创建的时候需要引入三个依赖,web、cache以及redis,如下图:对应的依赖内容如下
有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道松哥说的是对的了!在传统的单服务架构中,一般来说,只有一个服务器,那么不存在Session共享问题,但是在分布式/集群项目中,Session共享则是一个必须面对的问题,先看一个简单的架构图:在这样的架构中,会出现一些单服务中不存在的问题,例如客户端发起一个请求,这个请求到达Nginx上之后,被Nginx转发到TomcatA上,然后在TomcatA上往session中保存了一份数据,下次又来一个请求,这个请求被转发到TomcatB上,此时再去Session中获取数据,发现没有之前的数据。对于这一类问题的解决
在Redis出现之前,我们的缓存框架各种各样,有了Redis,缓存方案基本上都统一了,关于Redis,松哥之前有一个系列教程,尚不了解Redis的小伙伴可以参考这个教程:Redis教程合集使用Java操作Redis的方案很多,Jedis是目前较为流行的一种方案,除了Jedis,还有很多其他解决方案,如下:除了这些方案之外,还有一个使用也相当多的方案,就是SpringDataRedis。在传统的SSM中,需要开发者自己来配置SpringDataRedis,这个配置比较繁琐,主要配置3个东西:连接池、连接器信息以及key和value的序列化方案。在SpringBoot中,默认集成的Redis就是S
本文是SpringBoot整合数据持久化方案的最后一篇,主要和大伙来聊聊SpringBoot整合Jpa多数据源问题。在SpringBoot整合JbdcTemplate多数据源、SpringBoot整合MyBatis多数据源以及SpringBoot整合Jpa多数据源这三个知识点中,整合Jpa多数据源算是最复杂的一种,也是很多人在配置时最容易出错的一种。本文大伙就跟着松哥的教程,一步一步整合Jpa多数据源。工程创建首先是创建一个SpringBoot工程,创建时添加基本的Web、Jpa以及MySQL依赖,如下:创建完成后,添加Druid依赖,这里和前文的要求一样,要使用专为SpringBoot打造的
SpringBoot中的数据持久化方案前面给大伙介绍了两种了,一个是JdbcTemplate,还有一个MyBatis,JdbcTemplate配置简单,使用也简单,但是功能也非常有限,MyBatis则比较灵活,功能也很强大,据我所知,公司采用MyBatis做数据持久化的相当多,但是MyBatis并不是唯一的解决方案,除了MyBatis之外,还有另外一个东西,那就是Jpa,松哥也有一些朋友在公司里使用Jpa来做数据持久化,本文就和大伙来说说Jpa如何实现数据持久化。Jpa介绍首先需要向大伙介绍一下Jpa,Jpa(JavaPersistenceAPI)Java持久化API,它是一套ORM规范,而不
有很多读者留言希望松哥能好好聊聊SpringDataJpa!其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊SpringData和Jpa!故事的主角Jpa1.JPA是什么JavaPersistenceAPI:用于对象持久化的APIJavaEE5.0平台标准的ORM规范,使得应用程序以统一的方式访问持久层2.JPA和Hibernate的关系JPA是Hibernate的一个抽象(就像JDBC和JDBC驱动的关系);JPA是规范:JPA本质上就是一种ORM规范,不是ORM框架,这是因为JPA并未提供ORM实现,它只是制订了一些规范,
关于多数据源的配置,前面和大伙介绍过JdbcTemplate多数据源配置,那个比较简单,本文来和大伙说说MyBatis多数据源的配置。其实关于多数据源,我的态度还是和之前一样,复杂的就直接上分布式数据库中间件,简单的再考虑多数据源。这是项目中的建议,技术上的话,当然还是各种技术都要掌握的。工程创建首先需要创建MyBatis项目,项目创建和前文的一样,添加MyBatis、MySQL以及Web依赖:项目创建完成后,添加Druid依赖,和JdbcTemplate一样,这里添加Druid依赖也必须是专为Springboot打造的Druid,不能使用传统的Druid。完整的依赖如下:<depend
前面两篇文章和读者聊了SpringBoot中最简单的数据持久化方案JdbcTemplate,JdbcTemplate虽然简单,但是用的并不多,因为它没有MyBatis方便,在Spring+SpringMVC中整合MyBatis步骤还是有点复杂的,要配置多个Bean,SpringBoot中对此做了进一步的简化,使MyBatis基本上可以做到开箱即用,本文就来看看在SpringBoot中MyBatis要如何使用。工程创建首先创建一个基本的SpringBoot工程,添加Web依赖,MyBatis依赖以及MySQL驱动依赖,如下:创建成功后,添加Druid依赖,并且锁定MySQL驱动版本,完整的依赖如
多数据源配置也算是一个常见的开发需求,Spring和SpringBoot中,对此都有相应的解决方案,不过一般来说,如果有多数据源的需求,我还是建议首选分布式数据库中间件MyCat去解决相关问题,之前有小伙伴在我的知识星球上提问,他的数据根据条件的不同,可能保存在四十多个不同的数据库中,怎么办?这种场景下使用多数据源其实就有些费事了,我给的建议是使用MyCat,然后分表策略使用sharding-by-intfile。当然如果一些简单的需求,还是可以使用多数据源的,SpringBoot中,JdbcTemplate、MyBatis以及Jpa都可以配置多数据源,本文就先和大伙聊一聊JdbcTempla
在Java领域,数据持久化有几个常见的方案,有Spring自带的JdbcTemplate、有MyBatis,还有JPA,在这些方案中,最简单的就是Spring自带的JdbcTemplate了,这个东西虽然没有MyBatis那么方便,但是比起最开始的Jdbc已经强了很多了,它没有MyBatis功能那么强大,当然也意味着它的使用比较简单,事实上,JdbcTemplate算是最简单的数据持久化方案了,本文就和大伙来说说这个东西的使用。基本配置JdbcTemplate基本用法实际上很简单,开发者在创建一个SpringBoot项目时,除了选择基本的Web依赖,再记得选上Jdbc依赖,以及数据库驱动依赖即
用过SpringBoot的小伙伴都知道,我们只需要在项目中引入spring-boot-starter-web依赖,SpringMVC的一整套东西就会自动给我们配置好,但是,真实的项目环境比较复杂,系统自带的配置不一定满足我们的需求,往往我们还需要结合实际情况自定义配置。自定义配置就有讲究了,由于SpringBoot的版本变迁,加上这一块本身就有几个不同写法,很多小伙伴在这里容易搞混,今天松哥就来和大家说一说这个问题。概览首先我们需要明确,跟自定义SpringMVC相关的类和注解主要有如下四个:WebMvcConfigurerAdapterWebMvcConfigurerWebMvcConfig
前后端分离后,维护接口文档基本上是必不可少的工作。一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了。当然这是一种非常理想的状态,实际开发中却很少遇到这样的情况,接口总是在不断的变化之中,有变化就要去维护,做过的小伙伴都知道这件事有多么头大!还好,有一些工具可以减轻我们的工作量,Swagger2就是其中之一,至于其他类似功能但是却收费的软件,这里就不做过多介绍了。本文主要和大伙来聊下在SpringBoot中如何整合Swagger2。工程创建当然,首先是创建一个SpringBoot项目,加入web依赖,创建成功后,加入两个Swagger2相
在Spring+SpringMVC环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用Spring自带的定时任务处理器@Scheduled注解,另一种就是使用第三方框架Quartz,SpringBoot源自Spring+SpringMVC,因此天然具备这两个Spring中的定时任务实现策略,当然也支持Quartz,本文我们就来看下SpringBoot中两种定时任务的实现方式。@Scheduled使用@Scheduled非常容易,直接创建一个SpringBoot项目,并且添加web依赖spring-boot-starter-web,项目创建成功后,添加@EnableScheduling注
在Servlet/Jsp项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web基础中的三大组件(Servlet、Filter、Listener)之一Listener,这种情况下,一般定义一个ServletContextListener,然后就可以监听到项目启动和销毁,进而做出相应的数据初始化和销毁操作,例如下面这样:publicclassMyListenerimplementsServletContextListener{@OverridepublicvoidcontextInitialized(