From 3abd1b6436d0f793fc2c2a74d660afb1d15e339e Mon Sep 17 00:00:00 2001 From: huoyo <1729913829@qq.com> Date: Fri, 7 Apr 2023 14:51:20 +0800 Subject: [PATCH] optimize email and add charset for html --- pom.xml | 2 +- .../langpy/kotime/config/DefaultConfig.java | 91 +++++++++++++++++++ .../cn/langpy/kotime/config/LoadConfig.java | 38 +++----- .../kotime/controller/KoTimeController.java | 10 +- .../langpy/kotime/service/EmailHandler.java | 7 +- .../kotime/service/EmailSendService.java | 63 +++++++------ src/main/resources/kotime-en.html | 11 +++ src/main/resources/kotime.html | 11 +++ 8 files changed, 177 insertions(+), 56 deletions(-) diff --git a/pom.xml b/pom.xml index be3fb99..172132a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.langpy ko-time - 2.3.9 + 2.4.0 KoTime A springboot tool for tracking the paths of the methods,which can help you find method's performances easily. diff --git a/src/main/java/cn/langpy/kotime/config/DefaultConfig.java b/src/main/java/cn/langpy/kotime/config/DefaultConfig.java index 061d9e1..2d5c541 100644 --- a/src/main/java/cn/langpy/kotime/config/DefaultConfig.java +++ b/src/main/java/cn/langpy/kotime/config/DefaultConfig.java @@ -35,6 +35,97 @@ public class DefaultConfig { private Long authExpire; + private Boolean mailEnable; + private String mailHost; + private Integer mailPort; + private String mailProtocol; + private String mailEncoding; + private String mailUser; + private String mailCode; + private String mailReceivers; + private Integer mailThreshold; + private String mailScope; + + public Boolean getMailEnable() { + return mailEnable; + } + + public void setMailEnable(Boolean mailEnable) { + this.mailEnable = mailEnable; + } + + public String getMailHost() { + return mailHost; + } + + public void setMailHost(String mailHost) { + this.mailHost = mailHost; + } + + public Integer getMailPort() { + return mailPort; + } + + public void setMailPort(Integer mailPort) { + this.mailPort = mailPort; + } + + public String getMailProtocol() { + return mailProtocol; + } + + public void setMailProtocol(String mailProtocol) { + this.mailProtocol = mailProtocol; + } + + public String getMailEncoding() { + return mailEncoding; + } + + public void setMailEncoding(String mailEncoding) { + this.mailEncoding = mailEncoding; + } + + public String getMailUser() { + return mailUser; + } + + public void setMailUser(String mailUser) { + this.mailUser = mailUser; + } + + public String getMailCode() { + return mailCode; + } + + public void setMailCode(String mailCode) { + this.mailCode = mailCode; + } + + public String getMailReceivers() { + return mailReceivers; + } + + public void setMailReceivers(String mailReceivers) { + this.mailReceivers = mailReceivers; + } + + public Integer getMailThreshold() { + return mailThreshold; + } + + public void setMailThreshold(Integer mailThreshold) { + this.mailThreshold = mailThreshold; + } + + public String getMailScope() { + return mailScope; + } + + public void setMailScope(String mailScope) { + this.mailScope = mailScope; + } + public String getStaticToken() { return staticToken; } diff --git a/src/main/java/cn/langpy/kotime/config/LoadConfig.java b/src/main/java/cn/langpy/kotime/config/LoadConfig.java index 4cbdaef..a625cb8 100644 --- a/src/main/java/cn/langpy/kotime/config/LoadConfig.java +++ b/src/main/java/cn/langpy/kotime/config/LoadConfig.java @@ -56,18 +56,7 @@ public class LoadConfig { @Value("${server.servlet.context-path:}") private String serverContext; - @Value("${ko-time.mail-host:smtp.qq.com}") - private String host; - @Value("${ko-time.mail-port:587}") - private Integer port; - @Value("${ko-time.mail-protocol:smtp}") - private String protocol; - @Value("${ko-time.mail-encoding:UTF-8}") - private String encoding; - @Value("${ko-time.mail-user:}") - private String user; - @Value("${ko-time.mail-code:}") - private String mailCode; + @Value("${ko-time.mail-enable:false}") private Boolean mailEnable; @@ -97,6 +86,18 @@ public class LoadConfig { config.setDataReset(defaultConfig.getDataReset() == null ? false : defaultConfig.getDataReset()); config.setVersionNotice(defaultConfig.getVersionNotice() == null ? true : defaultConfig.getVersionNotice()); config.setStaticToken(defaultConfig.getStaticToken()); + + config.setMailEnable(defaultConfig.getMailEnable()); + config.setMailProtocol(defaultConfig.getMailProtocol() == null ? "smtp" : defaultConfig.getMailProtocol()); + config.setMailHost(defaultConfig.getMailHost() == null ? "smtp.qq.com" : defaultConfig.getMailHost()); + config.setMailPort(defaultConfig.getMailPort() == null ? 587 : defaultConfig.getMailPort()); + config.setMailEncoding(defaultConfig.getMailEncoding() == null ? "UTF-8" : defaultConfig.getMailEncoding()); + config.setMailThreshold(defaultConfig.getMailThreshold() == null ? 4: defaultConfig.getMailThreshold()); + config.setMailScope(defaultConfig.getMailScope() == null ? "Controller": defaultConfig.getMailScope()); + config.setMailUser(defaultConfig.getMailUser()); + config.setMailCode(defaultConfig.getMailCode()); + config.setMailReceivers(defaultConfig.getMailReceivers()); + configDataSource(config); configRedisTemplate(config); Context.setConfig(config); @@ -124,18 +125,7 @@ public class LoadConfig { initMethodHandlers(); } - @Bean - @Lazy - public EmailSendService emailSendService() { - EmailSendService sender = new EmailSendService(); - sender.setHost(host); - sender.setPort(port); - sender.setUsername(user); - sender.setPassword(mailCode); - sender.setProtocol(protocol); - sender.setDefaultEncoding(encoding); - return sender; - } + public void configDataSource(DefaultConfig config) { if (!"database".equals(config.getSaver())) { diff --git a/src/main/java/cn/langpy/kotime/controller/KoTimeController.java b/src/main/java/cn/langpy/kotime/controller/KoTimeController.java index f5d6c77..bf293f1 100644 --- a/src/main/java/cn/langpy/kotime/controller/KoTimeController.java +++ b/src/main/java/cn/langpy/kotime/controller/KoTimeController.java @@ -79,7 +79,7 @@ public class KoTimeController { @GetMapping - public void index(String kotoken, String test, HttpServletResponse response, HttpServletRequest request) { + public void index(String kotoken, String test,String charset, HttpServletResponse response, HttpServletRequest request) { if (!Context.getConfig().getEnable()) { return; } @@ -90,7 +90,10 @@ public class KoTimeController { if (StringUtils.hasText(kotoken)) { staticTokenVisit = true; } - response.setContentType("text/html;charset=utf-8"); + if (!StringUtils.hasText(charset)) { + charset = "utf-8"; + } + response.setContentType("text/html;charset="+charset); ClassPathResource classPathResource = new ClassPathResource(KoConstant.getViewName()); try ( InputStream inputStream = classPathResource.getInputStream(); @@ -248,6 +251,9 @@ public class KoTimeController { if (config.getLogEnable() != null) { koTimeConfig.setLogEnable(config.getLogEnable()); } + if (config.getMailEnable() != null) { + koTimeConfig.setMailEnable(config.getMailEnable()); + } if (config.getThreshold() != null) { koTimeConfig.setThreshold(config.getThreshold()); } diff --git a/src/main/java/cn/langpy/kotime/service/EmailHandler.java b/src/main/java/cn/langpy/kotime/service/EmailHandler.java index df2ddda..a8ced28 100644 --- a/src/main/java/cn/langpy/kotime/service/EmailHandler.java +++ b/src/main/java/cn/langpy/kotime/service/EmailHandler.java @@ -17,16 +17,17 @@ public class EmailHandler implements InvokedHandler { private static Logger log = Logger.getLogger(EmailHandler.class.toString()); @Value("${ko-time.mail-scope:Controller}") private String mailScope; - @Autowired - private EmailSendService emailSendService; @Override public void onInvoked(MethodNode current, MethodNode parent, Parameter[] names, Object[] values) { + if (!Context.getConfig().getMailEnable()) { + return; + } if (current == null || current.getValue() < Context.getConfig().getThreshold()) { return; } if (mailScope.equals("All") || current.getMethodType().name().equals(mailScope)) { - emailSendService.sendNoticeAsync(current); + EmailSendService.sendNoticeAsync(current); } } } diff --git a/src/main/java/cn/langpy/kotime/service/EmailSendService.java b/src/main/java/cn/langpy/kotime/service/EmailSendService.java index 1b11e7a..d2fe8c2 100644 --- a/src/main/java/cn/langpy/kotime/service/EmailSendService.java +++ b/src/main/java/cn/langpy/kotime/service/EmailSendService.java @@ -2,7 +2,7 @@ package cn.langpy.kotime.service; import cn.langpy.kotime.model.MethodNode; import cn.langpy.kotime.util.Context; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.util.StringUtils; @@ -18,50 +18,61 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Logger; -public class EmailSendService extends JavaMailSenderImpl { +public class EmailSendService{ private static Logger log = Logger.getLogger(EmailSendService.class.toString()); + private volatile static JavaMailSenderImpl javaMailSender; private static ConcurrentMap redMethods = new ConcurrentHashMap<>(); private final static ExecutorService emailExecutors = Executors.newFixedThreadPool(5); - @Value("${ko-time.mail-receivers:}") - private String receivers; - @Value("${ko-time.mail-threshold:4}") - private Integer threshold; - @Value("${ko-time.data-prefix:}") - private String dataPrefix; - @Value("${ko-time.mail-user:}") - private String user; + public static JavaMailSender getMailSender() { + if (javaMailSender == null) { + synchronized (EmailSendService.class) { + if (javaMailSender == null) { + javaMailSender = new JavaMailSenderImpl(); + javaMailSender.setHost(Context.getConfig().getMailHost()); + javaMailSender.setPort(Context.getConfig().getMailPort()); + javaMailSender.setUsername(Context.getConfig().getMailUser()); + javaMailSender.setPassword(Context.getConfig().getMailCode()); + javaMailSender.setProtocol(Context.getConfig().getMailProtocol()); + javaMailSender.setDefaultEncoding(Context.getConfig().getMailEncoding()); + } + } + } + return javaMailSender; + } - public void sendNoticeAsync(MethodNode current) { + public static void sendNoticeAsync(MethodNode current) { emailExecutors.submit(() -> sendNotice(current)); } - public void sendNotice(MethodNode current) { - if (!StringUtils.hasText(receivers)) { + + public static void sendNotice(MethodNode current) { + if (!StringUtils.hasText(Context.getConfig().getMailReceivers())) { return; } + JavaMailSender mailSender = getMailSender(); if (redMethods.containsKey(current.getId())) { int n = redMethods.get(current.getId()); n += 1; - if (n >= threshold) { - this.send(createMessage(current)); + if (n >= Context.getConfig().getMailThreshold()) { + mailSender.send(createMessage(mailSender,current)); redMethods.put(current.getId(), -2000); } else { redMethods.put(current.getId(), n); } } else { redMethods.put(current.getId(), 1); - if (threshold == 1) { - this.send(createMessage(current)); + if (Context.getConfig().getMailThreshold() == 1) { + mailSender.send(createMessage(mailSender,current)); } } } - private MimeMessage createMessage(MethodNode current) { + private static MimeMessage createMessage(JavaMailSender mailSender, MethodNode current) { MimeMessage mimeMessage = null; try { - mimeMessage = this.createMimeMessage(); + mimeMessage = mailSender.createMimeMessage(); configMessage(current, mimeMessage); } catch (MessagingException e) { log.severe("Error email message!"); @@ -69,20 +80,20 @@ public class EmailSendService extends JavaMailSenderImpl { return mimeMessage; } - private void configMessage(MethodNode current, MimeMessage mimeMessage) throws MessagingException { - String[] receiversArray = receivers.split(","); + private static void configMessage(MethodNode current, MimeMessage mimeMessage) throws MessagingException { + String[] receiversArray = Context.getConfig().getMailReceivers().split(","); MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true); - messageHelper.setSubject("KoTime耗时预警-" + dataPrefix + "-" + current.getName()); - messageHelper.setFrom(user); + messageHelper.setSubject("KoTime耗时预警-" + Context.getConfig().getDataPrefix() + "-" + current.getName()); + messageHelper.setFrom(Context.getConfig().getMailUser()); messageHelper.setTo(receiversArray); messageHelper.setSentDate(new Date()); messageHelper.setText(createNoticeTemplate(current), true); } - private String createNoticeTemplate(MethodNode current) { - return "

