traditional authentication 传统认证使用 session: 1. client 发送 username、password 给 server 2. server 查数据库,检查信息,是否正确。正确就把用户登录信息(即用户状态)写到 session 里(即服务器内存中),并将 sessionId 返回给 client。 3. client 在请求 api 时,在 cookie 中传递 sessionId。server 端根据 sessionId 获取用户登录信息,如果已认证,返回正常响应;反之,401 这种方式有个缺陷:如果做分布式服务部署,那么需要每个服务器都要同步相同的登录信息,这不是一个好的方式。所以一般 rest 微服务都要求的是 stateless,即 server 端不保存任何用户信息,请求中包含所有需要的信息。 oauth oauth 是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。 OAuth允许用户提供一个 令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权
Read more »

asure storage 提供四种存储支持(asure storage overview (youtube)): * blob (binary large object):二进制数据存储。有两种:page blog(只能新增/删除/向已有数据附加数据,不能修改数据);block blog(可以更新) * table:存储表格(nosql) * queue:有库,有 rest api * files:好像主要用在文件共享的时候,就是类似于 windows server 上的文件共享(smb(server message block)),实现和使用方式都和 windows server 的文件共享一样。所以需要支持例如按 /servername/filename 等方式来 share 和 使用文件。它是构建于 blob 之上的。 几个概念 Storage Accout storage 的所有存储都必须在一个 storage account 内发生。这有点类似于一个 database。 安全也是在这里实现: 1. key:创建 account 时,就会生成俩 key,primary key 就是你用来登录访问数据的 key。不过这种方式对于有 client 时不太方便,因为可能不能 share key 2. saas token:就是可以登录认证获得 token,然
Read more »

[MIME 类型](MIME 类型) 是用一种标准化的方式来表示文档的性质和格式。浏览器一般通过 MIME 类型(而不是文档扩展名)来确定如何处理文档。因此服务器传输数据时,必须设置正确的 MIME 类型。 通用结构 1 type/subtype 1. 不允许空格 2. 大小写不敏感,一般都是小写 独立类型 type 可以是独立类型,表示文件的分类,可以是如下值: 类型描述典型示例text表明文件是普通文本,理论上是可读的语言text/plain, text/html, text/css, text/javascriptimage表明是某种图像。不包括视频,但是动态图(比如动态gif)也使用image类型image/gif, image/png, image/jpeg, image/bmp, image/webpaudio表明是某种音频文件audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wavvideo表明是某种视频文件video/webm, video/oggapplication表明是某种二进制数据application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, appli
Read more »

