gaojingsong http://doc.okbase.net/gaojingsong 【JAVA之Grizzly 介绍】 http://doc.okbase.net/gaojingsong/archive/265405.html gaojingsong 2017/9/8 8:06:42

Writing scalable server applications in the Java™ programming language has always been difficult. Before the advent of the Java New I/O API (NIO), thread management issues made it impossible for a server to scale to thousands of users. The Grizzly NIO framework has been designed to help developers to take advantage of the Java™ NIO API. Grizzly’s goal is to help developers to build scalable and robust servers using NIO as well as offering extended framework components: Web Framework (HTTP/S), WebSocket, Comet, and more!




Core Framework

Memory Management

I/O Strategies

Transports and Connections

FilterChain and Filters

Core Configuration

Port Unification

Monitoring

Best Practices

Quick Start

Samples

 

 

HTTP Components

Core HTTP Framework

HTTP Server Framework

HTTP Server Framework Extras

Comet

JAXWS

WebSockets

AJP

MAIN

 



 

核心框架

内存管理:Grizzly2.0引入了以可以在运行时(runtime)提高内存管理的子系统。该子系统包括三个主要构件:

缓冲区(Buffers)

ThreadLocal的内存池(ThreadLocal memory pools)

MemoryManager作为一个实用缓冲区和内存池工厂

I/O策略:通常我们使用一下两种方处理特定的NIO事件:在接收到的线程直接处理(Same-thread)或者交给工作线程处理(Worker-thread)。

Worker-thread IOStrategy

Same-thread IOStrategy

动态IOStrategy

Leader-follower IOStrategy

传输和连接:Transport和Connection是Grizzly2.3的核心网络API。

Transport定义了网络传输方式如TCP、UDP,包括相关资源(线程池、内存管理器等)和嵌套连接的缺省配置。

Connection在Grizzly2.3代表一个TCP或UDP的单一网络连接(很像socket)。

Transport和Connection是一对多的关系。

过滤器链和过滤器:过滤器链顾名思义就是多个过滤器组成链。每个过滤器表示一个要执行的处理单元,用于检查并(或)修改由FilterChainContext表示的一个事务的状态。

核心配置:核心框架配置的要点是Transport实例及其相关线程池。

端口统一:有时由于某些管理限制我们只能使用一个端口来发布多个服务,根据请求重定向到相应服务。Grizzly中的“端口统一”就是这个问题的解决方案。

监控:Grizzly提供了监控框架内部关键组件的功能,且允许通过自定义扩展监控组件。

 

HTTP组件

核心HTTP框架:Grizzly2.3 HTTP框架提供了服务器和客户端的编解码HTTP请求响应数据的功能。除了编解码器本身,框架还包括基本HTTP原语和简化协议相关工作的工具类。

HTTP服务器框架

简单的服务器API使Grizzly可以轻松嵌入应用程序。

类似Servlet规范的抽象:HttpHandler (Servlet), Request (HttpServletRequest), Response (HttpServletResponse)。

通过响应挂起/恢复机制提供处理长时间运行的HTTP事务的能力。

支持非阻塞IO流。

静态内容的使用文件缓存。

HTTP服务器框架扩展

Comet

JAXWS:从2.1.2版本开始Grizzly通过HTTP服务器框架支持JAX-WS web服务。

WebSockets:Grizzly实现了RFC 6455的要求,同时也支持此协议的旧版本。这对于没有实现最终草案规范的客户端很有用。

AJP:从2.1版本开始Grizzly开始支持AJP1.3。

SPDY:从2.3版本开始Grizzly支持SPDY/3。SPDY的目标是降低网页加载时间。

  • 大小: 99.7 KB
  • 大小: 361.2 KB
]]> 【java之Spray介绍】 http://doc.okbase.net/gaojingsong/archive/265404.html gaojingsong 2017/9/8 8:06:32

This is a implementation of a websocket server and client for the spray.io web toolkit. It is currently a work in progress, but it has a pretty comprehensive test suite that exercises a whole bunch of functionality. The server/client can:



 Spray是基于Akka之上的轻量级Scala库,提供对客户端与服务端REST/HTTP的支持。在使用上,大概可以将其视为Java平台下的Jersey;虽然它们的特性并不尽相同。从scala语言来看,它提供的Future与Promise可以较好地支持并发;而Akka的Actor模型无疑助推了Spray的并发处理性能。根据Spray官方网站的描述,它拥有如下的特性:

完全异步的,无阻塞的APIs

基于Actor与Future

高性能

轻量级

模块化

可测试性

 

 

Work under SSL (all the tests are done both in the clear and under SSL)

