自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhoukun@Fly

用文字整理生命!

  • 博客(187)
  • 收藏
  • 关注

原创 利用Callable进行多线程查询数据,提高数据查询效率

前言最近在公司碰到这么一个需求,需要去1000多个数据库中统计数据,每次统计数据库中10多张表,当我们同事写出代码后,由于单线程去执行,效率有点慢,所以想出用多线程进行查询,这样以来可以提升一下查询效率。代码如下。封装线程查询类public class StatisticalUserBehaviorData implements Callable<List<Map<Stri...

2019-05-14 16:52:35 1943 2

原创 Nginx重试机制导致数据库出现重复记录

前言前几天正在升级发版项目的时候,发现一个很奇葩的问题,就是用户再浏览器里执行了一次http请求,结果后端服务器执行了两遍,如果这次请求是Insert操作,可想而知,数据库会多出一条一模一样的记录来。场景还原网关用Nginx做了反向代理和负载均衡,Nginx下挂着两台阿里云ECS服务器,每台机器上都装着Tomcat,用户打开浏览器,点击页面,访问后端接口,查看Nginx的access....

2019-01-02 17:06:04 2687 2

原创 组装树形结构数据功能封装

前言:由于上一篇博客只针对于实体TreeNode组装树形结构,但是实际开发中,我们对应数据表会创建很多实体来承载数据,反成不能每一种实体都需要写个递归或者循环的方法来组装数据结构吧?下面我将上一拼博客中的方法再进一步封装一下,封装成一个工具类,应对与所有的实体,但是这些实体中,必须含有HashSet类型的 children 成员变量,并生成 get set 方法;必须含有String类型的 i...

2018-11-13 18:58:24 1891

原创 组装树形结构数据,子节点去重!

