gaojingsong http://doc.okbase.net/gaojingsong 百度云消息推送 http://doc.okbase.net/gaojingsong/archive/307067.html gaojingsong 2018/11/5 8:06:33
import com.baidu.yun.core.log.YunLogEvent;
import com.baidu.yun.core.log.YunLogHandler;
import com.baidu.yun.push.auth.PushKeyPair;
import com.baidu.yun.push.client.BaiduPushClient;
import com.baidu.yun.push.constants.BaiduPushConstants;
import com.baidu.yun.push.exception.PushClientException;
import com.baidu.yun.push.exception.PushServerException;
import com.baidu.yun.push.model.PushMsgToAllRequest;
import com.baidu.yun.push.model.PushMsgToAllResponse;

public class AndroidPushMsgToAll {
	public static void main(String[] args) 
			throws PushClientException,PushServerException {
		// 1. get apiKey and secretKey from developer console
		String apiKey = "3=**********tyobdGq";
		String secretKey = "*********oI=IeRlPZQ";
		PushKeyPair pair = new PushKeyPair(apiKey, secretKey);

		// 2. build a BaidupushClient object to access released interfaces
		BaiduPushClient pushClient = new BaiduPushClient(pair,
				BaiduPushConstants.CHANNEL_REST_URL);

		// 3. register a YunLogHandler to get detail interacting information
		// in this request.
		pushClient.setChannelLogHandler(new YunLogHandler() {
			@Override
			public void onHandle(YunLogEvent event) {
				System.out.println(event.getMessage());
			}
		});

		try {
			// 4. specify request arguments
			PushMsgToAllRequest request = new PushMsgToAllRequest()
					.addMsgExpires(new Integer(3600)).addMessageType(0)
					.addMessage("Hello Baidu push,http://gaojingsong.iteye.com/") //添加透传消息
					.addSendTime(System.currentTimeMillis() / 1000 + 120) // 设置定时推送时间,必需超过当前时间一分钟,单位秒.实例2分钟后推送
					.addDeviceType(3);
			// 5. http request
			PushMsgToAllResponse response = pushClient.pushMsgToAll(request);
			// Http请求结果解析打印
			System.out.println("msgId: " + response.getMsgId() + ",sendTime: "
					+ response.getSendTime() + ",timerId: "
					+ response.getTimerId());
		} catch (PushClientException e) {
			if (BaiduPushConstants.ERROROPTTYPE) {
				throw e;
			} else {
				e.printStackTrace();
			}
		} catch (PushServerException e) {
			if (BaiduPushConstants.ERROROPTTYPE) {
				throw e;
			} else {
				System.out.println(String.format(
						"requestId: %d, errorCode: %d, errorMessage: %s",
						e.getRequestId(), e.getErrorCode(), e.getErrorMsg()));
			}
		}
	}
}

推送分析:

 

推送结果查看

 
  • 大小: 107.8 KB
  • 大小: 84.6 KB
]]> 【JAVA之反射方法的应用】 http://doc.okbase.net/gaojingsong/archive/306807.html gaojingsong 2018/11/2 8:20:09

JAVA之反射的应用

import java.util.HashMap;
import java.util.Map;

public class Child extends Parent {

	public int add(int a,int b){
		return a+b;
	}
	
	public HashMap add(Student stu){
		Map ma = new HashMap();
		ma.put("stu", stu);
		return (HashMap) ma;
	}
	public Child(){
		super();
		Object obj = "Child()";
		System.out.println(obj);
		//super();
	}
	
	
	@Override
	public String handler(Object obj) {
		obj = "Child:"+obj;
		System.out.println(obj);
		super.handler(obj);
		return null;
		
		
//		return super.handler(obj);
	}

	
	public static void main(String[] args) {
		Child child = new Child();
		child.handler("test");
	}
}
Student类:

public class Student {

	private String name;
	
	private int age;