Handle fragmented messages (the server will buffer up a complete message before passing it to your frameHandler

Cut off messages which are too big (whether single-messages or fragmented)

Kill the connection when there's a protocol violation according to the websocket spec (probably doesn't account for everything at the moment)

Automatically respond to pings with pongs

Match up outgoing Pings and incoming Pongs to find round trip times

Automatically ping every client according to the autoPingInterval, using the pingGenerator to generate the body of each ping

Pass almost the entire Autobahn Test Suite

client-report.html and sever-report.html contain the Autobahn test reports for both the server and the client. The only tests currently failing are unicode strictness tests, which means the server isn't killing connections in the case of malformed unicode as strictly as it should.

  • 大小: 55.4 KB
]]> 【工作流引擎之Activiti 】 http://doc.okbase.net/gaojingsong/archive/265388.html gaojingsong 2017/9/8 8:02:18

Activiti is battle-tested Business Process Management. Organizations across the world depend on the open source platform in a huge range of demanding situations. It supports open standards with BPMN and DMN so you can create processes that suit you.

工作流(workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。(我的理解就是:将部分或者全部的工作流程、逻辑让计算机帮你来处理,实现自动化)



 

Activiti的创始人也就是JBPM(也是一个优秀的BPM引擎)的创始人,从Jboss离职后开发了一个新的BPM引擎:Activiti。所以,Activiti有很多地方都有JBPM的影子。所以,据说学习过JBPM的朋友学起Activiti来非常顺手。

Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。

Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。

Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。

 

关键对象

1.Deployment:流程部署对象,部署一个流程时创建。

2.ProcessDefinitions:流程定义,部署成功后自动创建。

3.ProcessInstances:流程实例,启动流程时创建。 

4.Task:任务,在Activiti中的Task仅指有角色参与的任务,即定义中的UserTask。 

5.Execution:执行计划,流程实例和流程执行中的所有节点都是Execution,如UserTask、ServiceTask等。



 

 

服务接口

1.ProcessEngine:流程引擎的抽象,通过它我们可以获得我们需要的一切服务。 

2.RepositoryService:Activiti中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据(例如BPMN2.0 XML文件,表单定义文件,流程定义图像文件等),这些文件都存储在Activiti内建的Repository中。RepositoryService提供了对 repository的存取服务。

3.RuntimeService:在Activiti中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。RuntimeService提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。

4.TaskService: 在Activiti中业务流程定义中的每一个执行节点被称为一个Task,对流程中的数据存取,状态变更等操作均需要在Task中完成。TaskService提供了对用户Task 和Form相关的操作。它提供了运行时任务查询、领取、完成、删除以及变量设置等功能。 

5.IdentityService: Activiti中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的Task。IdentityService提供了对Activiti 系统中的用户和组的管理功能。

6.ManagementService: ManagementService提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti系统的日常维护。 

7.HistoryService: HistoryService用于获取正在运行或已经完成的流程实例的信息,与RuntimeService中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。

  • 大小: 16.2 KB
  • 大小: 75 KB
]]> 【JAVA验证码之Kaptcha】 http://doc.okbase.net/gaojingsong/archive/265387.html gaojingsong 2017/9/8 8:02:04

Kaptcha是一个基于SimpleCaptcha的验证码开源项目。kaptcha 是一个非常实用的验证码生成工具。有了它,你可以生成各种样式的验证码,因为它是可配置的。kaptcha工作的原理是调用 com.google.code.kaptcha.servlet.KaptchaServlet,生成一个图片。同时将生成的验证码字符串放到 HttpSession中。

SimpleCaptcha is a Java library for generating CAPTCHA challenge/answer pairs. SimpleCaptcha is intended to be easy to implement and use sensible defaults, while providing easily-accesssible hooks for customization. Example implementations are provided in J2EE and Grails.

使用kaptcha可以方便的配置:

验证码的字体

验证码字体的大小

验证码字体的字体颜色

验证码内容的范围(数字,字母,中文汉字!)

验证码图片的大小,边框,边框粗细,边框颜色

验证码的干扰线(可以自己继承com.google.code.kaptcha.NoiseProducer写一个自定义的干扰线)

验证码的样式(鱼眼样式、3D、普通模糊……当然也可以继承com.google.code.kaptcha.GimpyEngine自定义样式)


配置文件详解 

<servlet>