TreeNode实体public class TreeNode { private String id; private String parentId; private HashSet&amp;amp;lt;TreeNode&amp;amp;gt; children; public TreeNode(String id, String parentId) { th...

2018-11-12 19:41:18 1793

原创 git 撤销命令、版本恢复命令

前言在使用git的时候难免手贱,有时候想撤销本地的修改,也就是工作区的修改,有时候想撤销暂存区的修改,有时候甚至想恢复某个版本。下面我简单的总结一下撤销和恢复版本的命令。1、撤销工作区的修改 1.1、`git checkout &amp;amp;lt;fileName&amp;amp;gt; 譬如:git checkout MyController.java` 1.2、说明:这个命令就是让这个...

2018-08-13 15:13:11 1414 3

原创 用泛型和反射给List中的数据排序

前言最近优化项目代码时,发现了很多重复的代码,都是给List中的数据做排序,只是List中存放的数据类型不一样,但是这些数据都有一个共同点,那就是里面的数据都有date字段和orderNum字段,例如,TestVo中就有date、orderNum等成员变量,OrderVo中也有date、orderNum成员变量,现在需要将List&amp;amp;amp;lt;TestVo&amp;amp;amp;gt; List&amp;amp;amp;lt;orderVo...

2018-06-06 17:24:07 713

原创 使用HttpURLConnection下载网络文件

前言:最近产品经理要分析用户的行为数据,于是让我将生产上的数据包都下载下来,用HttpURLConnection和Java的IO流,挺方便,下面简单介绍一下。下载代码public static void testDownLoad(){ BufferedInputStream bis =null; BufferedOutputStream bos...

2018-03-15 16:23:15 13504 5

原创 JVM内存分析

前言前些日子小编接到一个新活,生产环境的服务器内存经常爆满,还没有用多长时间了,内存就剩不下多少了,经理于是让我分析了一下JVM内存,找一找哪个对象占用内存大,有没有内存泄露的地方,以及哪个线程占用资源多等等。使用Jmap在线上分析首先,小编用jvm自带的工具jmap查了一下tomcat分配堆栈内存的一些信息。检查一下堆中老年代和新生代的使用情况,排查一下是否是分配的内存过少导致。过程如下1

2017-10-30 22:52:06 1343 5

原创 总结

时光匆匆啊

2017-08-31 10:33:47 557 8

原创 redis中的maxmemory

前言当redis中的存储数据的容量达到最大时,若果我们再往里面存储数据,redis在默认的配置下会抛出异常,那么当mem_used内存已经超过maxmemory,我们采取的措施是什么哪?清理策略1.volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放。2.allkeys-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据

2017-08-27 22:18:59 5966 10

原创 深入理解回调函数的使用

前言回调函数在框架中的使用是家常便饭,无论是前台框架还是后台框架,譬如,Jquery的Aajax函数就封装了回调的功能,Spring在整合Hibernate的时候也封装了回调的功能,那为什么要有回调那?回调函数到底有什么作用那?小编谈一下自己的见解。回调函数的作用为什么设置回调函数,这个问题困扰了好长一段时间,小编看了一些框架的源码后才恍然大明白,回调函数的作用。读者不用着急,先跟着我看个JS

2017-08-21 17:40:41 8322 9

原创 Java中的并发工具类--CyclicBarrie

需求三个子线程,每个子线程执行N个不同的任务,但是这三个子线程分别执行完第N-1个任务后,三个子线程的第N个任务需要同时执行,此时,CyclicBarrie就派上用场了。具体代码public class UseCyclicBarrier { static class Runner implements Runnable { private CyclicBarrier bar

2017-08-08 22:41:33 591 5

原创 jdk1.7与jdk1.8切换问题

前言在做不同的java项目时候,很可能来回切换jdk,由于小编的jdk1.7是安装版的,jdk1.8是绿色版的,当做不同的项目时候,就来回切换jdk了,遇到了一下问题。遇到的问题修改环境变量JAVA_HOME后,jdk还是切换不会来问题原因当系统安装jdk1.7后,系统默认会在C:\Windows\System32创建java.exe、javaw.exe和java

2017-08-07 10:01:43 10086 11

原创 java.io.IOException: invalid constant type: 15

小编最近将jdk1.7升级到jdk1.8后,当运行旧项目时,启动spring加载bean的时候报运行时异常,还以为spring哪配置出错了,检查了一遍发现没错,结果是jar版本问题,于是修改pom.xml文件,更新javassist的版本从3.15.0到3.18.2,此错误消失。<dependency><groupId>org.javassist</groupId><artifactId>ja

2017-08-03 09:09:09 7725 7

原创 Dubbox 构建Restful服务

Facade@Path("/sysUserService")@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})@Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})public interface SysUserFacade {

2017-08-02 21:38:56 1161 6

翻译 Json Web Token

Json Web token简介Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519),该token被设计为紧凑且安全的,JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。JWT

2017-07-29 23:35:31 1862 18

原创 《Shiro+Json Web Token》----用多线程优化登录

前言:在最近这个权限框架中,小编发现登录很慢,因为是框架启动后第一次登录,需要创建很多对象还有打通额外的链接,所以很慢,但是第二次登录就明显的快了。于是打开项目的源码,开始优化起来,在了解完大体的业务逻辑后,感觉能用上多线程,于是就测试了一下,发现挺管用,小编将经验分享给大家吧!使用的技术点SSMShiroJson Web TokenRedis登录的逻辑用户输入用户名和密码发送给后端

2017-07-26 21:05:47 6148 30

原创 windows环境下,点击tomcat的startup.bat闪退问题

前言最近在本地测试项目的时候,小编在本地解压了三个tomcat,需要将三个tomcat同时运行,可是当点击bin目录下的startup.bat时,黑框框出现闪退问题,以下是问题解决方案。更改端口号由于要同时运行三个tomcat,每个tomcat要运行在不同的端口上,所以要更改默认的配置文件-server.xml,这个配置文件在conf目录下面,更改的地方有一下几点。 1、<Server por

2017-07-15 21:52:43 4512 19

原创 《权限系列shiro+cas》----cas登录原理

前言这篇博客小编只是贴了两个cas官网上的两个原图,这两个图对于理解cas的单点登录很有帮助。不使用代理的登录时序图使用代理的登录时序图小结这两张图展示了cas的登录原理,里面用到了很多专业术语,有TGT,ST等等,将cas的登录原理总结成一句话,就是几个cookie和几个session之间的关系。

2017-07-09 10:50:01 4145 17

原创 《权限系列shiro+cas》----修改cas的默认登录页

前言cas的默认登录页相对来说不怎么友好,我们可以自己定做。cas原始登录页面 修改步骤上面的页面就是cas\WEB-INF\view\jsp\default\ui\casLoginView.jsp,修改配置文件CAS所有的界面位置都是在cas.properties(具体位置:cas\WEB-INF\cas.properties)中指定的。我们打开这个文

2017-07-01 11:36:57 2085 12

原创 《权限系列shiro+cas》----Cas服务端的配置

前言小编用的casServer版本是4.0的,在4.0之后cas做了升级,据说变化很大,大家如果有兴趣可以到cas的官网查看。下面的所有操作都时在源码中cas文件夹中操作的。源码地址点击这里,去小编的GitHub上下载源码去掉Https协议小编做的项目是企业内部使用的,如果此项目放到外网上去访问,建议不要去掉https协议。下面是去掉https协议的教程。到weba

2017-06-27 23:36:38 3217 11

原创 《权限系列shiro+cas》----配置各个应用程序

前言shiro-cas-authority已经大体的介绍完毕,现在我们需要在各个应用程序之间来引用它实现权限管理。Cas客户端与服务端的配置cas的客户端在shiro-cas-authority已经配置完成,我们配置cas的服务端时,可以将在源码上下载下来的cas文件夹放在tomcat的webapps目录下,然后启动tomcat,这样cas的服务端就生效了。 源码地

2017-06-27 23:35:54 3811 11

原创 《权限系列shiro+cas》---封装公共验证模块

前言小编最近正在优化权限框架,应对的需求是:在一个分布式系统中,要有单点登录功能,还得有集中的权限认证。于是技术选型就找到了shiro和Cas,shiro是Apache旗下的开源授权框架,而Cas是Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO)。做授权的框架还有Spring Security,置于Spring Se

