Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Blog接入腾讯云短信

Blog接入腾讯云短信

作者头像
姜同学
发布于 2022-10-27 09:00:10
发布于 2022-10-27 09:00:10
8.6K00
代码可运行
举报
文章被收录于专栏:姜同学姜同学
运行总次数:0
代码可运行

这个网站搭建也快有两年了,这两年虽然没有什么产出,但是经过两年的积累也算是收益颇丰。因为一开始只是打算用来做一些笔记,并没有考虑网站本身的交互性,评论几乎都是置之不理,前几天突然心血来潮查了一下评论表,居然收获了上百条的评论,然而这些评论中的绝大多数我都是第一次见,其中不乏一些加油以及对知识点提出疑问的评论,我要在这里向留下评论的你们表示感谢。但是光是感谢是不够的,我要提高网站的交互性,对于这些评论我要第一时间知道,如何第一时间知道?想必脑海中冒出来的第一个念头就是短信了吧,打开腾讯云搜索短信,我又打开了一片新世界。

腾讯云短信平台

短信签名和短信模板被驳回了2次。。。我也是醉了,不过结果还好审核通过了,并发现了一个小惊喜,腾讯云个人认证账户每个月可以白嫖100条的免费短信,very good.点开开发者指南去学习如何引入SDK发短信就好啦,中文的文档不会还有人看不懂吧,不会吧不会吧。。

引入SDK 腾讯云短信接入文档 我把文档看完了,在这里做个小总结,首先你需要把SDK的依赖引入到工程的POM中,想要发短信的话还需要实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey: 还需要实例化一个发短信的客户端:

最后还需要将短信的详细信息封装到一个对象中

最后使用短信客户端把短信的详细信息发送出去就好了吧,就这样**client.SendSms(req)**嗖的一下就发出去了。

引入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- https://mvnrepository.com/artifact/com.tencentcloudapi/tencentcloud-sdk-java -->
<dependency>
	<groupId>com.tencentcloudapi</groupId>
	<artifactId>tencentcloud-sdk-java</artifactId>
	<version>4.0.11</version>
</dependency>

创建对象

emm,认证对象只要传入两个固定的参数就好啦非常ESAY,所以就把他交给Spring管理就好啦,这个客户端对象一个系统也有一个就可以啦,那就单例模式搞一个,emm~~短信对象创建起来有点复杂,而且要根据不同的评论进行定制,所以工厂模式安排!

注入IOC容器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.jmy.config;

import com.jmy.factory.SmsClientBeanFactory;
import com.jmy.util.SmsUtils;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SmsConfig {

    @Bean
    public Credential credential(){
        return new Credential(SmsUtils.SECRETID, SmsUtils.SECRETKEY);
    }

    @Bean
    public SmsClient smsClient(Credential credential){
        return SmsClientBeanFactory.getSmsClientInstance(credential);
    }

}

单例模式创建SmsClient
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.jmy.config;

import com.jmy.factory.SmsClientBeanFactory;
import com.jmy.util.SmsUtils;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SmsConfig {

    @Bean
    public Credential credential(){
        return new Credential(SmsUtils.SECRETID, SmsUtils.SECRETKEY);
    }

    @Bean
    public SmsClient smsClient(Credential credential){
        return SmsClientBeanFactory.getSmsClientInstance(credential);
    }

}
工厂模式创建SendSmsRequestBeanFactory
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.jmy.factory;

import com.jmy.util.SmsUtils;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;

public class SendSmsRequestBeanFactory{

    public static SendSmsRequest getInstance() {
        SendSmsRequest req = new SendSmsRequest();
        req.setSmsSdkAppid(SmsUtils.APPID);
        req.setSign(SmsUtils.SIGN);
        req.setSenderId(SmsUtils.SENDERID);
        req.setTemplateID(SmsUtils.TEMPLATEID);
        req.setPhoneNumberSet(SmsUtils.PHONENUMBERS);
        return req;
    }
}

编写切面接入短信功能

评论发送短信通知博主,这功能一听就是与评论业务无关只是对评论功能单纯的一个增强,这不正是面向切面编程的意义所在吗?心动不如行动,还在有犹豫什么呢,快去编写发送短信的切面吧。

后置通知发送短信

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Created by jmy on 2021/4/29.
 */

@Aspect
@Component
public class SmsAspect {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private SmsClient smsClient;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Pointcut("@annotation(com.jmy.aspect.SendMessage)")
    public void sendMessage(){}

    @After("sendMessage()")
    public void doAfter(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        Comment comment = (Comment) args[];

        // 发送短信
        SendSmsRequest req = SendSmsRequestBeanFactory.getInstance();
        /* 模板参数: 若无模板参数,则设置为空*/
        String title = comment.getBlog().getTitle();
        String[] templateParams = {title.length() >  ? title.substring(,):title};
        req.setTemplateParamSet(templateParams);
        HttpServletRequest request = RepeatCommentInterceptor.threadLocal.get();
        String tll = RepeatCommentInterceptor.TLL.get();
        String remoteAddr = request.getRemoteAddr();
        new Thread(() -> {
            try {
                String boo = redisTemplate.opsForValue().get("comment:ip:" + remoteAddr);
                if (!StringUtils.isEmpty(boo) && tll.equals(boo)) {
                    smsClient.SendSms(req);
                }
            } catch (TencentCloudSDKException e) {
                logger.error(e.getMessage());
            }
        }).start();

    }
}