<servlet-name>Kaptcha</servlet-name>

  <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>

  <!-- 设置是否有边框 -->

  <init-param>

   <param-name>kaptcha.border</param-name>

   <param-value>yes</param-value>

  </init-param>

  <!-- 设置边框颜色-->

  <init-param>

   <param-name>kaptcha.border.color</param-name>

   <param-value>105,179,90</param-value>

  </init-param>

  <!-- 获取中文 -->

  <init-param>

   <param-name>kaptcha.textproducer.impl</param-name>

   <param-value>org.cric.util.ChineseText</param-value>

  </init-param>

  <!-- 设置字体颜色 -->

  <init-param>

   <param-name>kaptcha.textproducer.font.color</param-name>

   <param-value>black</param-value>

  </init-param>

  <!-- 设置验证码宽度 -->

  <init-param>

   <param-name>kaptcha.image.width</param-name>

   <param-value>130</param-value>

  </init-param>

  <!-- 设置验证码高度 -->

  <init-param>

   <param-name>kaptcha.image.height</param-name>

   <param-value>44</param-value>

  </init-param>

  <!-- 设置字体大小 -->

  <init-param>

   <param-name>kaptcha.textproducer.font.size</param-name>

   <param-value>30</param-value>

  </init-param>

  <!-- 设置字体个数 -->

  <init-param>

   <param-name>kaptcha.textproducer.char.length</param-name>

   <param-value>4</param-value>

  </init-param>

  <!-- 设置字体样式 -->

  <init-param>

   <param-name>kaptcha.textproducer.font.names</param-name>

   <param-value>宋体,楷体,微软雅黑</param-value>

  </init-param>

 </servlet>

 

  • 大小: 12.4 KB
  • 大小: 9.9 KB
  • 大小: 52.5 KB
]]> 【Pushlet 介绍】 http://doc.okbase.net/gaojingsong/archive/265306.html gaojingsong 2017/8/27 9:31:10

Pushlet 是一个开源的 Comet 框架,Pushlet 使用了观察者模式:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。

 

 

server端向浏览器client发送通知这种通讯模式在J2EE应用中很常见,通常使用采用RMI、CORBA或者自定义TCP/IP信息的applet来实现。这些技术往往由于复杂而产生诸多不利之处:技术难以实现、存在防火墙限制(因为需要打开非HTTP的通讯端口)、需要额外的server开发和维护。并且除了刷新整个页面或者完全采用applet展示内容之外,很难找到别的方法将client端applet的状态和浏览器的页面内容集成在一起。

 

Pushlet是一种comet实现:在Servlet机制下,数据从server端的Java对象直接推送(push)到(动态)HTML页面,而无需任何Java applet或者插件的帮助。它使server端可以周期性地更新client的web页面,这与传统的request/response方式相悖。浏览器client为兼容JavaScript1.4版本以上的浏览器(如Internet Explorer、FireFox),并使用JavaScript/Dynamic HTML特性。而底层实现使用一个servlet通过Http连接到JavaScript所在的浏览器,并将数据推送到后者。有关JavaScript版本的知识请参看Mozilla开发中心提供的《JavaScript核心参考》和Stephen Chapman编写的《What Version of Javascript》。

 

这种机制是轻量级的,它使用server端的servlet连接管理、线程工具、javax.servlet API,并通过标准Java特性中Object的wait()和notify()实现的生产者/消费者机制。原则上,Pushlet框架能够运行在任何支持servlet的server上、防火墙的后面。当在client中使用JavaScript/DHTML时,Pushlet提供了通过脚本快速建立应用、使用HTML/CSS特性集成和布局新内容的便利方法。

 

 

原理

Pushlet的基本使用形式是极为简单的。后面的一些示例会说明这一点。

Pushlet基于HTTP流,这种技术常常用在多媒体视频、通讯应用中,比如QuickTime。与装载HTTP页面之后马上关闭HTTP连接的做法相反,Pushlet采用HTTP流方式将新变动的数据主动地推送到client(客户端),再此期间HTTP连接一直保持打开。有关如何在Java中实现这种Keep-alive的长连接请参看Sun提供的《HTTP Persistent Connection》和W3C的《HTTP1.1规范》。

 

 

解决方案

让我们对应用进行这样的假设:拥有一个Java web server或者Java应用server,我们试图从server发送通知给client端浏览器。这里的解决方案可以分为:“轮询(polling)”、“服务端回调(server-side callbacks)”和“消息(messaging)”三类。

 

轮询

最简单的解决方案便是“定时刷新页面”。在HTML文档的头部使用HTML META标签,页面便可以每隔N秒自动reload一次。如果在此期间server端数据发生变化,那么我们可以获得新的内容,否则将得到相同的页面。虽然方法很简单,但是如何设置刷新间隔是让人头疼的大问题。

服务器回调

