#Java

REST 是一种现代架构风格,它定义了一种设计 Web 服务的新方法。和之前的 HTTP 以及 SOA 不同,它不是一个协议(即:一套严格的规则),而是一些关于 Web 服务应该如何相互通信的一些建议和最佳实践。按照 REST 最佳实践开发的服务被称为 “RESTful Web 服务”。 安全性是 RESTful 服务的基石。启用它的方法之一是尽可能内置用户身份验证和授权机制。 在 RESTful 服务中实现用户身份验证和授权的方法有很多。我们今天要讲的主要方法(或标准)有: Basic 认证 OAuth 2.0 OAuth 2.0 + JWT 为了让我们的讨论更加具体,假设我们的后端程序有微服务,并且每个用户请求时,必须调用后端的几个服务来返回请求的数据。所以,我们将不仅从安全性问题方面,而且在它们产生的额外流量和服务器负载的背景下检查每个标准。下面开始吧… Basic 认证最...

分享一个最近在整Flyway时候碰到的一个问题,以及对应的一些解决方案。如果您还不知道Flyway,建议可以先看一下这篇文章Spring Boot中使用Flyway来管理数据库版本 问题描述问题出现所描述的工程所用版本信息如下: Spring Boot:2.1.3 Flyway:5.2.4(非特别指定,随Spring Boot的素材版本管理) 具体错误:在Spring Boot中整和Flyway之后,本地执行ok,但在部署环境出现了这样的错误: java.sql.SQLSyntaxErrorException: SELECT command denied to user 'test'@'10.10.8.101' for table 'user_variables_by_thread' at com.mysql.cj.jd...

在面向对象编程中必不可少需要在代码中定义对象模型,而在基于Java的业务平台开发实践中尤其如此。相信大家在平时开发中也深有感触,本来是没有多少代码开发量的,但是因为定义的业务模型对象比较多,而需要重复写Getter/Setter、构造器方法、字符串输出的ToString方法和Equals/HashCode方法等。那么是否一款插件或工具能够替大家完成这些繁琐的操作呢?本文将向大家介绍一款在Eclipse/Intellij IDEA主流的开发环境中都可以使用的Java开发神器,同时简要地介绍下其背后自定义注解的原理。 Lombok的简介Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equ...

本文转载自微信公众号「工匠小猪猪的技术世界」 主流数据库连接池常用的主流开源数据库连接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。单线程,性能较差,适用于小型系统,代码600KB左右。 DBCP (Database Connection Pool):由Apache开发的一个Java数据库连接池项目, Jakarta commons-pool对象池机制,Tomcat使用的连接池组件就是DBCP。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连...

经过前面两篇文章《JSON Web Token - 在Web应用间安全地传递信息》《八幅漫画理解使用JSON Web Token设计单点登录系统》的科普,相信大家应该已经知道了 JWT 协议是什么了。至少看到 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxaWFubWlJZCI6InFtMTAzNTNzaEQiLCJpc3MiOiJhcHBfcW0xMDM1M3NoRCIsInBsYXRmb3JtIjoiYXBwIn0.cMNwyDTFVYMLL4e7ts50GFHTvlSJLDpePtHXzu7z9j4 这样形如 A.B.C 的字符串时能敏感地认出这是使用了 jwt。发了这两篇文章后,有不少读者在文末留言,表达了对 jwt 使用方式的一些疑惑,以及到底哪些场景适合使用 jwt。我并不是 jwt 方面的专家,和不少读者一样,起初研究时我也存在相同疑...

Java10 已经发布了大概有一个多月了。我们在之前的文中介绍过10为我们带来的一些新特性:JDK10要来了:下一代 Java 有哪些新特性?。其中就提到了10 关于G1垃圾收集器的一些改进。G1在Java 9的时候已经是被作为默认的垃圾收集器了。如果你了解G1的话,应该知道它是一个更注重低停顿的收集器。有关G1的内容你可以移步一步步图解G1。 那么在10中针对垃圾回收都有哪些改进和改变呢? 严格的来说有两处是与垃圾回收有关的: 分别是JEP304和JEP307。 JEP 304: 垃圾回收器接口(Garbage Collector Interface) 就是引入了一个一个垃圾回收器的接口。让Hotspot虚拟机的模块化水平得到了进一步的提高,让我们可以轻松的添加一个新的GC或者排除掉JDK内部自带的现存的某个GC,总之,就是解耦了。 在Java10 之前,垃圾回收器的代码被分散到很...

