在Web应用程序开发期间,经常需要发送电子邮件。

但是,有时数据库中会包含来自生产的数据,并且存在在电子邮件测试执行期间向真实客户发送电子邮件的风险。

这篇文章将解释如何避免在没有在发送电子邮件功能中明确编写代码的情况下避免这种情况。

我们将使用2种技术:

  1. Spring Profiles –一种指示运行环境是什么的机制(即开发,生产,..)
  2. AOP –简而言之,它是一种以解耦的方式在方法上编写附加逻辑的机制。

我假设您已经在项目中设置了Profiles,并专注于Aspect方面。

在该示例中,发送电子邮件的类是EmailSender,其发送方法如下所示:

public class EmailSender {
//empty default constructor is a must due to AOP limitation
public EmailSender() {}//Sending email function
//EmailEntity - object which contains all data required for email sending (from, to, subject,..)
public void send(EmailEntity emailEntity) {
//logic to send email
}
}

现在,我们将添加防止在未在代码上运行代码的客户发送电子邮件的逻辑。
为此,我们将使用Aspects,因此我们不必在send方法中编写它,从而可以保持关注点分离的原则。

创建一个包含过滤方法的类:

@Aspect
@Component
public class EmailFilterAspect {public EmailFilterAspect() {}
}

然后创建一个PointCut来捕获send方法的执行:

@Pointcut("execution(public void com.mycompany.util.EmailSender.send(..))")public void sendEmail(){}

由于我们需要控制是否应执行该方法,因此需要使用Arround批注。