2017-06-27 23:35:24 7578 15

原创 《权限系列》----用redis存储HashMap

前言废话不多说,直接上代码。spring配置文件中,redis的配置<!-- 配置redis客户端单机版 --><bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg name="host" value="192.168.141.128"></constructor-arg> <c

2017-06-27 00:49:41 8992 11

原创 《权限系列》----用SpringAop控制权限二

前言接着上一篇博客说,下面该贴切面代码了。切面代码public class PermissionAspect {@Resourceprivate CheckAuthorityService checkAuthorityService; public void doBefore(JoinPoint jp) throws IOException{ Method soruceMet

2017-06-27 00:40:32 924 6

原创 《权限系列》----用SpringAop控制权限一

前言在一些公司内部用的局域网项目中,常常用SpringAop来控制权限,这种控制权限的方式实现起来相对简单,原理是自定义一个注解,然后定义一个切面,再加一个拦截器,当我们每次访问后台数据时,用拦截器判断用户是否登录(session是否存在),然后利用SpringAop的前置通知判断用户访是否有权限访问此方法。主要技术SpringMvc+Spring+MyBatis项目源码点击这里,到gith

2017-06-26 23:50:34 1769 7

原创 Url权限匹配方式调优

前言最近一直做权限框架的优化,在此期间优化了不同权限框架的不同代码,有shiro-cas的,还有SpringAop的,现在小编说一下自己在项目中是如何优化权限字符串的匹配过程。需求不同的用户对应着不同的角色,不同的角色拥有不同的资源,小编的项目中的资源是一些具体的Url,现在项目中的权限是这么做的,当用户访问某个资源时,系统会拿着目标资源去和该用户拥有的资源一一去匹配,用户的资源是放在List

2017-06-13 00:06:26 1702 12

原创 解决Sping Mvc中post、get请求中文乱码问题

前言无论是提交表单,还是利用URL穿参时,只要参数中有中文,若果在程序中不做相应的处理的话,我们在java后台接收参数时就会出现中文乱码问题。解决post请求乱码问题在web.xml中配置Sping的CharacterEncodingFilter,这是个过滤器,可以解决post请求乱码问题。filter> filter-name>CharacterEncodin

2017-05-26 08:38:27 925 11

原创 Sping Mvc中Http请求返回String中文乱码问题深度解析

前言在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制,就是Spring3.x中新引入的HttpMessageConverter即消息转换器机制。而这种消转换机制的原理是什么,大家可以去具体的分析一下SpringMvc的源码。HttpMessageConverter机制大致原理当

2017-05-23 18:04:55 3177 8

原创 《zookeeper》---原生原生API中的watch机制二

前言上篇文章小编利用原生zookeeper简单的封装了一些CRUD的方法,紧接着这篇文章介绍Watch机制的原理。监控节点创建public static void main(String[] args) throws Exception { // 建立watcher ZooKeeperWatcher zkWatch = new ZooKeeperWatche

2017-05-12 16:44:14 759 6

原创 《zookeeper》---原生原生API中的watch机制一

前言当Znode发生增加,删除,修改,以及其子Znode发生变化时,服务端可以通过Watch机制通知到客户端。那么要实现Watch,就必须实现org.apache.zookeeper.Watcher接口,重写process方法,并且将实现类的对象传入到可以Watch的方法中,这样就能实现客户端监控服务端的Znode上的一些动态变化了。那么,在原生zookeeper的API中watch机制是怎

2017-05-07 11:46:03 1129 3

原创 《ZooKeeper》---原生的API中的增删改查操作

前言上一篇文章中,小编简单的介绍了zookeeper集群的搭建,这篇文章了,小编继续带读者探索zookeeper的基本操作。在zookeeper的原生的API中,他的增删改查操作都有同步和异步的两种方式,下面是具体的代码。1、建立连接/** zookeeper地址 */static final String CONNECT_ADDR = "192.168.141.140:2181,192.16

2017-04-30 10:56:02 1076 14

原创 ZooKeeper集群搭建

ZooKeeper简介ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。搭建zookeeper集群,我们需要提前安装好jdk,这里jdk的安装以及环境变量的配置,小编不在阐述了。集群搭建过程小编利

2017-04-29 21:09:07 572 15

原创 递归删除资源树

前言最近项目里有这么一个需求:现在有一个用Ztree编写的资源树,当删除资源树的某个节点时,则将此节点下面的所有节点全部删除,这里显然就用到了递归;若此节点被删除后无其它的兄弟节点了,我们还需要将其父节点更新成新的子节点。代码中用到的技术小编操作数据库用的是mybatis,大部分操作直接使用的mybatis的逆向工程,至于mapper的注入,我就不贴代码了。1、删除节点的入口public v

2017-04-28 09:14:02 5783 19

原创 mysql中索引长度与区分度的选择

问题背景现在有这么一个需求,比如说商品表中的商品名称和商品描述两个字段,有时候我们根据商品名称或者描述来查询商品,但是所有的名称或者商品描述又不同,其内容长度又长短不一,但是商品名称或者描述又是经常查询的字段,我们怎样给商品描述或者商品名称添加索引哪?也就是说在商品名称或者商品描述上面的索引长度应该设置多长最合适哪?区分度与索引长度的权衡索引长度越低,索引在内存中占的长度越小,排序越快,然而区

2017-04-01 14:36:04 8181 12

原创 《SpringMvc》---实现JSON数据交互

前言现在企业中好多项目都用Json传送数据,因为Json在企业开发中已经作为通用的接口参数类型,并且Json数据在页面(客户端)解析很方便。下面是Json的定义形式。var obj={”name”:”张三”,”age”:12}Json数据解析形式:obj.name现在有两种需求:前台Jsp向Handler中传递Json数据,Handler向前台返回Json数据。

2017-03-27 08:04:56 1263 13

原创 SpringMvc绑定字符串数组和List参数

前言上篇文章小编简单介绍了SpringMvc中默认支持的参数绑定和pojo参数绑定,现在小编继续介绍字符串数据和List绑定。1、字符串数组需求当我们在页面批量删除table中的数据的时候,往往是先获取table中每一行数据的id,然后将id传到后台,最后在数据库中删除,下面以删除学生为例。jsp代码form action="deletestu.action"

2017-03-20 21:34:37 6381 13

原创 《SpringMvc》----请求参数的绑定1

前言SpringMvc是Spring的一个模块,现在在企业中的应用已经超过Struts2,顾名思义,SpringMvc也遵循一种MVC设计模式,当页面与后台交互的时候,用到了参数的绑定,下面小编利用项目中的经验,简单的总结一下SpringMvc中请求参数的绑定。一、SpringMvc开发步骤引入必要的jar包此处省略…….配置前端控制器<!-- 前端控制器 --><servlet>

2017-03-15 11:37:41 593 14

原创 《权限控制系列3》----利用拦截器匹配URL

前言权限的粒度可以细细的划分,甚至可以划分到代码中的每个方法上面,只要用户没有权限访问某个CRUD的方法,我们可以将其拦截。总体思路添加全局的拦截器,拦截用户的请求,判断用户是否有请求此方法的权限,若用户有权限,则放行,若用户没有权限,则拦截,提示用户没有权限使用此功能。自定义注解代码@Retention(RetentionPolicy.RUNTIME)pub

2017-03-05 09:30:42 1479 10

原创 《权限控制系列2》------防止用户跳过登录页面和Session时长问题

前言上一篇文章,小编主要介绍了Jquery的Ztree动态菜单的生成问题,这只是表面上控制住了用户的权限,相信任何AO系统都有登录页面,假如用户跳过登录页面直接访问系统的资源,岂不是很危险。下面小编继续介绍一下粗粒度的权限控制,利用Session判断用户是否登录。需要解决的问题每次请求都需要判断用户是否已经登录。用户登录后Session信息不能永久在服务器上存着。总体

2017-02-21 10:23:40 2864 14

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除