技术杂项

专业名词 1.curd 2.架构 REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。 RESTful 架构风格 3.RPC 远程过程调用协议 4.工具 GitStack TightVNC 远程管理工具 5.网站 https://www.kernel.org/ linux网站 6.网页播放器jplayer http://www.jplayer.cn/ 7.网络穿透 ngrok frp 8.漏洞扫描 Acunetix Trial 一些不知道是干啥的专业名词 bugzilla trello rally tickets jira RFC2616 又名 http/1.1

开发工具

禅道 项目管理系统 富文本编辑器 markdown editor.md spring企业框架 jeesite(收费) web UI框架 layui bootstarp 结构化数据存储格式 protobuf 常用于游戏开发

浏览器标识 判断移动端

public static boolean isPhone(HttpServletRequest request) { String clientType = request.getHeader("User-Agent"); if (clientType == null) { clientType = request.getHeader("user-agent"); } return clientType.matches(".*AppleWebKit.*Mobile.*"); }

数据库事物

##ACID ACID 是指在数据库管理系统(DBMS)中,事务(transaction)所具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability) 事务是指:由一系列数据库操作组成的一个完整的逻辑过程,具有ACID特性 参考链接 https://blog.csdn.net/sinat_27186785/article/details/52032510

网页QQ 客服

进入qq推广网站开通功能,一般只要进去就是开通了 http://shang.qq.com/v3/widget.html 网页代码 <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=你的QQ号&site=qq&menu=yes">QQ客服</a> 只要在新页面打开对应的网页;连接即可

微服务架构

##首先来看这个基本可无限拓展架构 这个架构从nginx反向代理开始 瓶颈 nginx反向代理服务器为瓶颈,其他层均可以进行无限拓展 ####nginx层 nginx配置反向代理和负载均衡使请求到相应的路由 ####路由层 路由层通过请求的URL或者其他参数来,使请求到指定的服务,通过负载均衡使请求到相对的服务上,部署多个路由当其中一个路由宕机之后也项目依然可以正常 ####服务层 相同的服务可以部署多个,配合路由层的负载均衡达到无限扩展,相同的服务部署多个,想其中一个或多个宕机之后项目依然可以正常使用 ####数据库层 数据库进行拆分成主从数据库进行数据同步保证数据的统一性 数据库分库:比方说用户系统,用户有ID 将 id取余1正好为0的放到一个库中 将id取余2位0的用户放到一个库中,依次类推,达到数据库层无限扩展的可能性 ####注册中心 所有的服务和路由都需要在注册中心注册,设置多个注册中心,当某个注册中心宕机之后服务依然可以正常 ####瓶颈 nginx是当前的瓶颈之一 使用session-cookie机制的话 session的存储比方说Reids之类的是瓶颈,这个可以采用JWT机制搞定 以上便是一个基本的可无限拓展架构,可以适用于当前大多数项目了 先这样吧,剩下的等哪次有空在写 ##一个基本升级的可以无限拓展架构 ##一个可以中等的可无限拓展架构 ##一个高级的无限拓展架构

微信网页分享

微信内网页分享时,图片url不宜过长,否则会导致,分享到QQ的图片无法显示 $(function () { var config; var url = "[[@{/share/getJsShareConfig}]]" $.post(url, function (res) { res.data.debug = false; res.data.jsApiList = ['onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareTimeline', 'updateAppMessageShareData', 'updateTimelineShareData', 'translateVoice', 'checkJsApi']; $("#out").html("验证成功") config = res.data; wx.config(res.data); }); wx.ready(function () { console.log("验证成功"); }); wx.error(function (res) { console.log("验证失败"); }); layui.use(['form'], function () { var form = layui.form; form.on('submit(submit)', function (data) { var shareData = { title: data.field.title, desc: data.field.desc, link: 'http://xiaodingduang.com/share/redirect?url=' + data.field.url, imgUrl: data.field.imgUrl, success: function () { layer.alert("生成成功", { title: '提示' }) } } wx.updateAppMessageShareData(shareData); wx.updateTimelineShareData(shareData); return false; }); }) })

微信支付

注意事项 微信支付时申请的 域名的备案主体 和微信公众平台 及微信商户平台的主体需要一致 如果不一致申请H5支付时需要提供其他补充材料,可能比较麻烦 微信H5支付 微信H5支付时必须企业账号才能审核通过

文件上传采坑

问题 文件上传有临时目录 这个目录在centos的情况下,会会被系统自动删除,导致文件上传出现问题 解决方式 指定文件上传的临时目录 配置如下 package com.***.core.config; import org.springframework.boot.web.servlet.MultipartConfigFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.multipart.MultipartResolver; import javax.servlet.MultipartConfigElement; /** * @author imsjw * @Date Created in 13:47 2018/7/14 */ @Configuration public class FileUploadConfig { @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setLocation("/home/tmp"); factory.setMaxFileSize(5*1024+"Mb"); factory.setMaxRequestSize(5*1024+"Mb"); return factory.createMultipartConfig(); } } 异常信息 2018-12-19 12:52:31.630 ERROR 26187 --- [http-nio-10002-exec-16] c.f.core.config.GlobalExceptionHandler : **********异常信息开始********** ID:d6576f9e-3228-4163-b63f-3c4e937c86cf 标题:未知错误 Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.2784981769630651519.10002/work/Tomcat/localhost/ROOT] is not valid org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.2784981769630651519.10002/work/Tomcat/localhost/ROOT] is not valid org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.handleParseFailure(StandardMultipartHttpServletRequest.java:122) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:113) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:86) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:70) org.springframework.web.multipart.support.MultipartResolutionDelegate.resolveMultipartArgument(MultipartResolutionDelegate.java:80) org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.resolveName(RequestParamMethodArgumentResolver.java:166) org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:106) org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124) org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:131) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387) org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:745) **********异常信息结束**********

支付宝异步通知 ,签名验证问题

1.构建参数 Map<String, String[]> parameters = req.getParameterMap(); Map<String, String> parameterMap = new HashMap<>(); for (Object v : parameters.entrySet()) { Map.Entry<String, String[]> item = (Map.Entry<String, String[]>) v; parameterMap.put(item.getKey(), item.getValue()[0]); } 2.验证签名 这里有坑,官方给的代码中没有要求传入signType 参数,而代码中使用的是rsa算法 所以需要传入signType 将算法变为参数中的算法类型(rsa2) 公钥是支付宝公钥,非应用公钥,这是一个细节方面 String signType = parameterMap.get("sign_type"); if (AlipaySignature.rsaCheckV1(parameterMap, alipayPublicKey, "UTF-8", signType)) { return true; }