您有一个方法耗时有" + threshold + "次超过了阈值(" + Context.getConfig().getThreshold() + "),详情如下:

\n" + + private static String createNoticeTemplate(MethodNode current) { + return "

您有一个方法耗时有" + Context.getConfig().getMailThreshold() + "次超过了阈值(" + Context.getConfig().getThreshold() + "ms),详情如下:

\n" + "
\n" + - "
项目:" + dataPrefix + "
\n" + + "
项目:" + Context.getConfig().getDataPrefix() + "
\n" + "
类名:" + current.getClassName() + "
\n" + "
方法:" + current.getMethodName() + "
\n" + "
最近耗时:" + current.getValue() + " ms
\n" + diff --git a/src/main/resources/kotime-en.html b/src/main/resources/kotime-en.html index 0abbd9c..e1a68a5 100644 --- a/src/main/resources/kotime-en.html +++ b/src/main/resources/kotime-en.html @@ -366,6 +366,10 @@ let logEnableDom = document.getElementById('logEnable'); logEnableDom.checked = logEnable; + let mailEnable = data['mailEnable']; + let mailEnableDom = document.getElementById('mailEnable'); + mailEnableDom.checked = mailEnable; + let language = data['language']; $("#languageSwitch").val(language) }); @@ -388,6 +392,11 @@ UIkit.notification("OK",{}); }; + document.getElementById('mailEnable').onclick = function(){ + $.ajax({type:'POST',url:concatToken('contextPath/koTime/updateConfig'),data:JSON.stringify({mailEnable:document.getElementById('mailEnable').checked}),dataType:'json', headers: {'Content-Type': 'application/json' }}); + UIkit.notification("OK",{}); + }; + document.getElementById('languageSwitch').onchange = function(){ let selectedObj = document.getElementById('languageSwitch'); $.ajax({type:'POST',url:concatToken('contextPath/koTime/updateConfig'),data:JSON.stringify({language:selectedObj.options[selectedObj.selectedIndex].value}),dataType:'json', headers: {'Content-Type': 'application/json' }}); @@ -776,6 +785,8 @@

+ +

+ +