因为我们是“身经百战”的Java开发老手,所以经常会用到“服务端回调”。这种方式通过RMI或者CORBA将Server端的对象传输到Java applet客户端。

 

消息(MOM)

这种解决方案采用一个作为client的applet,它使用TCP/IP或者无连接的UDP、甚至多播协议来建立与消息中间件server的通讯,然后由server推送消息给client。你可以从例如SoftWired的iBus、IBM的MQSeries、BEA的WebLogic Event这些消息产品中直接挑选,或者自己使用基于socket的 .ObjectStream定制开发消息软件。

 

讨论(MOM)

上面三种解决方案在复杂性、安全性、性能、可测量性、浏览器兼容性、防火墙限制上各有优势、劣势。最佳解决方案依赖于你的应用需求。例如,在共享白板应用中,用户需要直接与“状态”交互,那么server端回调或者消息很可能会大显身手。

但在浏览器环境下,除非完全使用applet作为整个client应用,否则把来自于server的更新信息集成到页面中并非易事。如何在applet收到回调或者消息时变更页面相关内容?一个很“痛快”而又“痛苦”的解决方案就是在回调方法中使用AppletContext.showDocument(URL)方法来刷新整个页面。

 

由于HTML代码可以直接影响页面布局,直接使用来自server的数据更改HTML部分内容不是更好吗?这是web应用的理想方案,在server上内容动态改变时,从用户到server所需的交互是最小化的。作为对上面的解决方案的补充,我开发了Pushlet这种轻量级、瘦客户端的技术,它无需applet或者插件而直接与脚本/HTML集成在一起、使用标准HTTP连接、理论上可以部署到任何支持Java servlet的server上。但这并不意味着它将替换对前面解决方案,而是在你的开发“工具箱”中添加另一种选择。作为Java构架者/开发者,你可以自行权衡、选择、决定哪种适合应用的解决方案。

]]>
【JAVA EE之基础面试题】 http://doc.okbase.net/gaojingsong/archive/265244.html gaojingsong 2017/8/14 12:42:36

永久链接: http://gaojingsong.iteye.com/blog/2386483

预览文章: 【JAVASE基础面试题】 

 

1、网络编程(Socket/DatagramSocket/ServerSocketChannel )

Socket通信的步骤

 ① 创建ServerSocket和Socket

 ② 打开连接到Socket的输入/输出流

 ③ 按照协议对Socket进行读/写操作

 ④ 关闭输入输出流、关闭Socket

服务器端:

 ① 创建ServerSocket对象,绑定监听端口

 ② 通过accept()方法监听客户端请求

 ③ 连接建立后,通过输入流读取客户端发送的请求信息

 ④ 通过输出流向客户端发送乡音信息

 ⑤ 关闭相关资源

客户端:

 ① 创建Socket对象,指明需要连接的服务器的地址和端口号

 ② 连接建立后,通过输出流想服务器端发送请求信息

 ③ 通过输入流获取服务器响应的信息

 ④ 关闭响应资源 

 

应用多线程实现服务器与多客户端之间的通信

① 服务器端创建ServerSocket,循环调用accept()等待客户端连接

② 客户端创建一个socket并请求和服务器端连接

③ 服务器端接受苦读段请求,创建socket与该客户建立专线连接

④ 建立连接的两个socket在一个单独的线程上对话

⑤ 服务器端继续等待新的连接      

 

 

DatagramSocket连接过程

服务器端实现步骤

① 创建DatagramSocket,指定端口号

② 创建DatagramPacket

③ 接受客户端发送的数据信息

④ 读取数据

客户端实现步骤

① 定义发送信息

② 创建DatagramPacket,包含将要发送的信息

③ 创建DatagramSocket

④ 发送数据

 

ServerSocketChannel 

http://gaojingsong.iteye.com/admin/blogs/2371061

http://gaojingsong.iteye.com/admin/blogs/2371060

 

2、TCP和UDP的区别

 

3、网络协议

 

4、Servlet生命周期与工作原理

http://gaojingsong.iteye.com/admin/blogs/2316060

 

5、网络七层模型与四层模型

 

6、Socket是什么?

 

7、socket的基本操作

 1、socket()函数

 2、bind()函数

 3、listen()、connect()函数

 4、accept()函数

 5、read()、write()函数等

 6、close()函数

 

 

8、TCPIP连接与断开过程(socket中TCP的三次握手建立连接详解/socket中TCP的四次握手释放连接详解网络中进程之间如何通信?)

提示:三次握手和四次断开

 

9、转发与重定向的区别

 

10、Http协议格式以及其包含的方法有哪些,以及方法之间的区别?

http://gaojingsong.iteye.com/blog/2317591

 