上次在《JSON Web Token - 在Web应用间安全地传递信息》中我提到了JSON Web Token可以用来设计单点登录系统。我尝试用八幅漫画先让大家理解如何设计正常的用户认证系统,然后再延伸到单点登录系统。 如果还没有阅读《JSON Web Token - 在Web应用间安全地传递信息》,我强烈建议你花十分钟阅读它,理解JWT的生成过程和原理。 用户认证八步走所谓用户认证(Authentication),就是让用户登录,并且在接下来的一段时间内让用户访问网站时可以使用其账户,而不需要再次登录的机制。 小知识:可别把用户认证和用户授权(Authorization)搞混了。用户授权指的是规定并允许用户使用自己的权限,例如发布帖子、管理站点等。 首先,服务器应用(下面简称“应用”)让用户通过Web表单将自己的用户名和密码发送到服务器的接口。这一过程一般是一个HTTP POS...

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 让我们来假想一下一个场景。在A用户关注了B用户的时候,系统发邮件给B用户,并且附有一个链接“点此关注A用户”。链接的地址可以是这样的 https://your.awesome-app.com/make-friend/?from_user=B&target_user=A 上面的URL主要通过URL来描述这个当然这样做有一个弊端,那就是要求用户B用户是一定要先登录的。可不可以简化这个流程,让B用户不用登录就可以完成这个操作。JWT就允许我们做到这点。 JWT的组成一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。 载荷(Payload)我们先将上面的添加好友的操作描述成一个JSON对象。其中添加了一些其他的信息,帮助今后收到这个JWT的服...

G1在堆上分配内存和其他的GC有点不一样。现在我们来一步一步看下G1系统。 1、 G1堆结构 G1的堆结构就是把一整块内存区域切分成多个固定大小的块。 在JVM在启动时来决定每个小块,也就是region的大小。 JVM一般是把一整块堆切分成2000个小region。然后每个小region从1到32Mb不等。 2、 G1内存分配 事实上,这些region最后又被分别标记为Eden,Survivor和old。这里的eden,survivor和old已经是一个标签,也就是说只是一个逻辑表示,不是物理表示。 O表示老生代(Old),E表示Eden,S表示Survivor。为了明了,我们分别用三种不同的颜色区分。存活下来的对象就被虚拟机从一个小region里被移动到另一个中。这些小块(region)的回收是并行回收的,期间其他的应用线程照常工作。和以往的回收器一样,G1中也有E...

前言LRU 是 Least Recently Used 的简写,字面意思则是最近最少使用。 通常用于缓存的淘汰策略实现,由于缓存的内存非常宝贵,所以需要根据某种规则来剔除数据保证内存不被撑满。 如常用的 Redis 就有以下几种策略: 策略 描述 volatile-lru 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰 volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰 volatile-random 从已设置过期时间的数据集中任意选择数据淘汰 allkeys-lru 从所有数据集中挑选最近最少使用的数据淘汰 allkeys-random 从所有数据集中任意选择数据进行淘汰 no-envicition 禁止驱逐数据 摘抄自:https://github.com/CyC2018/Interview-Noteboo...

摘要: 此文章意在借鉴前人经验,留作日后查看。如有侵犯,实属无意。我以后会注意,谢谢博友的提醒。也愿各大博友们能够共同学习和努力。 以下介绍一下JDK1.5版本到JDK1.7版本的特性及JDK1.8主要部分特性。仅供参考。 JDK1.5新特性1:自动装箱与拆箱:自动装箱:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。 自动拆箱:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue()和doubleValue()方法。 自动装箱,只需将该值赋给一个类型包装器引用,java会自动创建一个对象。 自动拆箱,只需将该对象值赋给一个基本类型即可。 java——类的包装器 类型包装器有:Double,Float,Long,Integer,Short,Character和Boolean 2:枚举把集合里的对象元素一个一个提取出来。枚...

Java 9发布至今已经有半年之久,Spring Boot对其的支持进度也快接近完成,本文就来整理一下在Java 9上运行Spring Boot的一些要点。 必须使用Spring Boot2.0在Spring Boot的版本计划中明确说明了2.0版本开始才对Java 9进行支持,而1.x版本暂时没有对Java 9的支持计划,所以如果我们要使用Java 9,就必须将Spring Boot版本升级至2.0。 细节注意点AspectJ 在Java9中要使用JDK的编译织入切面时,我们需要引入AspectJ 1.9,但是这个版本还处于RC状态,并不是正式版本,所以当Spring Boot 2会在Aspect 1.9 GA的时候更新这个版本依赖。 JAXB 如果使用Hibernate的情况下,由于依赖JAXB,这个时候可能会碰到这个错误:java.lang.NoClassDefFoundErr...

关于Lombok,其实在网上可以找到很多如何使用的文章,但是很少能找到比较齐全的整理。我也一直寻思着想写一篇各个注解用法的总结,但是一直都没有付诸行动。今天看到了微信公众号”原力注入”推送的这篇文章,总结的内容很全,所以分享给所有关注我博客的朋友们。 Lombok简介 Project Lombok makes java a spicier language by adding ‘handlers’ that know >how to build and compile simple, boilerplate-free, not-quite-java code. 如Github上项目介绍所言,Lombok项目通过添加“处理程序”,使java成为一种更为简单的语言。作为一个Old Java Developer,我们都知道我们经常需要定义一系列的套路,比如定义如下的格式对象。 ...

记录一个今天遇到的问题。 Java版本:1.4 运行设置: -Xms1G -Xmx4G 报错:[ Incompatible initial and maximum heap sizes specified: ][ initial size:1073741824 bytes, maximum heap size: 67108864 bytes ][ The initial heap size must be less than or equal to the maximum heap size. ][ The default initial and maximum heap sizes are 4194304 and 67108864 bytes. ]无法创建Java虚拟机。 疑问:执行语句中设置初始化内存1G,最大内存4G,但是错误提示中为什么最大内存是64M? 尝试1:固定X...