设计模式演绎-建造者模式
定义建造者模式,也叫做生成器模式。 Separate the construction of a complex object from its representation so that the same construction process can create different representations. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 通用类图 通用代码/* 产品类 */public class Product{ public void doSomething(){ // 业务逻辑 }}/* 抽象建造者 */public abstract class Builder{ //设置产品的不同部分,以获得不同的产品 public abstract void setPart(); //建造产品 public abstract Product buildProduct(); }/* 具体建造者 */publi...
Token实现规范
目标为RESTful架构的系统交互规定token的约定及提供一些建议。 技术[约定] token的生成使用jwt 0.7.0 。以下为maven依赖示例。 <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0</version></dependency> [约定] token的生成算法使用HS512。 [约定] claim段中的key使用小写,最多不能超过5个字符。 [建议] claim段中的常用key名建议。 key 含义 sub 用户名 crt 生成时间 role 角色 auth 权限 [建议] token的过期时间应大于12小时。 [建议] token的最大长度应小于 2 KB,因为tomcat的默认maxHttpHeaderSize是 4 KB。 [约定] 前端在向后端传递token时,应将token放入he...
sonar使用记录
此文记录使用sonar中遇到的坑以及解决方法。先介绍一下我的环境 SonarQube 版本:6.5 SonarQube OS:Centos 7 MySQL 版本:5.7 SonarScaner 版本:3.0.3 SonarScanner OS:Win 10 SonarQube 配置配置文件在conf目录下,以下是最简单的配置。需要注意的是jdbc url上的一堆参数。 sonar.jdbc.username= # 数据库用户名sonar.jdbc.password= # 数据库密码sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=falsesonar.web.port= #访问端口 默认是9000sonar.path.logs= #日志路径 启用tokenSonarScanne...
使用docker搭建sonarQube
费了好大功夫把阿里云上的环境从centos 6.5 升级到了 centos 7,可以折腾docker了。刚好团队需要进行代码质量审计,于是就顺水推舟的用docker去搭建一套sonarcube。以下是详细过程。 使用阿里云加速docker镜像docker的官方镜像在海外,速度很难让人满意,可以使用阿里云的加速服务。 登陆阿里云为Docker Hub的镜像站点获取专属加速器地址。形如:https://zv123pat.mirror.aliyuncs.com 通过修改daemon配置文件/etc/docker/daemon.json来使用加速器(docker 1.10+) sudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://zv3w4pat.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart ...
从FTP获取文件流并推送到前端展现
前几天遇到一个需求,需要从FTP里获取PDF并在前端渲染出去,同事采用了直接在iframe嵌入ftp url的方式,个人觉得这种方式并不合理,有很多弊端,比如安全性、跨域、ftp中文路径等问题。所以我建议其采用服务端直接获取ftp文件流,然后转发给前端呈现的方式来解决。以下是主要思路。 从FTP获取文件流这里用到了2个第三方库:Apache的FTPClient,IOUtils。前者的retrieveFileStream方法实现了将文件转成InputStream,后者的toByteArray方法实现了将InputStream转换成Byte[]。 import org.apache.commons.io.IOUtils;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import java.io.IOException;import java.io.InputStream;/** * 从ftp获取文件流 * * @author lefer * @versio...
使用java创建pdf文档
PDF是一个很棒的跨平台的文件格式,纯java的方式,有2个很著名的library实现了pdf的创建和读取: pdfbox 这是一个 Apache 旗下的开源项目。官网 iText 这是 IBM 推荐的开源项目。官网 两个都很好,我们这次选用iText 5来演示PDF的创建和加密。 主要依赖<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.12</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-pdfa</artifactId> <version>5.5.12</version> </dependency&...
最好的java反编译工具
最好的java反编译工具不是一款,而是三款。一个工具总有疏漏,三款互相参照,天下无敌。 JD-GUI这是老牌劲旅,口碑好。反编译一个war包,上千个class,眨眼之间。成熟稳重。缺点是变量识别上偶有问题,Iterator循环代码块的反编译上偶有问题。下载 javare没错,这是一个在线反编译网站。极其的准,JD-GUI的毛病他没有。缺点是中文乱码,不能批量逆向。访问 luyten这是一个后期之秀,纯java编写,开源代码。三个月前还在更新,能兼容更新版本的JAVA(测试1.7OK)。缺点是中文会被反编译成UNICODE格式。下载
JPA关键词
JPA相较Hibernate来说,比较优秀的一点就是实现了根据方法名的自动解析创建查询。今天看到团队的小伙伴无论查询复杂或简单还在吭哧吭哧的写@Query,于是决定把JPA的能自动解析的关键词扒出来。供大家参考。 简单示例public interface UserRepository extends JPARepository<User, Long> { List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);} 以上就是一个简单的查询的示例。当继承了JPARepository接口之后,JPA就会尝试根据方法名去自动生成sql,上面的方法会被解析成 select u from User u where u.emailAddress = ?1 and u.lastname = ?2 JPARepository<User, Long> ,第一个参数是对应的实体类,第二个参数是这个实体类的主键的数据类型。根据需要修改。 ...
Spring MVC中上传文件大小超过限制的异常处理
今天团队里的一个小伙子在写代码的时候,遇到一个问题。他在做上传文件的表单时,限制最大上传文件的大小。但当用户上传的文件超过大小后,虽然后台有报异常,前台却没有错误提示。他拿着这个问题问到了我,我把解决问题的过程记录下来,做个分享。 总体思路服务端拦截异常,并直接返回值给前台。前台根据返回的值给用户做下一步处理。 主要代码 Spring Boot 配置文件 server.port=8888# 下面两个参数是设置上传文件大小multipart.maxFileSize=2MBmultipart.maxRequestSize=2MB# 下面两个参数是禁用spring的默认异常映射,比如将异常会自动映射到 /error下。spring.mvc.throw-exception-if-no-handler-found=truespring.resources.add-mappings=false 捕获文件超过设置大小的异常,并直接返回错误信息 @RestControllerAdvicepublic class RestExceptionHandler { @Excepti...
设计模式演绎-模板方法模式
定义 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure. 定义一个操作中的算法的框架,而将一些步骤延迟到子类,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 通用类图模板方法模式是一个比较简单和常见的模式。其通用类图如下。 AbstractClass是抽象模板。在抽象模板中实现模板方法。而在具体的实现类中实现基本方法。 在模板方法中调用基本方法,实现算法逻辑。 通用代码/* 抽象模板类 */public abstract class AbstractClass{ //基本方法 protected abstract void doSomething(); protected abstra...