11、JSP的九大内置对象以及其作用域

http://gaojingsong.iteye.com/blog/2316067

 

12、常见的MVC模型

 

13、java解析XML(Dom/Sax/Dom4J/Xpull/JAXP  DocumentBuilderFactory)以及区别

DOM的基本对象有5个:Document,Node,NodeList,Element和Attr。

 

14、JNI的调用过程

 

15、文件上传与下载以及导入导出Excel

 

16、Ajax的原理以及跨域问题

 

17、使用Socket/URLConnection/HttpClient模拟Http请求/登录

http://gaojingsong.iteye.com/blog/2264395

 

18、RPC VS WebService以及其解决的是什么问题即为何使用它们

 

19、Session与Cookie的区别

 

20、闭包

 

21、反射以及为何使用反射

 

温馨提示:欢迎加群找群主索取答案(企鹅群516569942)

 

原创不易,欢迎打赏,请认准正确地址,谨防假冒



 

 


]]>
【OAUTH协议 介绍】 http://doc.okbase.net/gaojingsong/archive/265243.html gaojingsong 2017/8/14 12:42:24

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的简写。

 

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP、JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。互联网很多服务如Open API,很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。

在官方网站的首页,可以看到下面这段简介:

An open protocol to allow secure API authorization in a simple and standard method from web, mobile and desktop applications.

大概意思是说OAUTH是一种开放的协议,为桌面、手机或web应用提供了一种简单的,标准的方式去访问需要用户授权的API服务。OAUTH类似于Flickr Auth、Google's AuthSub 、Yahoo's BBAuth、 Facebook Auth等。

 

OAUTH协议特点

(1). 简单:不管是OAUTH服务提供者还是应用开发者,都很易于理解与使用;

(2). 安全:没有涉及到用户密钥等信息,更安全更灵活;

(3). 开放:任何服务提供商都可以实现OAUTH,任何软件开发商都可以使用OAUTH;

 

OAUTH原理

 

第一步:用户访问第三方网站,比如:就是你需要使用QQ进行登录的网站;

 

第二步:你点击QQ登录后,第三方网站将会连接并进行请求,比如:你点击登录后,第三方网站会跳转到QQ平台,提示你进行登录;

 

第三步:你要进行授权第三方网站对你的信息访问的一个权限,比如:当你QQ登录成功后,QQ会提示你,是否授权第三方Web访问你的用户基本信息或其他的资源信息,这时你点击授权即可;

 

第四步:授权后,第三方Web即可访问你刚才授权的资源信息,比如:你的QQ基本信息-头像、昵称、性别等。

 

相关术语

三个URL

Request Token URL: 获取未授权的Request Token服务地址;

User Authorization URL: 获取用户授权的Request Token服务地址;

Access Token URL: 用授权的Request Token换取Access Token的服务地址;


 第一步:网站向认证平台请求一个未授权的Token,这个Request Token Url是前面说的第一个Url;

 

第二步:跳转至用户授权页面,提示用户进行登录,并进行授权,返回获得已授权的Token,用到的User Authorization Url是前面说的第二个Url;

 

第三步:通过已授权的Token,向认证平台请求Access Token(数据令牌),用到的Request Access Url是前面说的第三个Url,返回后到这步整个认证流程就结束了,最后一步,是通过数据令牌等参数,调用接口获取用户信息,不完全算认证的流程。(我喜欢简洁明了,认证流程就是这样,相信通过图示及讲解都能明白,若有不明白之处请留言)

 

 

 

参数定义

OAUTH_consumer_key: 使用者的ID,OAUTH服务的直接使用者是开发者开发出来的应用。所以该参数值的获取一般是要去OAUTH服务提供商处注册一个应用,再获取该应用的OAUTH_consumer_key。

OAUTH_consumer_secret:OAUTH_consumer_key对应的密钥。

OAUTH_token:OAUTH进行到最后一步得到的一个“令牌”,通过此“令牌”请求,就可以去拥有资源的网站抓取任意有权限可以被抓取的资源。

OAUTH_token_secret:OAUTH_token对应的私钥。

OAUTH_signature_method: 请求串的签名方法,应用每次向OAUTH三个服务地址发送请求时,必须对请求进行签名。签名的方法有:HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种。

OAUTH_signature: 用上面的签名方法对请求的签名。

OAUTH_timestamp: 发起请求的时间戳,其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数。本次请求的时间戳必须大于或者等于上次的时间戳。

OAUTH_nonce: 随机生成的字符串,用于防止请求的重复,防止外界的非法攻击。

OAUTH_version: OAUTH的版本号。

 

 