	public Student() {
	}
	
	
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}


	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
}

 
  • 大小: 64.5 KB
]]> 【JAX-RS 介绍】 http://doc.okbase.net/gaojingsong/archive/306448.html gaojingsong 2018/10/29 8:05:57

Java Web有很多成熟的框架,主要可以分为两类Web Application和Web Services。用于Web Application的框架包括官方的Servlet/JSP, JSTL/JSF以及第三方Struts/Spring MVC(action-based)。Web Services的项目又可以分为基于XML的(SOAP/WSDL)的和基于JSON的,Java Communitiy为这两种方式都定义了标准,Java EE5引入了JAX-WS(Java API for XML Web Services)-JSR224,Java EE6引入了JAX-RS(Java API for RESTful Web Services)-JSR331。RESTful Service由于轻量,好测试,有弹性等特点,越来越受欢迎。Jersey,RESTEasy都是JAX-RS标准的具体实现。

 

 

JAX-RS和所有JAVA EE的技术一样,只提供了技术标准,允许各个厂家有自己的实现版本,实现版本有:RESTEasy(JBoss), Jersey(Sun提供的参考实现), Apache CXF, Restlet(最早的REST框架,先于JAX-RS出现), Apache Wink。JAX-RS基于JavaEE的Servlet。标准中定义的注解大大简化资源位置和参数的描述,仅仅使用注解就可以将一个POJO java类封装成一个Web资源。JAX-RS也有类似于Spring依赖注入的方式,减少类之间的耦合度。

 

 

常见的类型有:

@Path,标注资源类或者方法的相对路径

@GET,@PUT,@POST,@DELETE,标注方法是HTTP请求的类型。

@Produces,标注返回的MIME媒体类型

@Consumes,标注可接受请求的MIME媒体类型

 

@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,

 

@PathParam来自于URL的路径,

 

@QueryParam来自于URL的查询参数,

 

@HeaderParam来自于HTTP请求的头信息,

 

@CookieParam来自于HTTP请求的Cookie。

 

]]> 【JAVA之获取Class对象的三种方式】 http://doc.okbase.net/gaojingsong/archive/305767.html gaojingsong 2018/10/22 8:04:21

//第一种方式获取Class对象  

Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。

Class stuClass = stu1.getClass();//获取Class对象

System.out.println(stuClass.getName());

 

//第二种方式获取Class对象

Class stuClass2 = Student.class;

System.out.println(stuClass == stuClass2);//判断第一种方式获取的Class对象和第二种方式获取的是否是同一个

 

//第三种方式获取Class对象

Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名

System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象

 

注意:在运行期间,一个类,只有一个Class对象产生。

三种方式常用第三种,

第一种对象都有了还要反射干什么。(对象.getClass()

第二种需要导入类的包,依赖太强,不导包就抛编译错误。(类.class;)

一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。(Class.forName

]]>
【二维码QRious 介绍】 http://doc.okbase.net/gaojingsong/archive/305697.html gaojingsong 2018/10/21 8:19:08

二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

 

二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

 

二维码优势

信息容量大, 可以容纳多达1850个大写字母或2710个数字或500多个汉字

应用范围广, 支持文字,声音,图片,指纹等等...

容错能力强, 即使图片出现部分破损也能使用

成本低, 容易制作

 

二维码容错级别

L级(低) 7%的码字可以被恢复。

M级(中) 的码字的15%可以被恢复。

Q级(四分)的码字的25%可以被恢复。

H级(高) 的码字的30%可以被恢复。




 
 

 

QRious is a pure JavaScript library for generating QR codes using HTML5 canvas.

qrious是一款基于HTML5 Canvas的纯JS二维码生成插件。通过qrious.js可以快速生成各种二维码,你可以控制二维码的尺寸颜色,还可以将生成的二维码进行Base64编码。

  • 大小: 169 KB
]]> 【JWT 介绍】 http://doc.okbase.net/gaojingsong/archive/305475.html gaojingsong 2018/10/18 8:10:11

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

 

