自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

叉叉哥的BLOG

Python毁一生,Java穷三代,两者皆不沾,必成高富帅!

原创 Java try-with-resources 中的细节

在 Java 7 之前,程序中如果有需要关闭的资源,例如 java.io.InputStream、java.sql.Connection 等,通常会在 finally 中关闭,例如:InputStream inputStream = null;try { inputStream = new FileInputStream("/my/file"); // ...} catch (Exception e) { e.printStackTrace();} finally {

2020-07-29 14:52:27 44

原创 Java 8 Stream 总结

Stream 简介Stream 是什么Classes to support functional-style operations on streams of elements, such as map-reduce transformations on collections.Stream 是 Java 8 新特性,可对 Stream 中元素进行函数式编程操作,例如 map-reduc...

2020-04-24 11:00:26 165

原创 Java 8 函数式编程:Lambda 表达式和方法引用

背景在很多其他语言中,函数是一等公民。例如 JavaScript 中,函数(Function)和字符串(String)、数字(Number)、对象(Object)等一样是一种数据类型。可以这样定义函数:var myFunction = function () { doSomething();};也可以将函数作为参数:setTimeout(function() { do...

2020-04-23 18:19:17 925

原创 Zipkin架构

代码埋点 instrumentation:BraveJava 可以通过 Brave 来埋点:https://github.com/openzipkin/brave实现在各种开源组件(例如 HTTP Client、JDBC Driver、Dubbo 等)的埋点(instrumentation)上报例如有:brave-instrumentation-spring-webmvc Spri...

2020-03-26 15:24:03 225

原创 Spring Cloud Eureka 服务实现不停机(Zero-downtime)部署

问题互联网产品高速迭代,通常伴随着高频次的版本发布。部署新版上线需要重启服务,直接 kill 服务进程可能会造成服务短暂不可用,从而影响到正在使用的用户。Spring Cloud 项目中一般会用到 Ribbon 作为负载均衡,那么是不是只要保证每个服务部署多台服务器,发布时采用 Rolling Update 分批次部署,保证一部分服务器正常提供服务的同时发布另一部分服务器,Ribbon 就能自...

2020-03-25 11:55:17 503

原创 Spring Data Redis 如何将 RedisTemplate 注入为 ListOperations 类型

问题在 Spring Data Redis 官方文档中,可以看到这样一个常规用法:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-inst...

2020-03-12 18:04:25 336

原创 Nginx proxy_pass 后缀规则

proxy_pass 规则Note that in the first example above, the address of the proxied server is followed by a URI, /link/. If the URI is specified along with the address, it replaces the part of the request...

2019-10-23 23:01:03 272

原创 Nginx失败重试中的HTTP协议幂等问题: non_idempotent

Nginx通过反向代理做负载均衡时,如果被代理的其中一个服务发生错误或者超时的时候,通常希望Nginx自动重试其他的服务,从而实现服务的高可用性。实际上Nginx本身默认会有错误重试机制,并且可以通过proxy_next_upstream来自定义配置。如果不了解HTTP协议以及Nginx的机制,就可能在使用过程中遇到各种各样的坑。例如服务出现了错误或超时却未重试,或者一些例如创建订单或发送短信这...

2019-04-21 22:23:44 752

原创 Maven profile整合Spring profile

在Maven和Spring中,都有profile这个概念。profile是用于区分各种环境的,例如开发环境、测试环境、正式环境等。Maven的profile用于在打包时根据指定环境替换不同环境的配置文件配置,如数据库配置。Spring的Profile可以用于在不同的环境下加载不同的bean,例如@Profile注解。两者一个是Maven编译和打包时生效,另一个是运行时生效,默认是没有关联的,本文会...

2019-03-05 16:52:00 735

原创 利用X-Forwarded-For伪造客户端IP漏洞成因及防范

问题背景在Web应用开发中,经常会需要获取客户端IP地址。一个典型的例子就是投票系统,为了防止刷票,需要限制每个IP地址只能投票一次。如何获取客户端IP在Java中,获取客户端IP最直接的方式就是使用request.getRemoteAddr()。这种方式能获取到连接服务器的客户端IP,在中间没有代理的情况下,的确是最简单有效的方式。但是目前互联网Web应用很少会将应用服务器直接对外提...

2018-10-15 09:44:48 31629 5

原创 Apache Commons DbUtils整合Spring框架实现简单的CRUD

Commons DbUtils是Apache提供的一个对JDBC进行简单封装的开源工具类库,能够简化JDBC相关的开发。Commons DbUtils可以非常方便的整合Spring Framework,比较轻量级,执行SQL语句非常方便(特别是查询语句),可以代替Spring JdbcTemplate、MyBatis等数据库访问层技术。配置DbUtils通过QueryRunner类来执行S...

2018-08-31 15:43:52 1562 2

原创 去除Spring Security认证:Pre-Authentication配置

Spring Security官方文档对Pre-Authentication是这样解释的: There are situations where you want to use Spring Security for authorization, but the user has already been reliably authenticated by some external sy...

2018-05-27 22:51:25 6374

原创 ActiveMQ整合Spring JMS

JMS即Java消息服务(Java Message Service),是Java平台上的一套关于消息中间件的规范,或者说是一套统一的API。支持JMS的消息中间件有很多,ActiveMQ算是其中最常用的一个。JMS两种模型JMS支持以下两种模型,本文将会对这两种模型分别介绍如何整合Spring: - 点对点(Point-to-Point),对应的destination是Queue ...

2018-05-13 00:01:25 345

原创 开源异常管理平台JCatch

Githubhttps://github.com/wucao/JCatch什么是JCatch当程序发生异常(Exception), 处理方式一般是通过日志文件记录下来, 这种方式很容易被忽略, 而且查询起来比较麻烦.JCatch提供了一种方案, 当程序发生异常时, 通过JCatch平台接口提交到JCatch平台, 由JCatch平台统一管理所有异常, 这样可以方便查询, 并且JCatch平台提供异常

2017-11-17 11:11:32 1284 1

原创 Jetty/Tomcat + Nginx反向代理获取客户端真实IP、域名、协议、端口

问题Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()获取的域名、协议、端口都是Nginx访问Web应用时的域名、协议、端口,而非客户端浏览器地址栏上的真实域名、协议、端口。例如在某一台IP为10.4.64.22的服务器上,Jetty或者Tomcat端口号为

2017-06-26 11:32:58 6874 1

原创 MINA、Netty、Twisted一起学(十二):HTTPS

由于HTTPS协议是由HTTP协议加上SSL/TLS协议组合而成,在阅读本文前可以先阅读一下HTTP服务器和SSL/TLS两篇博文,本文中的代码也是由这两篇博文中的代码组合而成。HTTPS介绍上一篇博文中介绍了SSL/TLS协议,我们平时接触最多的SSL/TLS协议的应用就是HTTPS协议了,现在可以看到越来越多的网站已经是https开头了,百度搜索也由曾经的http改为https。有关百度为什么升

2017-02-28 12:33:18 1651

原创 MINA、Netty、Twisted一起学(十一):SSL/TLS

什么是SSL/TLS不使用SSL/TLS的网络通信,一般都是明文传输,网络传输内容在传输过程中很容易被窃听甚至篡改,非常不安全。SSL/TLS协议就是为了解决这些安全问题而设计的。SSL/TLS协议位于TCP/IP协议之上,各个应用层协议之下,使网络传输的内容通过加密算法加密,并且只有服务器和客户端可以加密解密,中间人即使抓到数据包也无法解密获取传输的内容,从而避免安全问题。例如广泛使用的HTTPS

2017-02-27 15:49:44 1514 1

原创 HTTPS配置入门:Nginx、Node.js配置HTTPS服务器

申请数字证书首先需要申请一个免费的数字证书,前提是有个域名,申请起来还是很方便的。例如可以在腾讯云申请:https://www.qcloud.com/product/ssl,具体申请步骤请参考腾讯云文档,本文不再详细介绍。当然还有收费的数字证书,土豪随意。数字证书申请成功后,下载下来,文件包含一个私钥(.key)和一个数字证书(.crt)。申请证书时需要制定域名,例如我自己的域名是gw2.vsgam

2017-02-22 17:47:26 7075

原创 Spring Session + Redis实现分布式Session共享

通常情况下,Tomcat、Jetty等Servlet容器,会默认将Session保存在内存中。如果是单个服务器实例的应用,将Session保存在服务器内存中是一个非常好的方案。但是这种方案有一个缺点,就是不利于扩展。目前越来越多的应用采用分布式部署,用于实现高可用性和负载均衡等。那么问题来了,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享?实际上实现Sessi

2016-09-30 00:10:25 71644 29

原创 Maven仓库搭建(二):GitHub、又拍云、七牛云存储

在上一篇博文中,主要介绍了Maven仓库搭建原理,除了Nexus外,随意使用一个HTTP服务器,例如Tomcat或Nginx,都可搭建一个自己的Maven仓库。无论是用Nexus还是HTTP服务器搭建Maven仓库,总归需要一台服务器,一台服务器需要花钱买和花时间维护,成本比较大。Nexus一般是公司用的比较多,个人不推荐使用。本文就是介绍一些适合个人搭建Maven仓库的方式,相对来说比Nexus更

2016-09-23 17:03:13 2599

原创 Maven仓库搭建(一):一台HTTP服务器即可(Tomcat、Apache或Nginx)

作为一个Java老程序员,多多少少都会有一些自己写的各种常用代码,如果每写一个项目都把这些代码拷贝一份到新项目比较麻烦的,打成jar包引入到项目会方便很多。如果想让这些jar包能通过Maven引入进项目,那就需要搭建Maven仓库。说到Maven仓库搭建,很多人第一想到的一般都是Nexus。Nexus的确是非常好的方案,但是总归需要一台服务器,一台服务器需要花钱买和花时间维护,成本比较大。Nexus

2016-09-22 18:22:20 15273 1

原创 云存储Java客户端上传文件

什么是云存储准确来说应该称为对象存储。云存储是比较流行的一种云服务,提供图片、视频等文件的存储服务。具有代表性的产品有:七牛云、阿里云对象存储OSS、又拍云、腾讯云对象存储服务COS。云存储能做什么打个比方,文件上传这种需求在开发中会经常遇到,例如开发一个BBS,用户会在帖子中插入图片、用户上传头像、上传视频、上传附件等。碰到此类需求,传统的做法是自备服务器和存储,将上传的文件存入自己的存储上,再来

2016-09-20 14:17:02 5454 3

原创 MyBatis Generator实现MySQL分页插件

MyBatis Generator是一个非常方便的代码生成工具,它能够根据表结构生成CRUD代码,可以满足大部分需求。但是唯一让人不爽的是,生成的代码中的数据库查询没有分页功能。本文介绍如何让MyBatis Generator生成的代码具有分页功能。MyBatis Generator结合Maven的配置和使用在实现分页之前,首先简单介绍MyBatis Generator如何使用。MyBatis Ge

2016-05-06 18:16:17 25552 7

原创 Maven profile结合Maven AntRun Plugin实现不同环境配置文件分离打包

在Java项目中通常会有各种配置文件,例如有xml、properties。在不同的环境下配置文件的内容可能会不一样,例如正式环境、测试环境、开发环境连的不是同一个数据库,访问的接口不一样,或者日志的级别不同。如果每次部署不同环境时都要改配置文件的各种配置是非常麻烦的。在这种情况下,可以将这些配置文为每个环境复制一个,分别配置不同的内容,打包部署时不同环境的包中打入对应的配置文件。

2016-05-05 23:56:41 12257 1

原创 Java线程池详解:ThreadPoolExecutor、Executors

在操作系统中,线程是一个非常重要的资源,频繁创建和销毁大量线程会大大降低系统性能。Java线程池原理类似于数据库连接池,目的就是帮助我们实现线程复用,减少频繁创建和销毁线程。ThreadPoolExecutorThreadPoolExecutor是线程池的核心类。首先看一下如何创建一个ThreadPoolExecutor。下面是ThreadPoolExecutor常用的一个构造方法:ThreadPo

2016-04-05 14:04:29 11595 4

原创 如何线程安全地遍历List:Vector、CopyOnWriteArrayList

遍历List的多种方式在讲如何线程安全地遍历List之前,先看看通常我们遍历一个List会采用哪些方式。方式一:for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i));}方式二:Iterator iterator = list.iterator();while(iterator.hasNext()) {

2016-04-03 19:18:24 10311 2

原创 Async.js解决Node.js操作MySQL的回调大坑

由于JavaScript语言异步特性,在使用Node.js执行很多操作时都会使用到回调函数,其中就包括访问数据库。如果代码中的业务逻辑稍微复杂一点,回调一层层嵌套,那么代码很容易进入Callback Hell,无论对写代码的人还是阅读代码的人,都是精神上的折磨。

2015-12-22 12:39:27 11997 1

原创 Java用WebSocket + tail命令实现Web实时日志

在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail -f或者taif命令。查看实时日志可能会需要首先SSH连上Linux主机,步骤很麻烦不说,如果是生产环境的服务器,可能还会控制各种权限。基于Web的实时日志可以解决这个问题。由于传统的HTTP协议是请求/响应模式,而实时日志需要不定时的持续的输出,由服务器主动推送给客户端浏览器。所以这里使用的是HTML5的WebSock

2015-11-25 19:59:42 23169 80

原创 Maven插件wagon-maven-plugin自动化部署Java项目到Linux远程服务器

通常情况下,程序开发完成后部署到线上Linux服务器,可能需要经历打包、将包文件传到服务器、SSH连上服务器、敲命令启动程序等一系列繁琐的步骤。实际上这些步骤都可以通过Maven的一个插件wagon-maven-plugin来自动完成。配置Linux服务器用户名和密码为了让wagon-maven-plugin插件能SSH连上Linux服务器,首先需要在Maven的配置文件settings.xml中配

2015-10-26 10:12:13 5577 2

原创 开源Java自动化部署平台JDeploy

JDeploy是Java + Shell实现的基于Linux系统的自动化、可视化的项目部署平台,能部署Java服务、Java Web项目,可以简化项目部署操作,无需繁琐的黑窗口SSH指令及Jenkins复杂的配置。传统部署方式:从SVN/GIT服务器检出代码->在IDE中打包->将包传到服务器->SSH连上服务器->敲指令启动/停止JDeploy部署:创建项目->一键部署/启动/停止 * 检出代码

2015-10-20 11:07:04 12639 1

原创 Java开发Web Service客户端技巧:wsimport、jaxws-maven-plugin、整合Spring

搭建一个简单的Web Service服务器要想跑Web Service客户端,前提是要有个Web Service服务器。如果你已经有Web Service服务器,那么可以跳过这一步。如果没有,可以使用JAX-WS搭建一个简单的Web Service服务器。@WebServicepublic class HelloWorld { public String sayHello(String na

2015-10-18 12:22:51 3525

原创 Spring Security Web应用入门环境搭建

在使用Spring Security配置Web应用之前,首先要准备一个基于Maven的Spring框架创建的Web应用(Spring MVC不是必须的),本文的内容都是基于这个前提下的。pom.xml添加依赖:除了Spring框架本身的一些依赖包,还需要在pom.xml中添加Spring Security的依赖包: org.springframework.security spri

2015-09-06 11:08:35 4481 3

原创 Maven生成可以直接运行的jar包的多种方式

Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in xxx.jar"(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。要想jar包能直接通过java -jar xxx.jar运行,需要满足:1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,这样才能确定程序的入口在哪里;2、要能

2015-08-07 18:56:21 160148 23

原创 Servlet 3 + Spring MVC零配置:去除所有xml

在一些基于Spring/Spring MVC的Java Web项目中,总是会有一些xml配置文件,如web.xml、applicationContext.xml等,本文的目标即消灭这些xml配置文件,用代码和注解来代替。由于本文是基于Servlet 3,所以首先需要准备支持Servlet 3的容器,例如Tomcat 7.0及以上版本、Jetty 8及以上版本。1、去除web.xml下面是一个典型的

2015-07-08 14:38:41 16970 10

原创 Nginx配置网站适配PC和手机

考虑到网站的在多种设备下的兼容性,有很多网站会有手机版和电脑版两个版本。访问同一个网站URL,当服务端识别出用户使用电脑访问,就打开电脑版的页面,用户如果使用手机访问,则会得到手机版的页面。

2015-06-29 14:59:00 13389 1

原创 Nginx的一些基本功能极速入门

本文主要介绍一些Nginx的最基本功能以及简单配置,但不包括Nginx的安装部署以及实现原理。废话不多,直接开始。1、静态HTTP服务器首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。配置:server { listen 80; # 端口号 location / { root /usr/share/nginx/html; #

2015-05-17 22:20:05 4623 5

原创 Spring MVC的Controller统一异常处理:HandlerExceptionResolver

出现异常并不可怕,可怕的是出现了异常,你却不知道,也没有进行异常处理。 Spring MVC的Controller出现异常的默认处理是响应一个500状态码,再把错误信息显示在页面上,如果用户看到这样的页面,一定会觉得你这个网站太LOW了。 要解决Controller的异常问题,当然也不能在每个处理请求的方法中加上异常处理,那样太繁琐。Spring MVC提供了一个HandlerException

2015-05-01 22:08:50 30049 1

原创 Jetty集群配置Session存储到MySQL、MongoDB

在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息。Session一般情况下是保存在服务器内存中。如果服务器重启,Session就会丢失。另外,如果是集群环境,一个Web应用部署在多台服务器上,一个用户多次请求可能会由不同的服务器来处理,Session如果保存在各自的服务器上,就无法共享了。

2015-01-30 09:20:48 4135

原创 Strophe.js连接XMPP服务器Openfire、Tigase实现Web私聊、群聊(MUC)

XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件、网络游戏聊天、Web聊天及Web消息推送、移动设备的消息推送等场景,例如Google的GTalk、《英雄联盟LOL》游戏聊天模块。由于在Web浏览器上的JavaScript不能直接处理TCP协议,所以XMPP服务器通常会提供BOSH(Bidirectional-streams Over Synchronous HTTP)接口,通过H

2015-01-13 10:51:35 15758 28

原创 Linux搭建XMPP服务器Tigase(Spark客户端测试)

Tigase是一个基于Java开发的XMPP服务器,类似于Openfire,可用于搭建一个即时通讯(Instant Messaging,简称IM)的平台。1、准备在安装Tigase之前,首先需要准备Java环境以及数据库(本文使用MySQL)。Tigase下载:https://projects.tigase.org/projects/tigase-server/files下载:tigase-ser

2014-11-07 13:41:28 9856 6

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