1、JavaEE
文章平均质量分 60
周坤_66
代码是一种艺术
展开
-
利用Callable进行多线程查询数据,提高数据查询效率
前言最近在公司碰到这么一个需求,需要去1000多个数据库中统计数据,每次统计数据库中10多张表,当我们同事写出代码后,由于单线程去执行,效率有点慢,所以想出用多线程进行查询,这样以来可以提升一下查询效率。代码如下。封装线程查询类public class StatisticalUserBehaviorData implements Callable<List<Map<Stri...原创 2019-05-14 16:52:35 · 2019 阅读 · 2 评论 -
《权限系列shiro+cas》----Cas服务端的配置
前言小编用的casServer版本是4.0的,在4.0之后cas做了升级,据说变化很大,大家如果有兴趣可以到cas的官网查看。下面的所有操作都时在源码中cas文件夹中操作的。源码地址点击这里,去小编的GitHub上下载源码去掉Https协议小编做的项目是企业内部使用的,如果此项目放到外网上去访问,建议不要去掉https协议。下面是去掉https协议的教程。到weba原创 2017-06-27 23:36:38 · 3288 阅读 · 11 评论 -
《权限系列shiro+cas》----配置各个应用程序
前言shiro-cas-authority已经大体的介绍完毕,现在我们需要在各个应用程序之间来引用它实现权限管理。Cas客户端与服务端的配置cas的客户端在shiro-cas-authority已经配置完成,我们配置cas的服务端时,可以将在源码上下载下来的cas文件夹放在tomcat的webapps目录下,然后启动tomcat,这样cas的服务端就生效了。 源码地原创 2017-06-27 23:35:54 · 3857 阅读 · 11 评论 -
《权限系列shiro+cas》---封装公共验证模块
前言小编最近正在优化权限框架,应对的需求是:在一个分布式系统中,要有单点登录功能,还得有集中的权限认证。于是技术选型就找到了shiro和Cas,shiro是Apache旗下的开源授权框架,而Cas是Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO)。做授权的框架还有Spring Security,置于Spring Se原创 2017-06-27 23:35:24 · 7617 阅读 · 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 · 9026 阅读 · 11 评论 -
《权限系列》----用SpringAop控制权限二
前言接着上一篇博客说,下面该贴切面代码了。切面代码public class PermissionAspect {@Resourceprivate CheckAuthorityService checkAuthorityService; public void doBefore(JoinPoint jp) throws IOException{ Method soruceMet原创 2017-06-27 00:40:32 · 952 阅读 · 6 评论 -
《权限系列》----用SpringAop控制权限一
前言在一些公司内部用的局域网项目中,常常用SpringAop来控制权限,这种控制权限的方式实现起来相对简单,原理是自定义一个注解,然后定义一个切面,再加一个拦截器,当我们每次访问后台数据时,用拦截器判断用户是否登录(session是否存在),然后利用SpringAop的前置通知判断用户访是否有权限访问此方法。主要技术SpringMvc+Spring+MyBatis项目源码点击这里,到gith原创 2017-06-26 23:50:34 · 1796 阅读 · 7 评论 -
《权限控制系列3》----利用拦截器匹配URL
前言权限的粒度可以细细的划分,甚至可以划分到代码中的每个方法上面,只要用户没有权限访问某个CRUD的方法,我们可以将其拦截。总体思路添加全局的拦截器,拦截用户的请求,判断用户是否有请求此方法的权限,若用户有权限,则放行,若用户没有权限,则拦截,提示用户没有权限使用此功能。自定义注解代码@Retention(RetentionPolicy.RUNTIME)pub原创 2017-03-05 09:30:42 · 1515 阅读 · 10 评论 -
Sping Mvc中Http请求返回String中文乱码问题深度解析
前言在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制,就是Spring3.x中新引入的HttpMessageConverter即消息转换器机制。而这种消转换机制的原理是什么,大家可以去具体的分析一下SpringMvc的源码。HttpMessageConverter机制大致原理当原创 2017-05-23 18:04:55 · 3213 阅读 · 8 评论 -
Url权限匹配方式调优
前言最近一直做权限框架的优化,在此期间优化了不同权限框架的不同代码,有shiro-cas的,还有SpringAop的,现在小编说一下自己在项目中是如何优化权限字符串的匹配过程。需求不同的用户对应着不同的角色,不同的角色拥有不同的资源,小编的项目中的资源是一些具体的Url,现在项目中的权限是这么做的,当用户访问某个资源时,系统会拿着目标资源去和该用户拥有的资源一一去匹配,用户的资源是放在List原创 2017-06-13 00:06:26 · 1736 阅读 · 12 评论 -
《权限系列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 · 2124 阅读 · 12 评论 -
《zookeeper》---原生原生API中的watch机制一
前言当Znode发生增加,删除,修改,以及其子Znode发生变化时,服务端可以通过Watch机制通知到客户端。那么要实现Watch,就必须实现org.apache.zookeeper.Watcher接口,重写process方法,并且将实现类的对象传入到可以Watch的方法中,这样就能实现客户端监控服务端的Znode上的一些动态变化了。那么,在原生zookeeper的API中watch机制是怎原创 2017-05-07 11:46:03 · 1150 阅读 · 3 评论 -
解决Sping Mvc中post、get请求中文乱码问题
前言无论是提交表单,还是利用URL穿参时,只要参数中有中文,若果在程序中不做相应的处理的话,我们在java后台接收参数时就会出现中文乱码问题。解决post请求乱码问题在web.xml中配置Sping的CharacterEncodingFilter,这是个过滤器,可以解决post请求乱码问题。filter> filter-name>CharacterEncodin原创 2017-05-26 08:38:27 · 954 阅读 · 11 评论 -
《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 · 786 阅读 · 6 评论 -
《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 · 1101 阅读 · 14 评论 -
ZooKeeper集群搭建
ZooKeeper简介ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。搭建zookeeper集群,我们需要提前安装好jdk,这里jdk的安装以及环境变量的配置,小编不在阐述了。集群搭建过程小编利原创 2017-04-29 21:09:07 · 593 阅读 · 15 评论 -
windows环境下,点击tomcat的startup.bat闪退问题
前言最近在本地测试项目的时候,小编在本地解压了三个tomcat,需要将三个tomcat同时运行,可是当点击bin目录下的startup.bat时,黑框框出现闪退问题,以下是问题解决方案。更改端口号由于要同时运行三个tomcat,每个tomcat要运行在不同的端口上,所以要更改默认的配置文件-server.xml,这个配置文件在conf目录下面,更改的地方有一下几点。 1、<Server por原创 2017-07-15 21:52:43 · 4549 阅读 · 19 评论 -
Json Web Token
Json Web token简介Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519),该token被设计为紧凑且安全的,JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。JWT翻译 2017-07-29 23:35:31 · 1932 阅读 · 18 评论 -
组装树形结构数据,子节点去重!
TreeNode实体public class TreeNode { private String id; private String parentId; private HashSet&amp;lt;TreeNode&amp;gt; children; public TreeNode(String id, String parentId) { th...原创 2018-11-12 19:41:18 · 1885 阅读 · 0 评论 -
组装树形结构数据功能封装
前言:由于上一篇博客只针对于实体TreeNode组装树形结构,但是实际开发中,我们对应数据表会创建很多实体来承载数据,反成不能每一种实体都需要写个递归或者循环的方法来组装数据结构吧?下面我将上一拼博客中的方法再进一步封装一下,封装成一个工具类,应对与所有的实体,但是这些实体中,必须含有HashSet类型的 children 成员变量,并生成 get set 方法;必须含有String类型的 i...原创 2018-11-13 18:58:24 · 1918 阅读 · 0 评论 -
git 撤销命令、版本恢复命令
前言在使用git的时候难免手贱,有时候想撤销本地的修改,也就是工作区的修改,有时候想撤销暂存区的修改,有时候甚至想恢复某个版本。下面我简单的总结一下撤销和恢复版本的命令。1、撤销工作区的修改 1.1、`git checkout &amp;lt;fileName&amp;gt; 譬如:git checkout MyController.java` 1.2、说明:这个命令就是让这个...原创 2018-08-13 15:13:11 · 1445 阅读 · 3 评论 -
用泛型和反射给List中的数据排序
前言最近优化项目代码时,发现了很多重复的代码,都是给List中的数据做排序,只是List中存放的数据类型不一样,但是这些数据都有一个共同点,那就是里面的数据都有date字段和orderNum字段,例如,TestVo中就有date、orderNum等成员变量,OrderVo中也有date、orderNum成员变量,现在需要将List&amp;amp;lt;TestVo&amp;amp;gt; List&amp;amp;lt;orderVo...原创 2018-06-06 17:24:07 · 732 阅读 · 0 评论 -
使用HttpURLConnection下载网络文件
前言:最近产品经理要分析用户的行为数据,于是让我将生产上的数据包都下载下来,用HttpURLConnection和Java的IO流,挺方便,下面简单介绍一下。下载代码public static void testDownLoad(){ BufferedInputStream bis =null; BufferedOutputStream bos...原创 2018-03-15 16:23:15 · 13652 阅读 · 5 评论 -
JVM内存分析
前言前些日子小编接到一个新活,生产环境的服务器内存经常爆满,还没有用多长时间了,内存就剩不下多少了,经理于是让我分析了一下JVM内存,找一找哪个对象占用内存大,有没有内存泄露的地方,以及哪个线程占用资源多等等。使用Jmap在线上分析首先,小编用jvm自带的工具jmap查了一下tomcat分配堆栈内存的一些信息。检查一下堆中老年代和新生代的使用情况,排查一下是否是分配的内存过少导致。过程如下1原创 2017-10-30 22:52:06 · 1373 阅读 · 5 评论 -
《Shiro+Json Web Token》----用多线程优化登录
前言:在最近这个权限框架中,小编发现登录很慢,因为是框架启动后第一次登录,需要创建很多对象还有打通额外的链接,所以很慢,但是第二次登录就明显的快了。于是打开项目的源码,开始优化起来,在了解完大体的业务逻辑后,感觉能用上多线程,于是就测试了一下,发现挺管用,小编将经验分享给大家吧!使用的技术点SSMShiroJson Web TokenRedis登录的逻辑用户输入用户名和密码发送给后端原创 2017-07-26 21:05:47 · 6179 阅读 · 30 评论 -
redis中的maxmemory
前言当redis中的存储数据的容量达到最大时,若果我们再往里面存储数据,redis在默认的配置下会抛出异常,那么当mem_used内存已经超过maxmemory,我们采取的措施是什么哪?清理策略1.volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放。2.allkeys-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据原创 2017-08-27 22:18:59 · 6083 阅读 · 10 评论 -
《Spring AOP》------简单入门
前言AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。SpringAop的意义:将除了核心业务以外的一些经常用原创 2016-11-18 10:07:01 · 1036 阅读 · 61 评论 -
深入理解回调函数的使用
前言回调函数在框架中的使用是家常便饭,无论是前台框架还是后台框架,譬如,Jquery的Aajax函数就封装了回调的功能,Spring在整合Hibernate的时候也封装了回调的功能,那为什么要有回调那?回调函数到底有什么作用那?小编谈一下自己的见解。回调函数的作用为什么设置回调函数,这个问题困扰了好长一段时间,小编看了一些框架的源码后才恍然大明白,回调函数的作用。读者不用着急,先跟着我看个JS原创 2017-08-21 17:40:41 · 8358 阅读 · 9 评论 -
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 · 10110 阅读 · 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 · 7755 阅读 · 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 · 1182 阅读 · 6 评论 -
Java中的并发工具类--CyclicBarrie
需求三个子线程,每个子线程执行N个不同的任务,但是这三个子线程分别执行完第N-1个任务后,三个子线程的第N个任务需要同时执行,此时,CyclicBarrie就派上用场了。具体代码public class UseCyclicBarrier { static class Runner implements Runnable { private CyclicBarrier bar原创 2017-08-08 22:41:33 · 612 阅读 · 5 评论 -
《权限系列shiro+cas》----cas登录原理
前言这篇博客小编只是贴了两个cas官网上的两个原图,这两个图对于理解cas的单点登录很有帮助。不使用代理的登录时序图使用代理的登录时序图小结这两张图展示了cas的登录原理,里面用到了很多专业术语,有TGT,ST等等,将cas的登录原理总结成一句话,就是几个cookie和几个session之间的关系。原创 2017-07-09 10:50:01 · 4173 阅读 · 17 评论 -
递归删除资源树
前言最近项目里有这么一个需求:现在有一个用Ztree编写的资源树,当删除资源树的某个节点时,则将此节点下面的所有节点全部删除,这里显然就用到了递归;若此节点被删除后无其它的兄弟节点了,我们还需要将其父节点更新成新的子节点。代码中用到的技术小编操作数据库用的是mybatis,大部分操作直接使用的mybatis的逆向工程,至于mapper的注入,我就不贴代码了。1、删除节点的入口public v原创 2017-04-28 09:14:02 · 5811 阅读 · 19 评论 -
《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 · 1284 阅读 · 13 评论 -
《Hibernate》------二级缓存
前言 Hibernate是一套ORM框架,在这我就不多说了,以前我们用JDBC编程的方式直接访问数据库,但是JDBC相对于Hibernate来说,JDBC没有做数据缓存,也没有做到面向对象得编程。JDBC在进行单表的增删改时,确实不如Hibernate开发效率高,但是使用JDBC后,程序的运行效率要比Hibernate高,毕竟JDBC面对的是直接的Sql语句,而Hibernate还要将操作翻译成S原创 2016-10-15 23:27:37 · 815 阅读 · 42 评论 -
《Java》----详解用apache的commons-fileupload组件实现文件上传
在web开发中,文件上传功能是很普遍的,我们最常见的就是上传图片了,还有上传Excel,今天小编给大家分享一下利用apache的组件实现文件上传功能。 文件上传总体思路 我们想要将磁盘上的文件上传到服务器上去,首先应该有一个管理磁盘文件的工具,当我们上传文件时,还要有一个负责上传文件和解析文件的工具,这两个工具就是apache提供的jar包,commons-fileupload原创 2016-09-27 11:13:33 · 4651 阅读 · 27 评论 -
《Java》——重构JDBC工具类
我们其实还可以将JDBC工具类进行重构,因为增删改我们是不需要返回结果集的,只有查询才返回结果集,用户得到想要的数据再进行处理。我们首先来重构增删改的功能。 1、将增删改封装成一个update方法 public class DBAssitst { private DataSource dataSouce; public DBAssitst(DataSource d原创 2016-09-25 16:54:30 · 782 阅读 · 17 评论 -
《Java》———JDBC的学习一
JDBC从物理结构上说就是Java语言访问数据库的一套接口集合。 从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。当Sun公司推出JDBC之后,我们对各种数据库的操作就变得统一了,相对轻松多了。下面我就介绍一下JDBC。 一、JDBC简介: JDBC:Java DataBase Connectivity,是SUN推出的操作数据库的规范。原创 2016-09-06 09:57:15 · 686 阅读 · 12 评论 -
《Java》——JDBC学习二
在上篇博客中,小编只是简单的介绍了JDBC的编码步骤和常用的几个对象以及方法,但是上篇博客的代码还存在问题,比如说,没有Statement接口执行效率问题,Sql注入问题,注册驱动时,还有创建链接时是硬编码,是写死在代码中的,不利于代码的扩展。 1、利用工厂+反射,使业务逻辑层和数据持久层解耦。 1.1、创建配置文dbcf.properties,我们将数据库配置信息存放在配置原创 2016-09-16 11:18:22 · 661 阅读 · 13 评论