响应代码

HTTP 400 Bad Request 请求错误

Unsupported parameter 参数错误

Unsupported signature method 签名方法错误

Missing required parameter 参数丢失

Duplicated OAUTH Protocol Parameter 参数重复

HTTP 401 Unauthorized 未授权

Invalid Consumer Key 非法key

Invalid / expired Token 失效或者非法的token

Invalid signature 签名非法

Invalid / used nonce 非法的nonce

 

 

认证流程

获取未授权的request token

请求参数:

OAUTH_consumer_key:消费方键值。

OAUTH_signature_method:消费方签署本请求所用的签名方法。

OAUTH_signature:签名,定义于签署请求 (签署请求)。

OAUTH_timestamp:定义于Nonceand Timestamp (单次值与时间戳)。

OAUTH_nonce:定义于Nonceand Timestamp (单次值与时间戳)。

OAUTH_version:可选。

额外参数:由服务提供方定义的任意额外参数

服务方返回结果,响应包含如下参数:

OAUTH_token:请求令牌

OAUTH_token_secret:令牌密钥

附加参数:由服务提供方定义的任意参数。

获取用户授权的request token

 

请求参数:

OAUTH_token:可选。在前述步骤中获得的请求令牌。服务提供方可以声明此参数为必须,也可以允许不包含在授权URL中并提示用户手工输入。

OAUTH_callback:可选。消费方可以指定一个URL,当 获取用户授权 (获取用户授权)成功后,服务提供方将重定向用户到这个URL。

附加参数:由服务提供方定义的任意参数。

服务提供方将用户引导回消费方

如果消费方在OAUTH_callback中提供了回调URL(在消费方引导用户至服务提供方 (消费方引导用户至服务提供方)中描述),则服务提供方构造一个HTTP GET请求URL,重定向用户浏览器到该URL,并包含如下参数:

OAUTH_token:被用户授权或否决的请求令牌

回调URL可以包含消费方提供的查询参数,服务提供方必须保持已有查询不变并追加OAUTH_token参数。

 

用授权的request token换取Access Token

消费方请求访问令牌参数:

OAUTH_consumer_key:消费方键值。

OAUTH_token:之前获取的请求令牌。

OAUTH_signature_method:消费方使用的签署方法。

OAUTH_signature:签署请求 (签署请求)中定义的签名。

OAUTH_timestamp:在单次值与时间戳 (单次值与时间戳)中定义。

OAUTH_nonce:在单次值与时间戳 (单次值与时间戳)中定义。

OAUTH_version:版本号,可选。

返回参数:

OAUTH_token:访问令牌。

OAUTH_token_secret:令牌密钥。

 

 

访问受保护资源

请求参数:

OAUTH_consumer_key:消费方键值。

OAUTH_token:访问令牌。

OAUTH_signature_method:消费方使用的签署方法。

OAUTH_signature:签署请求 (签署请求)中定义的签名。

OAUTH_timestamp:定义于单次值与时间戳 (单次值与时间戳).

OAUTH_nonce:定义于单次值与时间戳 (单次值与时间戳).

OAUTH_version:版本号,可选。

附加参数:服务提供方指定的附加参数。

 

 

授权流程

在弄清楚了OAUTH的术语后,我们可以对OAUTH认证授权的流程进行初步认识。其实,简单的来说,

OAUTH认证授权就三个步骤,三句话可以概括:

1. 获取未授权的Request Token

2. 获取用户授权的Request Token

3. 用授权的Request Token换取Access Token

当应用拿到Access Token后,就可以有权访问用户授权的资源了。大家可能看出来了,这三个步骤不就是对应OAUTH的三个URL服务地址嘛。一点没错,上面的三个步骤中,每个步骤分别请求一个URL,并且收到相关信息,并且拿到上步的相关信息去请求接下来的URL直到拿到Access Token。

具体每步执行信息如下:

A. 使用者(第三方软件)向OAUTH服务提供商请求未授权的Request Token。向Request Token URL发起请求,请求需要带上的参数见上图。

B. OAUTH服务提供商同意使用者的请求,并向其颁发未经用户授权的oauth_token与对应的oauth_token_secret,并返回给使用者。

C. 使用者向OAUTH服务提供商请求用户授权的Request Token。向User Authorization URL发起请求,请求带上上步拿到的未授权的token与其密钥。

D. OAUTH服务提供商将引导用户授权。该过程可能会提示用户,你想将哪些受保护的资源授权给该应用。此步可能会返回授权的Request Token也可能不返回。如Yahoo OAOAUTH就不会返回任何信息给使用者。