基于session认证所显露的问题

Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。

 

扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。

 

CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。

 

基于token的鉴权机制

基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

 

流程上是这样的:

1)用户使用用户名密码来请求服务器

2)服务器进行验证用户的信息

3)服务器通过验证发送给用户一个token

4)客户端存储token,并在每次请求时附送上这个token值

 

 

JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。

 

JWT的构成

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

 

header

jwt的头部承载两部分信息:

声明类型,这里是jwt

声明加密的算法 通常直接使用 HMAC SHA256

 

 

playload

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

 

标准中注册的声明

公共的声明

私有的声明

标准中注册的声明 (建议但不强制使用) :

 

iss: jwt签发者

sub: jwt所面向的用户

aud: 接收jwt的一方

exp: jwt的过期时间,这个过期时间必须要大于签发时间

nbf: 定义在什么时间之前,该jwt都是不可用的.

iat: jwt的签发时间

jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

公共的声明 :

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

 

私有的声明 :

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

 

 

signature

jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

 

header (base64后的)

payload (base64后的)

secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

]]>
【java之Undertow介绍】 http://doc.okbase.net/gaojingsong/archive/304248.html gaojingsong 2018/9/28 8:17:27
  • Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器
  • Untertow 的特点:
    • 轻量级:它是一个 Web 服务器,但不像传统的 Web 服务器有容器概念,它由两个核心 Jar 包组成,加载一个 Web 应用可以小于 10MB 内存
    • Servlet3.1 支持:它提供了对 Servlet3.1 的支持
    • WebSocket 支持:对 Web Socket 完全支持,用以满足 Web 应用巨大数量的客户端
    • 嵌套性:它不需要容器,只需通过 API 即可快速搭建 Web 服务器
  • 默认情况下 Spring Cloud 使用 Tomcat 作为内嵌 Servlet 容器,可启动一个 Tomcat 的 Spring Boot 程序与一个 Undertow 的 Spring Boot 程序,通过 VisualVM 工具进行比较,可看到 Undertow 性能优于 Tomcat

 

 

Undertow是一个用java编写的、灵活的、高性能的Web服务器,提供基于NIO的阻塞和非阻塞API。

Undertow的架构是组合式的,可以通过组合各种小型的目的单一的处理程序来构建Web服务器。所以可以很灵活地的选择完整的Java EE servlet 3.1容器或初级非阻塞程序处理。

Undertow的设计是可以完全可嵌入的,具有简单易用的编译接口。Undertow的生命周期完全由嵌入的应用程序控制。

Undertow是JBoss赞助的一个Web服务器,是Wildfly应用程序服务器中的默认Web服务器。

Undertow的特点:

  • 非常轻量级,Undertow核心瓶子在1Mb以下。它在运行时也是轻量级的,有一个简单的嵌入式服务器使用少于4Mb的堆空间。
  • 支持HTTP升级,允许多个协议通过HTTP端口进行多路复用。
  • 提供对Web套接字的全面支持,包括JSR-356支持。
  • 提供对Servlet 3.1的支持,包括对嵌入式servlet的支持。还可以在同一部署中混合Servlet和本机Undertow非阻塞处理程序。
  • 可以嵌入在应用程序中或独立运行,只需几行代码。
  • 通过将处理程序链接在一起来配置Undertow服务器。它可以对各种功能进行配置,方便灵活。
]]>
【JAVA之获取客户端ip地址】 http://doc.okbase.net/gaojingsong/archive/303809.html gaojingsong 2018/9/22 9:48:24
    /***
     * 获取客户端ip地址(可以穿透代理)
     * @param request
     * @return
     */
    public static String getClientIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_FORWARDED");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_VIA");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("REMOTE_ADDR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }


]]>
【Docker VS 虚拟机】 http://doc.okbase.net/gaojingsong/archive/303178.html gaojingsong 2018/9/15 8:04:30