license 是软件的授权许可。 对于开源软件来说,虽然别人可以用,但是用的时候希望别人遵循一些要求,比如,使用时必须标明原作者是谁、可以做怎样的修改、软件被用作不正规用途原作者是否要负责……这些其实就是一个协议。 对于作者来说,自己为开源代码写符合法律条规的繁冗的 license 太麻烦,所以就可以采用广为流传的开源协议(eg. MIT, CC…),在 license 文件中标明 “Licnse under the MIT license” 快速选择 详细的协议选择可以从 github choose license 项目中选。下边列些常用的(参见 如何为你的代码选择一个开源协议) MIT 协议 宽松但覆盖一般要点。此协议允许别人以任何方式使用你的代码同时署名原作者,但原作者不承担代码使用后的风险,当然也没有技术支持的义务。jQuery和Rails就是MIT协议 apache 协议 作品涉及到专利,可以考虑这个。也比较宽松,但考虑了专利,简单指明了作品归属者对用户专利上的一些授权(我的理解是软件作品中含有专利,但它授权你可以免费使用)。Apache服务器,SVN还有NuGet等是使用的Apache协议。 GPL 对作品的传播和修改有约束的,可以使用这个。GPL(V2或V3)是一种版本自由的协议(可以参照copy right来理解,后者是版本保留,那copyleft便是
Read more »

可选 lib * apache POI:java 中最大众的 ,支持 xls、xlsx,提供接口来创建、读写 excel文件。 * apache openOffice uno: * JExcel app:这个功能强大,什么都可以做,但是可能收费,而且仅基于 windows + installed excel * JExcelAPI:轻量更易用,但似乎仅支持 xls,而且不支持复杂的 range、formular 计算操作。 * javascript 版本的 JExcel * docx4j:其中 xlsx4j 是处理 excel 的,不过看起来功能比较简单。 * microsoft excel VBA:vba 是微软写的操作 office 软件的语言。所以可以利用这个 vba 写代码…… ref doc: * baeldung example for apache POI & JExcelAPI * Mkyong example for JExcelAPI 核心操作支持 libapache poiapache openofficeJExcelAPIread/create excel file✔️可以✔️read/write excel cells1. 获取 sheet,遍历 row,遍历 row cells;可以1. 获取 sheet,可以根据 cell 行列
Read more »

hikariCP 是一个轻量级的数据库连接池。引用 数据库连接池性能对比 的说法(我并没有测试过): 1. 性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。 2. druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。 3. 综合性能,扩展性等方面,可考虑使用druid或者hikariCP连接池。 4. 可开启prepareStatement缓存,对性能会有大概20%的提升。 在使用 spring jpa 时,默认使用的连接池是 hikariCP,所以最终采用了这个连接池。 使用过程中出现了一些坑,总结一下。 java.sql.SQLTransientConnectionException 仅使用默认配置,在运行所有测试时,会出现如下异常信息: 这是因为默认的连接池数量是 10,而并行运行测试时,连接池数量不够了。通过设置 maximumPoolSize 解决。 1 spring.datasource.hikari.maximum-pool-size:1000 too many connections 在进行上述设置后,启动应用,连接数据库,发现数据库无法连接,报 too many connections。 fixed-size poo
Read more »

bean validator 主要是验证一个 bean 的各字段是否满足一些约束,例如 @NotNull bean validation 有个规范 jsr 380,里边定义了一堆 api。有很多规范的实现,最常用的是 hibernate validator,jersey 出的 jersey-bean-validation 也是基于 hibernate validator 做的。 bean validator 一般是应用在 web 框架(如 spring、jersey)上,框架在反序列化 rest 请求到 bean 对象时,框架会调用 validator 根据 bean 对象的 annotation 对 bean 进行验证。 这个过程也可以手动进行。可参考 hibernate validator: get started。 引入依赖 1 2 3 4 5 6 7 8 // jsr 380 api compile "javax.validation:validation-api:2.0.1.Final" // hibernate vaidator 实现 testCompile "org.hibernate.validator:hibernate-validator:6.0.10.Final" // hibernate validator 依赖的 JSR 341 实现 te
Read more »

泛型 java 泛型存在类型擦除(参见 java 泛型) 1 2 3 4 List l1 = new ArrayList(); List l2 = new ArrayList(); System.out.println(l1.getClass() == l2.getClass()); // return true, 两个都是 List.class 获取运行时泛型类型 类型擦除使得根据类定义获取 runtime 泛型类型是不可能的,一般有几种方法(参见 stackoverflow): 1. 根据类对象实例获取,可参见 handle java generic types with reflection * eg. Class tClass = (Class) ReflectionUtil.getClass(ReflectionUtil.getParameterizedTypes(this)[0]); 2. 从父类中获取(要求父类有相同的泛型参数) * eg. Class tClass = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments
Read more »

使用 aws serverless java container 实现。 使用 aws cli 创建项目,配置 aws cli 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 利用原型创建项目 $ mvn archetype:generate -DgroupId=my.service -DartifactId=my-service -Dversion=1.0-SNAPSHOT \ -DarchetypeGroupId=com.amazonaws.serverless.archetypes \ -DarchetypeArtifactId=aws-serverless-jersey-archetype \ -DarchetypeVersion=1.1.3 # 安装 aws cli $ pip install awscli # 配置 credentials $ aws configure AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY Default region name [None]: us-west-
Read more »

1. 最基本的js写法是:不管是要调用项目内或项目外的其他文件的方法,都是直接在当前文件中调用,然后在web文件(html)中利用