E. Request Token 授权后,使用者将向Access Token URL发起请求,将上步授权的Request Token换取成Access Token。请求的参数见上图,这个比第一步A多了一个参数就是Request Token。

F. OAUTH服务提供商同意使用者的请求,并向其颁发Access Token与对应的密钥,并返回给使用者。

G. 使用者以后就可以使用上步返回的Access Token访问用户授权的资源。

  • 大小: 63.9 KB
  • 大小: 26 KB
]]> Tomcat之Web通信原理 http://doc.okbase.net/gaojingsong/archive/265236.html gaojingsong 2017/8/14 12:40:29

socket网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

 

Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

 

 

Socket连接过程

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。


 通信原理

 

import java.io.IOException;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

 

public class SocketService {

// 搭建服务器端

public static void main(String[] args) throws IOException {

try {

ServerSocket server = null;

server = new ServerSocket(5209);

// b)指定绑定的端口,并监听此端口。

System.out.println("服务器启动成功");

// 创建一个ServerSocket在端口5209监听客户请求

Socket socket;

PrintWriter writer ;

while(true){

socket = server.accept();

// 2、调用accept()方法开始监听,等待客户端的连接

// 使用accept()阻塞等待客户请求,有客户

// 请求到来则产生一个Socket对象,并继续执行

// 由Socket对象得到输入流,并构造相应的BufferedReader对象

writer = new PrintWriter(socket.getOutputStream());

// 如果该字符串为 "bye",则停止循环

writer.println(getTable());

// 向客户端输出该字符串

writer.flush();

// 5、关闭资源

//writer.close(); 

            }

//            writer.close(); // 关闭Socket输出流

//socket.close(); // 关闭Socket

//server.close(); // 关闭ServerSocket

            } catch (Exception e) {// 出错,打印出错信息

e.printStackTrace();

}

}

 

public static String getTable(){

StringBuffer sb = new StringBuffer();

sb.append("<html>");

sb.append("<body>");

sb.append("<hr color='red'>这个表格有一个标题,以及粗边框:</hr>");

sb.append("<table style='border:1px solid #ff0000;width='1600px';border-collapse:collapse;'>");

sb.append("<caption>我的标题</caption>");

sb.append("<tr>");

sb.append(" <td style='border:1px #0066ff solid;' >100</td>");

sb.append("<td style='border:1px #0066ff solid;' >200</td>");

sb.append("<td style='border:1px #0066ff solid;' >300</td>");

sb.append("</tr>");

sb.append("<tr>");

sb.append("<td style='border:1px #0066ff solid;' >400</td>");

sb.append("<td style='border:1px #0066ff solid;' >500</td>");

sb.append("<td style='border:1px #0066ff solid;' >600</td>");

sb.append("</tr>");

sb.append("</table>");

sb.append("</body>");

sb.append("</html>");

return sb.toString();

}

}

 

 

  • 大小: 29.7 KB
]]> 【网络知识之单工、半双工、双工】 http://doc.okbase.net/gaojingsong/archive/265225.html gaojingsong 2017/8/14 12:38:31

单工:简单的说就是一方只能发信息,另一方则只能收信息,通信是单向的。

半双工:比单工先进一点,就是双方都能发信息,但同一时间则只能一方发信息。

全双工:比半双工再先进一点,就是双方不仅都能发信息,而且能够同时发送。

 

单工 

单工就是指A只能发信号,而B只能接收信号,通信是单向的,就象灯塔之于航船——灯塔发出光信号而航船只能接收信号以确保自己行驶在正确的航线上。

半双工 

指一个时间段内只有一个动作发生,举个简单例子,一天窄窄的马路,同时只能有一辆车通过,当目前有两量车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。早期的对讲机、以及早期集线器等设备都是实行半双工的产品。随着技术的不断进步,半双工会逐渐退出历史舞台。

全双工 

Full-Duplex Transmissions 

指交换机在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的交换机都支持全双工。



 

 

 

在全双工模式下,8根线都要分别接到水晶头相应的线序位置上;

在半双工模式下,只需接4根线,参照T568B标准,一般使用1 、2、3、6 线序位置上的四根线,即:白橙、橙、白绿、绿 四根线;

白橙、橙 用于发送数据 ,白绿、绿 用于接收数据。    

 

全双工模式下,网线最大可以达到100兆以上的速度;

在半双工模式下,网线能达到的速度通常为10兆左右。

 

全双工模式的网线既可以工作于全双工模式,也可以工作于半双工模式;

但半双工模式的网线不能工作于全双工模式。

 

在半双工模式下,多出来的两组线可以用来接电话线,比如:把“白蓝、蓝” 这组线分出来当电话线使用。