@Around("sendEmail()")
public void emailFilterAdvice(ProceedingJoinPoint proceedingJoinPoint){try {proceedingJoinPoint.proceed(); //The send email method execution} catch (Throwable e) {                           e.printStackTrace();}
}

最后一点,我们需要访问send方法的输入参数(即获取EmailEntity)并确认我们没有在开发中向客户发送电子邮件。

@Around("sendEmail()")public void emailFilterAdvice(ProceedingJoinPoint proceedingJoinPoint){//Get current profile
ProfileEnum profile = ApplicationContextProvider.getActiveProfile();Object[] args = proceedingJoinPoint.getArgs();        //get input parametersif (profile != ProfileEnum.PRODUCTION){//verify only internal mails are allowedfor (Object object : args) {if (object instanceof EmailEntity){String to = ((EmailEntity)object).getTo();if (to!=null && to.endsWith("@mycompany.com")){//If not internal mail - Dont' continue the method                        try {proceedingJoinPoint.proceed();} catch (Throwable e) {e.printStackTrace();}}}}}else{//In production don't restrict emailstry {proceedingJoinPoint.proceed();} catch (Throwable e) {e.printStackTrace();}}
}

而已。
关于配置,您需要在项目中包括纵横图罐。
在Maven中,它看起来像这样:

org.aspectjaspectjrt${org.aspectj.version}org.aspectjaspectjweaver${org.aspectj.version}runtime

在您的spring应用程序配置xml文件中,您需要具有以下内容:

祝好运!

参考:来自Gal Levinsky博客博客的JCG合作伙伴 Gal Levinsky 使用Aspect和Spring Profile进行电子邮件过滤 。

翻译自: https://www.javacodegeeks.com/2012/07/email-filtering-using-aspect-and-spring.html

使用Aspect和Spring Profile进行电子邮件过滤相关推荐

  1. aspect spring_使用Aspect和Spring Profile进行电子邮件过滤

    aspect spring 在Web应用程序开发期间,经常需要发送电子邮件. 但是,有时数据库中会包含来自生产的数据,并且存在在电子邮件测试执行期间向真实客户发送电子邮件的风险. 这篇文章将解释如何避 ...

  2. Springboot使用Maven Profile和Spring Profile进行多环境配置

    Springboot使用Maven Profile和Spring Profile进行多环境配置 目的 在实际的项目上,一般会分三种环境dev.test.prod来方便我们的开发和部署,要求我们在开发的 ...

  3. Maven profile整合Spring profile

    在Maven和Spring中,都有profile这个概念.profile是用于区分各种环境的,例如开发环境.测试环境.正式环境等.Maven的profile用于在打包时根据指定环境替换不同环境的配置文 ...

  4. maven spring profile 协同

    请在网上查相关的使用情景,这里直接上要点.另外,可能不只一种方法,但这里只有一种. 1.POM.XML片段,使web.xml文件中有关活跃spring profile的内容可以被maven自动替换 & ...

  5. Spring Profile模式示例

    最近,我们介绍了Spring Profiles的概念. 此概念是针对不同部署环境的轻松配置区分符. 直接的用例(已提出)是对相关类进行注释,以便Spring根据活动的配置文件加载适当的类. 但是,这种 ...

  6. spring boot 构建docker镜像,运行指定spring profile

    #本文基于maven构建的spring boot项目,打包docker镜像需要安装docker 1.pom.xml添加docker打包插件 <plugin><groupId>c ...

  7. Springboot使用Maven项目使用 Profiles和Spring Profile进行多环境配置 动态激活指定

    最终效果:①:IDEA右边"maven"的工具栏 ②:项目配置的多环境选项入口[默认:dev] ③:项目配置的多环境配置文件 ④:选择②操作后编译生成的配置文件[去除其它环境配置文 ...

  8. AOP、ASPECT、Spring AOP、JDK动态代理、CGLib动态代理

    AOP.ASPECT.Spring AOP.JDK动态代理.CGLib动态代理 1 AOP介绍 1.1 基本定义 AOP(Aspect Oriented Programming)称为面向切面编程,它是 ...

  9. spring Profile

    前言 本文从如下3方面探讨Spring的Profile: Spring中的Profile是什么 为什么要使用Profile 如何使用Profile 1.Spring中的Profile 是什么? Spr ...

最新文章

  1. 26期20180601目录管理
  2. ajax返回html乱码问题,ajax返回的html代码问题
  3. html语言可以写模版继承吗,Django框架(十一):模板介绍、模板语言、模板继承、HTML转义...
  4. 网络编程项目(聊天室项目)
  5. 上云七步走,助力垂直电商降本增效
  6. Cell封面文章:跑步短短10分钟,身体近10000个分子大变样!蛋白组学破解运动有益健康之谜...
  7. 学校计算机协会有哪些部门,大学生计算机协会部门职能划分(7页)-原创力文档...
  8. matlab数学建模试卷,matlab数学建模习题
  9. Learun FrameWork V7.0,敏捷开发向导快速配置
  10. 3D游戏开发套件指南(入门篇,转自Unity官方平台公众号)
  11. Python基础学习之正则表达式(完整版)
  12. miner更换owner钱包地址
  13. matlab画简谐振动图,基于MATLAB的简谐振动合成图形的动态演示.pdf
  14. android半透明图层颜色叠加,Android 图层混合模式PorterDuff.Mode
  15. 服务器主板最多支持内存频率,b360主板支持内存频率多少
  16. [业务知识] 深入了解医联体和医共体
  17. Zephyr-WEST工具
  18. C/C++编程:异步编程入门
  19. OCXO、VCXO、TCXO、DCXO、SPXO
  20. HTTP状态码含义:428、429、431、511431状态码详解

热门文章

  1. 离线配置xml的文档类型定义文件(xml语法规则) dtd
  2. 读入的字节都写入字节数组中_使用Java将文件读入字节数组的7个示例
  3. cuba.platform_CUBA 7.2 –有什么新功能?
  4. oracle连接外部数据库_使用Oracle验证外部数据
  5. oauth2.0协议流程_正确的工作流程:我应该使用哪个OAuth 2.0流程?
  6. kafka connect_Kafka Connect在MapR上
  7. java jigsaw_60秒内使用Java 9的Project Jigsaw的JavaFX HelloWorld
  8. java系统架构师有的特质_Java中特质模式的定义
  9. jdbc pdf_JDBC教程– ULTIMATE指南(PDF下载)
  10. osgi cxf_所有OSGi套件的通用CXF请求拦截器