虚拟机具有完整的操作系统,其自身的内存管理通过相关的虚拟设备进行支持。 在虚拟机中,为用户操作系统和虚拟机管理程序分配有效的资源,从而可以在单台计算机(或主机)上并行运行一个或多个操作系统的多个实例。 每个客户操作系统都作为主机系统中的单个实体运行。 

 



 

Docker容器是使用Docker引擎而不是管理程序来执行的。 因此容器比虚拟机小,并且由于主机内核的共享,可以更快地启动,具有更好的性能,更少的隔离和更好的兼容性。 Docker容器能够共享一个内核并共享应用程序库,因此容器比虚拟机具有更低的系统开销,只要用户愿意使用单一平台来提供共享的操作系统,容器可以更快,更少资源。虚拟机可能需要几分钟才能创建并启动,而只需几秒钟即可创建并启动一个容器。与在虚拟机中运行应用程序相比,容器中包含的应用程序提供了卓越的性能。 

Docker 是 Golang 编写的

容器与虚拟机之间的区别主要在于,虚拟机管理程序对整个设备进行抽象处理,而容器只是对操作系统内核进行抽象处理。 

 

相对于虚拟机,docker还存在着以下几个缺点: 

1.资源隔离方面不如虚拟机,docker是利用cgroup实现资源限制的,只能限制资源消耗的最大值,而不能隔绝其他程序占用自己的资源。 

2.安全性问题。docker目前并不能分辨具体执行指令的用户,只要一个用户拥有执行docker的权限,那么他就可以对docker的容器进行所有操作,不管该容器是否是由该用户创建。比如A和B都拥有执行docker的权限,由于docker的server端并不会具体判断docker cline是由哪个用户发起的,A可以删除B创建的容器,存在一定的安全风险。 

3.docker目前还在版本的快速更新中,细节功能调整比较大。一些核心模块依赖于高版本内核,存在版本兼容问题

  • 大小: 465.3 KB
]]> 【ActiveMQ 两种消费模式】 http://doc.okbase.net/gaojingsong/archive/302751.html gaojingsong 2018/9/10 14:28:42

 

MQ:Message Queue 消息队列 作用:

MQ可以理解为现实生活中的邮局,当A给物品给B时,A无需直接去找B当面去将物品交给B,A可以通过邮局寄送,然后B通过查询快递信息(监听),知道物品达到邮局,然后B自己去邮局取即可。

 

 

消息队列的2种通信模式: 

point-to-point:点对点(queue)

特点:点对点并不是只A发送的消息只能指定B接收,而是只A发送的任意一条消息只能由一个人接收处理,也就是每条消息只能被消费一次。

1)一个消息只能被一个服务接收

2)消息一旦被消费,就会消失

3)如果没有被消费,就会一直等待,直到被消费

4)多个服务监听同一个消费空间,先到先得

 

 

publish/subscribe发布/订阅模式(topic)

特点:A发送的消息可以被所有监听A的对象的接收,就好比学校的广播,所有的学生都可以收听校园广播信息。

1)一个消息可以被多个服务接收

2)订阅一个主题的消费者,只能消费自它订阅之后发布的消息。

3)消费端如果在生产端发送消息之后启动,是接收不到消息的,除非生产端对消息进行了持久化(例如广播,只有当时听到的人能听到信息)

 

 

Queue模式:

点对点通信,每个消息只有一个消费者,消息保证送达,离线消费者可以在下次上线后收到之前积压的消息。

 

Topic模式:

普通订阅:

不区分消费者,当前有几个客户端在线,就发送几条广播给客户端。

 

持久订阅:

区分消费者,消费者在线则直接发送消息广播给消费者,消费者离线,只要该消费者有topic登记,就会为其保留消息直至其再次连接后一次性推送,消息可以积压。

]]>