在局域网网络布线中,用这种方式可以节省布线成本,一根双绞线同时当网线和电话线使用。

 

 

同步和异步:

同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。  

异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。 

串口通信是串行异步全双工:

SPI通信是串行同步半双工:

IIC通信是串行同步全双工: 

 

 

交换机,路由器,集线器区别

集线器-------集线器也叫Hub,工作在物理层(最底层),没有相匹配的软件系统,是纯硬件设备。集线器主要用来连接计算机等网络终端。

 

集线器为共享式带宽,连接在集线器上的任何一个设备发送数据时,其他所有设备必须等待,此设备享有全部带宽,通讯完毕,再由其他设备使用带宽。正因此,集线器连接了一个冲突域的网络。所有设备相互交替使用,就好象大家一起过一根独木桥一样。

 

集线器不能判断数据包的目的地和类型,所以如果是广播数据包也依然转发,而且所有设备发出数据以广播方式发送到每个接口,这样集线器也连接了一个广播域的网络。

 

交换机-------交换机Switch,工作在数据链路层(第二层),稍微高端一点的交换机都有一个操作系统来支持。和集线器一样主要用于连接计算机等网络终端设备。

 

交换机比集线器更加先进,允许连接在交换机上的设备并行通讯,好比高速公路上的汽车并行行使一般,设备间通讯不会再发生冲突,因此交换机打破了冲突域,交换机每个接口是一个冲突域,不会与其他接口发生通讯冲突。

 

并且有系统的交换机可以记录MAC地址表,发送的数据不会再以广播方式发送到每个接口,而是直接到达目的接口,节省了接口带宽。但是交换机和集线器一样不能判断广播数据包,会把广播发送到全部接口,所以交换机和集线器一样连接了一个广播域网络。

 

高端一点的交换机不仅可以记录MAC地址表,还可以划分VLAN(虚拟局域网)来隔离广播,但是VLAN间也同样不能通讯。要使VLAN间能够通讯,必须有三层设备介入。

 

路由器-------路由器Router,工作在网络层(第三层),所有的路由器都有自己的操作系统来维持,并且需要人员调试,否则不能工作。路由器没有那么多接口,主要用来进行网络与网络的连接。

 

简单的说路由器把数据从一个网络发送到另一个网络,这个过程就叫路由。路由器不仅能像交换机一样隔离冲突域,而且还能检测广播数据包,并丢弃广播包来隔离广播域,有效的扩大了网络的规模。

 

在路由器中记录着路由表,路由器以此来转发数据,以实现网络间的通讯。路由器的介入可以使交换机划分的VLAN实现互相通讯。

 

总结:

集线器:纯硬件、用于连接网络终端、不能打破冲突域和广播域。

交换机:拥有软件系统、用于连接网络终端、能够打破冲突域,但是不能分割广播域。

路由器:拥有软件系统、用于连接网络、可以打破冲突域也可以分割广播域,是连接大型网络的比备设备

  • 大小: 50.7 KB
]]> 【jQuery EasyUI 介绍】 http://doc.okbase.net/gaojingsong/archive/265224.html gaojingsong 2017/8/14 12:38:13

What is EasyUI?

  • easyui is a collection of user-interface plugin based on jQuery.
  • easyui provides essential functionality for building modern, interactive, javascript applications.
  • using easyui you don't need to write many javascript code, you usually define user-interface by writing some HTML markups.
  • complete framework for HTML5 web page.
  • easyui saves your time and scales while developing your products.
  • easyui is very easy but powerful.



 

easyui是一种基于jQuery的用户界面插件集合。

easyui为创建现代化,互动,JavaScript应用程序,提供必要的功能。

使用easyui你不需要写很多代码,你只需要通过编写一些简单HTML标记,就可以定义用户界面。

easyui是个完美支持HTML5网页的完整框架。

easyui节省您网页开发的时间和规模。

easyui很简单但功能强大的。



 

jQuery EasyUI有以下特点:

1、基于jquery用户界面插件的集合

2、为一些当前用于交互的js应用提供必要的功能

3、EasyUI支持两种渲染方式分别为javascript方式(如:$('#p').panel({...}))和html标记方式(如:class="easyui-panel")

4、支持HTML5(通过data-options属性)

5、开发产品时可节省时间和资源

6、简单,但很强大

7、支持扩展,可根据自己的需求扩展控件

8、目前各项不足正以版本递增的方式不断完善


 

 

  • 大小: 51.5 KB
  • 大小: 36.3 KB
  • 大小: 35.7 KB
  • 大小: 39.4 KB
]]>