切面写好了怎么通知到我们的评论功能呢?当然是按照我们编写好的切入规则@Pointcut(“@annotation(com.jmy.aspect.SendMessage)”),在评论的方法上加上我们自定义的SendMessage注解就好啦。

不讲武德,耗子尾汁

短信通知的功能倒是实现啦,但是我眉头一紧突然意识到一个严重的问题,如果有不讲武德的小伙子刷评论我这白嫖的100条短信不是很快就没了吗,所以要小小的改造一下加个拦截器将请求的IP地址放到Redis中保存一小段时间用来校验是否刷评论就可以了,如何在拦截器中注入Spring管理的对象以及如何在切面中如何使用Request对象,这些都是不可忽视的小细节哦.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Created by jmy on 2021/4/30.
 * 重复评论短信拦截器
 */

public class RepeatCommentInterceptor implements HandlerInterceptor {

    public static ThreadLocal<HttpServletRequest> threadLocal = new ThreadLocal<>();
    public static ThreadLocal<String> TLL = new ThreadLocal<>();
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        threadLocal.set(httpServletRequest);
        String remoteAddr = httpServletRequest.getRemoteAddr();
        String tll = UUID.randomUUID().toString();
        TLL.set(tll);
        redisTemplate.opsForValue().setIfAbsent("comment:ip:" + remoteAddr, tll);
        redisTemplate.expire("comment:ip:" + remoteAddr,,TimeUnit.MINUTES);
        return true;
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Created by jmy on 2021/4/30.
 */
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public RepeatCommentInterceptor repeatCommentInterceptor(){
        return new RepeatCommentInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/admin/**")
                .excludePathPatterns("/admin")
                .excludePathPatterns("/admin/login");

        registry.addInterceptor(repeatCommentInterceptor())
                .addPathPatterns("/comments");
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-06T,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文速通Nginx网关与gateway网关区分
网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。
一个风轻云淡
2023/10/25
6.8K0
构建高可用网关之容错实践
自从微服务概念以来,众多的软件架构在践行着这一优秀的设计理念。各自的系统在这一指导思想下收获了优雅的可维护性,但一方面也给接口调用提出了新的要求。比如众多的API调用急需一个统一的入口来支持客户端的调用。在这种情况下API GATEWAY诞生,我们将接入、路由、限流等功能统一由网关负责,各自的服务提供方专注于业务逻辑的实现,从而给客户端调用提供了一个稳健的服务调用环境。之后,我们在网关大调用量的情况下,还要保证网关的可降级、可限流、可隔离等等一系列容错能力。 一、网关 这里说的网关是指API网关,直面意思是
纯洁的微笑
2018/04/18
1.3K0
构建高可用网关之容错实践
Spring Cloud Gateway解析
Gateway( 网关),顾名思义,是出现在系统边界上的一个面向API或应用服务的、串行集中式的强管控服务,这里我们讨论的边界可以基于企业IT系统的边界,当然,可以理解为企业级应用防火墙,其目标主要起到隔离外部访问与内部系统交互的作用。在微服务概念的流行之前,网关就已经诞生了,在面向SOA体系中已经成熟,然而,随着微服务体系的快速发展,更进一步将Gateway推向更高的浪口。与其说网关催生了微服务体系,不如说微服务体系拥抱了网关。
Luga Lee
2021/12/09
8600
Spring Cloud Gateway解析
架构师如何选型分布式业务网关
在日常工作中,不同的场合下,我们可能都会听说网关的概念,当然通常是指业务网关(API网关),负责API的输入和输出。有了业务网关之后,各个API服务提供者可以专注于自己的业务逻辑处理,而API网关更专注于安全、流量、路由等问题。从功能层次我们又会联想到一个概念——代理。网关与代理的区别:代理本质是数据的透传,协议不会发生变化;网关在数据透传的背景下,还会涉及协议的转换,比如从HTTP到Dubbo。
35岁程序员那些事
2022/09/23
9040
架构师如何选型分布式业务网关
B站基于微服务的API网关从0到1的演进之路
如果你在 2015 年就使用 B 站,那么你一定不会忘记那一年 B 站工作日选择性崩溃,周末必然性崩溃的一段时间。
JackJiang
2022/06/14
1K0
B站基于微服务的API网关从0到1的演进之路
SpringCloud-Alibaba | 微服务架构介绍
微服务架构, 简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目。
码神联盟
2020/12/03
7590
SpringCloud-Alibaba |  微服务架构介绍
SpringCloud——微服务介绍+系统架构
* 全部功能集成在一个工程中,对于大型项目来讲不易开发和维护* 项目模块之间紧密耦合,单点容错率低* 无法针对不同模块进行针对性能优化和水平扩展
用户10196776
2022/11/22
1.1K0
SpringCloud——微服务介绍+系统架构
微服务网关系列:为什么需要API网关
微服务是指开发应用所用的一种架构形式。具体表现是将大型应用分解成多个独立的服务,以API形式对外提供服务。
AIOPS
2023/11/01
5030
初步了解SpringCloud微服务架构
针对上述问题,传统的单体结构已经不再适用于复杂度日益渐增的产品,因此一种新的软件架构提供了解决方案 —— 微服务 。
程序员Leo
2023/08/07
1.1K0
初步了解SpringCloud微服务架构
原创好文!亿级流量网关设计思路
本文准备围绕七个点来讲网关,分别是网关的基本概念、网关设计思路、网关设计重点、流量网关、业务网关、常见网关对比,对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分。
cxuan
2021/03/12
2.1K0
云原生环境下的API业务安全思考
针对单体架构的应用,安全防护往往在边界网关设备处。随着业务需求的不断变化以及技术的持续更新,企业应用开始从单体架构向微服务架构转变。不同应用模块可以根据业务规模进行动态扩缩容,与此同时,微服务应用也为API安全防护带来了新的挑战。
绿盟科技研究通讯
2021/11/17
1.1K0
云原生环境下的API业务安全思考
快速学习-微服务简介
随着互联网的发展,网站应用的规模也在不断的扩大,进而导致系统架构也在不断的进行变化。
cwl_java
2020/08/28
6640
快速学习-微服务简介
5款基于Java开发的开源API网关
在微服务架构中,API网关是一个必不可少的组件之一,下面推荐几款基于Java语言开发的高性能API网关。
openapplus
2020/10/30
6.2K0
微服务网关除了zuul、spring cloud gateway还有更出色的
在微服务架构中,由于系统和服务的细分,导致系统结构变得非常复杂, 为了跨平台,为了统一集中管理api,同时为了不暴露后置服务。甚至有时候需要对请求进行一些安全、负载均衡、限流、熔断、灰度等中间操作,基于此类种种的客观需求一个类似综合前置的系统就产生了,这就是API网关(API Gateway)。API网关作为分散在各个业务系统微服务的API聚合点和统一接入点,外部请求通过访问这个接入点,即可访问内部所有的REST API服务。目前常用的微服务网关有zuul、gateway,今天来简单介绍一下另一种选择——Kong 。说到Kong可能对大家有点陌生,我们来先了解下另一种不陌生的中间件——OpenResty。
码农小胖哥
2019/12/10
2K0
微服务网关除了zuul、spring cloud gateway还有更出色的
nginx和gateway什么关系_api网关和redis的关系
对于具体的后端业务应用或者是服务和业务有一定关联性的策略网关就是上图左边的架构模型——业务网关。 业务网关针对具体的业务需要提供特定的流控策略、缓存策略、鉴权认证策略等等。
全栈程序员站长
2022/11/07
1.7K0
nginx和gateway什么关系_api网关和redis的关系
普元EOS 8网关设计及应用
普元EOS 8 API Gateway作为一个独立模块,可以对API进行创建、发布、维护、监控等全生命周期管理。
yuanyi928
2019/03/07
1.2K0
gateway 鉴权_gateway网关集群
说起鉴权,大多数会立马想到各种鉴权的技术,比如过滤器、拦截器、安全治理框架shiro、spring-security等等,它们在不同的业务场景下发挥的作用各不相同,但是总体来说都有一个相似的作用,就是作为后端服务的安全防护层
全栈程序员站长
2022/11/10
1.4K0
【云原生应用安全】云原生应用安全防护思考(一)
应用是云原生体系中最贴近用户和业务价值的部分,笔者在之前《云原生应用安全风险思考》一文中分析了云原生应用面临的风险,相信各位读者已经有所了解,本文为云原生应用安全防护系列的第一篇,主要针对传统应用安全、API安全、云原生应用业务安全这三方面风险提出笔者的一些防护见解及思考。另外,文章篇幅较长,且内容上与前述风险篇相互对应,若结合在一起阅读,思路会更清晰些,希望本文可为各位读者带来更多思考。
绿盟科技研究通讯
2021/09/27
2K0
TSF微服务治理实战系列(四)——服务安全
导语 “道路千万条,安全第一条。治理不规范,老板两行泪”。 当企业从单体架构逐渐转向微服务架构时,服务安全的需求也随之分散到了整个微服务体系的各个部分中。这就需要构建一套配置活、成本低的安全防控体系,覆盖请求链路中的各个部分,满足用户的安全诉求。本章将从安全的视角介绍TSF相关的能力,包括服务和网关的鉴权机制、如何保证应用配置的安全、权限管理及事件审计等方面。 作者简介 崔凯 腾讯云 CSIG 微服务产品中心产品架构师 多年分布式、高并发电子商务系统的研发、系统架构设计经验,擅长主流微服务架构技术平台的
腾讯云中间件团队
2022/11/24
1.3K0
TSF微服务治理实战系列(四)——服务安全
云原生之微服务架构
傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波
山河已无恙
2023/01/30
9480
云原生之微服务架构
推荐阅读
相关推荐
一文速通Nginx网关与gateway网关区分
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验