web

阅读 / 问答 / 标签

一文吃透 WebSocket 原理

踩着年末的尾巴,提前布局来年,为来年的工作做个好的铺垫,所以就开始了面试历程,因为项目中使用到了 WebSocket ,面试官在深挖项目经验的时候,也难免提到 WebSocket 相关的知识点,因为之前并没有考虑这么深,所以,回答的还是有所欠缺,因此,赶紧趁热再熟悉熟悉,也借此机会,整理出来供大家咀嚼,每个项目都有其值得挖掘的闪光点,要用有爱的眼睛去发现。 WebSocket 是一种在单个TCP连接上进行全双工通信的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。 在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。(维基百科) WebSocket 本质上一种计算机网络应用层的协议,用来弥补 http 协议在持久通信能力上的不足。 WebSocket 协议在2008年诞生,2011年成为国际标准。现在最新版本浏览器都已经支持了。 它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。 WebSocket 的其他特点包括: 我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起,不具备服务器推送能力。 举例来说,我们想了解查询今天的实时数据,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。 这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。 在 WebSocket 协议出现以前,创建一个和服务端进双通道通信的 web 应用,需要依赖HTTP协议,进行不停的轮询,这会导致一些问题: http 协议本身是没有持久通信能力的,但是我们在实际的应用中,是很需要这种能力的,所以,为了解决这些问题, WebSocket 协议由此而生,于2011年被IETF定为标准RFC6455,并被RFC7936所补充规范。并且在 HTML5 标准中增加了有关 WebSocket 协议的相关 api ,所以只要实现了 HTML5 标准的客户端,就可以与支持 WebSocket 协议的服务器进行全双工的持久通信了。 WebSocket 与 HTTP 的关系图: 下面一张图说明了 HTTP 与 WebSocket 的主要区别: 不同点: 与http协议一样, WebSocket 协议也需要通过已建立的TCP连接来传输数据。具体实现上是通过http协议建立通道,然后在此基础上用真正 WebSocket 协议进行通信,所以WebSocket协议和http协议是有一定的交叉关系的。首先, WebSocket 是一个持久化的协议,相对于 HTTP 这种非持久的协议来说。简单的举个例子吧,用目前应用比较广泛的 PHP 生命周期来解释。 HTTP 的生命周期通过 Request 来界定,也就是一个 Request 一个 Response ,那么在 HTTP1.0 中,这次 HTTP 请求就结束了。 在 HTTP1.1 中进行了改进,使得有一个 keep-alive,也就是说,在一个 HTTP 连接中,可以发送多个 Request,接收多个 Response。但是请记住 Request = Response, 在 HTTP 中永远是这样,也就是说一个 Request 只能有一个 Response。而且这个 Response 也是被动的,不能主动发起。首先 WebSocket 是基于 HTTP 协议的,或者说借用了 HTTP 协议来完成一部分握手。 首先我们来看个典型的 WebSocket 握手 熟悉 HTTP 的童鞋可能发现了,这段类似 HTTP 协议的握手请求中,多了这么几个东西。 这个就是 WebSocket 的核心了,告诉 Apache 、 Nginx 等服务器:注意啦,我发起的请求要用 WebSocket 协议,快点帮我找到对应的助理处理~而不是那个老土的 HTTP 。 这里开始就是 HTTP 最后负责的区域了,告诉客户,我已经成功切换协议啦~ 依然是固定的,告诉客户端即将升级的是 WebSocket 协议,而不是 mozillasocket ,lurnarsocket 或者 shitsocket 。 然后, Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key 。服务器:好啦好啦,知道啦,给你看我的 ID CARD 来证明行了吧。后面的, Sec-WebSocket-Protocol 则是表示最终使用的协议。至此,HTTP 已经完成它所有工作了,接下来就是完全按照 WebSocket 协议进行了。总结, WebSocket 连接的过程是: 优点: 缺点: 心跳就是客户端定时的给服务端发送消息,证明客户端是在线的, 如果超过一定的时间没有发送则就是离线了。 当客户端第一次发送请求至服务端时会携带唯一标识、以及时间戳,服务端到db或者缓存去查询改请求的唯一标识,如果不存在就存入db或者缓存中, 第二次客户端定时再次发送请求依旧携带唯一标识、以及时间戳,服务端到db或者缓存去查询改请求的唯一标识,如果存在就把上次的时间戳拿取出来,使用当前时间戳减去上次的时间, 得出的毫秒秒数判断是否大于指定的时间,若小于的话就是在线,否则就是离线; 通过查阅资料了解到 nginx 代理的 websocket 转发,无消息连接会出现超时断开问题。网上资料提到解决方案两种,一种是修改nginx配置信息,第二种是 websocket 发送心跳包。下面就来总结一下本次项目实践中解决的 websocket 的断线 和 重连 这两个问题的解决方案。主动触发包括主动断开连接,客户端主动发送消息给后端 主动断开连接,根据需要使用,基本很少用到。 下面主要讲一下客户端也就是前端如何实现心跳包: 首先了解一下心跳包机制 跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。 在 TCP 的机制里面,本身是存在有心跳包的机制的,也就是 TCP 的选项: SO_KEEPALIVE 。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。 心跳包一般来说都是在逻辑层发送空的 echo 包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。 在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。 心跳检测步骤: 针对这种异常的中断解决方案就是处理重连,下面我们给出的重连方案是使用js库处理:引入 reconnecting-websocket.min.js ,ws建立链接方法使用js库api方法: 断网监测支持使用js库: offline.min.js 以上方案,只是抛砖引玉,如果大家有更好的解决方案欢迎评论区分享交流。 WebSocket 是为了在 web 应用上进行双通道通信而产生的协议,相比于轮询HTTP请求的方式,WebSocket 有节省服务器资源,效率高等优点。WebSocket 中的掩码是为了防止早期版本中存在中间缓存污染攻击等问题而设置的,客户端向服务端发送数据需要掩码,服务端向客户端发送数据不需要掩码。WebSocket 中 Sec-WebSocket-Key 的生成算法是拼接服务端和客户端生成的字符串,进行SHA1哈希算法,再用base64编码。WebSocket 协议握手是依靠 HTTP 协议的,依靠于 HTTP 响应101进行协议升级转换。

WebSocket 是什么原理?为什么可以实现持久连接

一个小数,

WebSocket 是什么原理?如何实现消息实时推送

目前要实现消息实时推送,有两种方法,一种是ajax轮询,由客户端不停地请求服务器端,查询有没有新消息,然后再由服务器返回结果;另外一种就是long poll,通过一次请求,询问服务器有没有新消息更新,如果没有新消息时,会保持长连接,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。这两种都是单向链接,需要被动的请求服务器,而不是由服务器自动发给客户端。从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。简单地说就是,服务器是一个很懒的冰箱(这是个梗)(不会、不能主动发起连接),但是上司有命令,如果有客户来,不管多么累都要好好接待。

vue websocket是怎么实现即时通讯的?

还得有个后端服务器(固定IP地址)做websocket消息转发,只靠vue websocket搞不了的

WebSocket 是什么原理?为什么可以实现持久连接

WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如Chrome,Safari,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协议草案的不断变化,各个浏览器对协议的实现也在不停的更新。该协议还是草案,没有成为标准,不过成为标准应该只是时间问题了,从WebSocket草案的提出到现在已经有十几个版本了,目前最新的是版本17,所对应的协议版本号为13,目前对该协议支持最完善的浏览器应该是chrome,毕竟WebSocket协议草案也是Google发布的。1. WebSocket API简介首先看一段简单的javascript代码,该代码调用了WebSockets的API。[javascript] view plaincopyvar ws = new WebSocket(“ws://echo.websocket.org”); ws.onopen = function(){ws.send(“Test!”); }; ws.onmessage = function(evt){console.log(evt.data);ws.close();}; ws.onclose = function(evt){console.log(“WebSocketClosed!”);}; ws.onerror = function(evt){console.log(“WebSocketError!”);}; 这份代码总共只有5行,现在简单概述一下这5行代码的意义。第一行代码是在申请一个WebSocket对象,参数是需要连接的服务器端的地址,同http协议使用http://开头一样,WebSocket协议的URL使用ws://开头,另外安全的WebSocket协议使用wss://开头。第二行到第五行为WebSocket对象注册消息的处理函数,WebSocket对象一共支持四个消息 onopen, onmessage, onclose和onerror,当Browser和WebSocketServer连接成功后,会触发onopen消息;如果连接失败,发送、接收数据失败或者处理数据出现错误,browser会触发onerror消息;当Browser接收到WebSocketServer发送过来的数据时,就会触发onmessage消息,参数evt中包含server传输过来的数据;当Browser接收到WebSocketServer端发送的关闭连接请求时,就会触发onclose消息。咱们可以看出所有的操作都是采用消息的方式触发的,这样就不会阻塞UI,使得UI有更快的响应时间,得到更好的用户体验。

HTML5的WebSocket是什么原理

跟普通编程里的socket没啥区别吧,不是之前的我请求你再回应,变成了彼此都能请求对方了,

WebSocket协议-原理篇

本篇文章主要讲述以下几点: WebSocket协议分为两部分:握手和数据传输 下面通过客户端和服务端交互的报文对比WebSocket通讯与传统HTTP的不同点,主要关注握手阶段。 根据上面的例子,运行之后,new WebSocket实例化一个新的WebSocket客户端对象,请求WebSocket URL为 ws://localhost:8000 的服务器,打开控制台的NetWork,客户端WebSocket对象会自动解析并识别为WebSocket请求,连接服务端端口,执行双方握手过程,来自客户端握手发送数据格式如下:至此,HTTP已经完成它所有工作,接下来就是完全按照Websocket协议进行了。 通过查看WebSocket的原理,与HTTP对比,得出结论: HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个请求建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别,所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)。此外还有 multiplexing、不同的URL可以复用同一个WebSocket连接等功能。这些都是HTTP长连接不能做到的。 我们在使用WebSocket协议时通常不会使用它的API来实现,而是借助于Socket.io,Socket.io是一个WebSocket库,包括客户端的js和服务端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用。它会自动根据浏览器从WebSocket、AJAX长轮询等各种方式中选择最佳的方式来实现网络实时应用,也就是说如果浏览器对WebSocket兼容性差,Socket.io会自动选择最佳方式实现实时通信,非常方便和人性化。 Socket.io 官方文档: https://socket.io/get-started/chat/ WebSocket兼容几乎所有现代浏览器,IE 10+ Edge Firefox 4+ Chrome 4+ Safari 5+ Opera 11.5+ socket.io对浏览器做了很好的兼容。 下一篇讲述Socket.io客户端API 参考文档: https://www.zhihu.com/question/20215561

WebSocket的实现原理

Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。即:websocket分为握手和数据传输阶段,即进行了HTTP握手 + 双工的TCP连接。 下面我们分别来看一下这两个阶段的具体实现原理: 客户端发送消息: 服务端返回消息: 这里值得注意的是 Sec-WebSocket-Accept的计算方法 : base64(hsa1(sec-websocket-key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11)) 如果这个Sec-WebSocket-Accept计算错误浏览器会提示:Sec-WebSocket-Accept dismatch 如果返回成功,Websocket就会回调onopen事件 Websocket的数据传输是frame形式传输的,比如会将一条消息分为几个frame,按照先后顺序传输出去。这样做会有几个好处: websocket传输使用的协议如下图: 参数说明如下: 我们了解了websocket的实现原理之后,请看以下golang的实现案例: html和js使用案例:

Webview&Viewpager滑动冲突解决方案

感谢这些作者的分享 https://www.jianshu.com/p/24038d957e93 https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout https://wangyeming.github.io/2017/07/16/use-webview-in-viewpager/ 1、如何控制使用webview处理事件还是viewpager处理事件。 2、根据什么来判断webview处理事件还是viewpager处理事件。 所有的滑动冲突问题解决的思路就是两个: 在这个场景中,在webview外面,可能还包了fragment等众多viewgroup,并且最终判断谁处理事件的依据在webview中,所以这里使用内部拦截法更方便。 可能你在测试时,会出现无法拦截的情况,我也遇到了,因为使用了SwipeRefreshLayout。下文会说到。 我找到了两种思路,第一种 显然,第一种方法是非常麻烦的,涉及到js交互,不具备通用性。因为测试了uc和夸克,发现在他们的浏览器中,都自动解决了滑动冲突,所以必然是有其他可以判断的依据的,最终找到了第二种方法。 这个方法触发的时机是webview滑动到边界时会触发,如果是横向滑动,则clamped则为true。这样的话,我们只要在clamped为true的时候,把事件交给viewpager来处理就行了。 上面说到了,如果你Webview的父布局中存在SwipeRefreshLayout,会发现,可能disallow无法传递到viewpager。理论上,不做任何处理,viewgroup的disallow方法,会挨个往父布局传递。但是为什么会传递失败呢?这就得看下SwipeRefreshLayout的源码(appcompat版本:1.2.0-alpha03)了: 从源码可以看出,如果SwipeRefreshLayout包裹的布局不支持NestedScroll的话,就不做任何处理。 其实这个是appcompat在1.2.0中才修改的,1.1.0版本是给了方法自己控制的: 一开始的思路是让SwipeRefreshLayout下面一层View支持nestedScroll,但是这样的话,会导致下拉刷新无法触发。 那就只能手动去修改disallow方法了: 这样修改以后,disallow就可以正常传递给viewpager了。到这里,就完美的解决了webview嵌套在Viewpager中的滑动冲突问题。 最终实现效果与uc和夸克一致。

如何将squid的管理做成一个基于web的管理

这个问题我不是怎么很清楚?你在这里问也找不到什么详细的答案,还不如去后盾找找看,去看看又没有什么,不喜欢你也可以在另找!

viewgood webplayer是什么软件?

播放器

如何调用WebService接口把数据存储到数据库里而不使用JSP页面

直接用WSDL生成一个客户端,就可以调用方法了

在七牛上传之后如何自己自定义上传完成处理并在页面显示。_html/css_WEB-ITnose

Qiniu 七牛问题解答 很多用户不懂怎么写上传完成后的处理事件。我带大家来写个。 问题解决方案 1,首先要在如下的main.js中做如下的配置修改。 /*global Qiniu *//*global plupload *//*global FileProgress *//*global hljs */$(function() { var uploader = Qiniu.uploader({ runtimes: "html5,flash,html4", browse_button: "pickfiles", container: "container", drop_element: "container", max_file_size: "100mb", flash_swf_url: "js/plupload/Moxie.swf", dragdrop: true, chunk_size: "4mb", uptoken_url: "servlet/responseHandler", domain: $("#domain").val(), // downtoken_url: "/downtoken", // unique_names: true, // save_key: true, // x_vars: { // "id": "1234", // "time": function(up, file) { // var time = (new Date()).getTime(); // // do something with "time" // return time; // }, // }, auto_start: true, init: { "FilesAdded": function(up, files) { $("table").show(); $("#success").hide(); plupload.each(files, function(file) { var progress = new FileProgress(file, "fsUploadProgress"); progress.setStatus("缁?澶?绶?..."); }); }, "BeforeUpload": function(up, file) { var progress = new FileProgress(file, "fsUploadProgress"); var chunk_size = plupload.parseSize(this.getOption("chunk_size")); if (up.runtime === "html5" && chunk_size) { progress.setChunkProgess(chunk_size); } }, "UploadProgress": function(up, file) { var progress = new FileProgress(file, "fsUploadProgress"); var chunk_size = plupload.parseSize(this.getOption("chunk_size")); progress.setProgress(file.percent + "%", up.total.bytesPerSec, chunk_size); }, "UploadComplete": function() { $("#success").show(); // alert("woaini"); // var v = 4, // document.getElementById("woaini").outerHTML = "woaini"; // alert("wobuai"); }, "FileUploaded": function(up, file, info) { var progress = new FileProgress(file, "fsUploadProgress"); progress.setComplete(up, info); }, "Error": function(up, err, errTip) { $("table").show(); var progress = new FileProgress(err.file, "fsUploadProgress"); progress.setError(); progress.setStatus(errTip); } // , // "Key": function(up, file) { // var key = ""; // // do something with key // return key // } } }); uploader.bind("FileUploaded", function() { console.log("hello man,a file is uploaded"); }); $("#container").on( "dragenter", function(e) { e.preventDefault(); $("#container").addClass("draging"); e.stopPropagation(); } ).on("drop", function(e) { e.preventDefault(); $("#container").removeClass("draging"); e.stopPropagation(); }).on("dragleave", function(e) { e.preventDefault(); $("#container").removeClass("draging"); e.stopPropagation(); }).on("dragover", function(e) { e.preventDefault(); $("#container").addClass("draging"); e.stopPropagation(); }); $("#show_code").on("click", function() { $("#myModal-code").modal(); $("pre code").each(function(i, e) { hljs.highlightBlock(e); }); }); $("body").on("click", "table button.btn", function() { $(this).parents("tr").next().toggle(); }); var getRotate = function(url) { if (!url) { return 0; } var arr = url.split("/"); for (var i = 0, len = arr.length; i < len; i++) { if (arr[i] === "rotate") { return parseInt(arr[i + 1], 10); } } return 0; }; $("#myModal-img .modal-body-footer").find("a").on("click", function() { var img = $("#myModal-img").find(".modal-body img"); var key = img.data("key"); var oldUrl = img.attr("src"); var originHeight = parseInt(img.data("h"), 10); var fopArr = []; var rotate = getRotate(oldUrl); if (!$(this).hasClass("no-disable-click")) { $(this).addClass("disabled").siblings().removeClass("disabled"); if ($(this).data("imagemogr") !== "no-rotate") { fopArr.push({ "fop": "imageMogr2", "auto-orient": true, "strip": true, "rotate": rotate, "format": "png" }); } } else { $(this).siblings().removeClass("disabled"); var imageMogr = $(this).data("imagemogr"); if (imageMogr === "left") { rotate = rotate - 90 < 0 ? rotate + 270 : rotate - 90; } else if (imageMogr === "right") { rotate = rotate + 90 > 360 ? rotate - 270 : rotate + 90; } fopArr.push({ "fop": "imageMogr2", "auto-orient": true, "strip": true, "rotate": rotate, "format": "png" }); } $("#myModal-img .modal-body-footer").find("a.disabled").each(function() { var watermark = $(this).data("watermark"); var imageView = $(this).data("imageview"); var imageMogr = $(this).data("imagemogr"); if (watermark) { fopArr.push({ fop: "watermark", mode: 1, image: "http://www.b1.qiniudn.com/images/logo-2.png", dissolve: 100, gravity: watermark, dx: 100, dy: 100 }); } if (imageView) { var height; switch (imageView) { case "large": height = originHeight; break; case "middle": height = originHeight * 0.5; break; case "small": height = originHeight * 0.1; break; default: height = originHeight; break; } fopArr.push({ fop: "imageView2", mode: 3, h: parseInt(height, 10), q: 100, format: "png" }); } if (imageMogr === "no-rotate") { fopArr.push({ "fop": "imageMogr2", "auto-orient": true, "strip": true, "rotate": 0, "format": "png" }); } }); var newUrl = Qiniu.pipeline(fopArr, key); var newImg = new Image(); img.attr("src", "loading.gif"); newImg.onload = function() { img.attr("src", newUrl); img.parent("a").attr("href", newUrl); }; newImg.src = newUrl; return false; });}); 2,在如上的代码片中做如下修改:在标记处添加如下代码,实现在前端显示返回来的图片。(用js来实现前端的控件显示)var res = eval("(" + info.toString() + ")"); alert(res.key); var sourceLink = domain + res.key; //获取上传成功后的文件的Url alert(sourceLink); $("#images").attr("src",sourceLink); var input=top.document.getElementById("photo_small"); input.setAttribute("src",sourceLink); 结果演示

怎么修改jetty-server的版本与jetty-webapp的版本

你去网上下载jetty服务器的安装包, 是rar格式的, 你的Myeclipse支持什么版本的jetty 你就下载什么版本的jetty,然后把jetty集成到你的Myeclipse中去, 集成方法如下:添加jetty服务器按照下面的步骤做:1.点击window-- show view - other 找到servers 点击OK。2.在servers 里面右键鼠标 configure server connector 找到jetty版本,点击next,然后点击browse选择电脑上面的jetty安装路径就行了。

常用的web服务器软件整理(win+linux)

(1)Apache Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上。Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache取自"a patchy server"的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。 特点就是处理php页面,如果需要执行php的内容过多可以采用apache,如果静态内容多可以用nginx (2)IIS是英文Internet Information Server的缩写,译成中文就是"Internet信息服务"的意思。它是微软公司主推的服务器,最新的版本是Windows2016里面包含的IIS 10,IIS与Window Server完全集成在一起,因而用户能够利用Windows Server和NTFS(NT File System,NT的文件系统)内置的安全特性,建立强大,灵活而安全的Internet和Intranet站点。服务器版本IIS默认版本server20036.0server20087.0server2008 r27.5server20128.0server201610windows服务器的首选,稳定性好。网站需要支持asp、asp.net的就需要用iis了 (3)GFE Google的web服务器,用户数量激增。目前紧逼iis。 (4)Nginx不仅是一个小巧且高效的HTTP服务器,也可以做一个高效的负载均衡反向代理,通过它接受用户的请求并分发到多个Mongrel进程可以极大提高Rails应用的并发能力。 (5)Lighttpd是由德国人 Jan Kneschke 领导开发的,基于BSD许可的开源WEB服务器软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销,CPU占用率低,效能好,以及丰富的模块等特点。Lighttpd 是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。 (6)Zeus是一个运行于Unix下的非常优秀的Web Server,据说性能超过Apache,是效率最高的Web Server之一。 (7)Sun的Java系统Web服务器也就是以前的Sun ONE Web Server。主要出现在那些运行Sun的Solaris操作系统的关键任务级Web服务器上。它最新的版本号是6.1,可以支持x86版本Solaris,Red Hat Linux,HP-UX 11i, IBM AIX,甚至可以支持Windows,但它的大多数用户都选择了SPARC版本的Solaris操作系统。 (8)Resin提供了最快的jsp/servlets运行平台。在java和javascript的支持下,Resin可以为任务灵活选用合适的开发语言。Resin的一种先进的语言XSL(XML stylesheet language)可以使得形式和内容相分离。 (9)Jetty是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。 (10)BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。 BEA WebLogic Server拥有处理关键Web应用系统问题所需的性能、可扩展性和高可用性。 (11)Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。 (12)Node.js是一个Javascript运行环境(runtime)。实际上它是对Chrome V8引擎进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。 Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞I/O模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。

Web服务器软件有哪些。简单点的?

不知道你说的是什么环境的web服务器,如果是php的话,你可以使用phpstudy,java的话可以使用tomcat。

maven web项目如何用jetty运行

添加插件(里面的版本,可以使用更新的)<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-jspc-plugin</artifactId> <version>6.1.16</version> <executions> <execution> <id>jspc</id> <goals> <goal>jspc</goal> </goals> <configuration> <webAppSourceDirectory> ${basedir}/web </webAppSourceDirectory> <generatedClasses> ${basedir}/target/jspc </generatedClasses> </configuration> </execution> </executions></plugin><plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <webappDirectory> ${basedir}/web </webappDirectory> <warSourceDirectory> ${basedir}/web </warSourceDirectory> <webXml> ${basedir}/web/WEB-INF/web.xml </webXml> </configuration></plugin>

如何准确的关闭web服务器jetty的进程

1.查找jetty进程,通过端口查询netstat -ano | findStr "8080" ,其中“8080”是web服务器开启的端口。2,.再通过PID关掉对应的java进程,PID的值对应为1中查询结果的最后一列。PID在任务管理器中通过“查看->选择列”中,勾上PID来显示PID,如何就可以准确的关闭web服务器jetty的进程了,实际上是一个java进程。

maven web项目如何用jetty运行?

在maven项目中经常会用到jetty插件,mvn jetty:run默认启动的是8080端口,tomcat通常占用这个端口,可以手动修改jetty插件的启动端口,命令如下: x0dx0ax0dx0amvn jetty:run -Djetty.port=9999 x0dx0ax0dx0a另一种方法是修改pom文件,jetty插件部分代码如下: x0dx0ax0dx0a x0dx0a org.mortbay.jetty x0dx0a maven-jetty-plugin x0dx0a 6.1.6 x0dx0a x0dx0a x0dx0a x0dx0a 9999 x0dx0a 60000 x0dx0a x0dx0a x0dx0a x0dx0a

如何快速阅读并理解英文的技术文档_html/css_WEB-ITnose

作为一名程序员,要实现我们的产品,首先需要选择一种或几种编程语言,其次是使用各种工具和第三方库。 而在这个过程中,就少不了对这些语言、工具和第三方库的下载和学习。 下载一般都非常简单,但是关于如何使用,相信大家都会有各种各样的学习方法。 但是不管通过什么方式,追根溯源都会来到官方文档。 那么问题就来了!目前来说,大部分的官方文档都是英文的,如何才能快速的理解并使用官方文档呢? 今天,把自己的学习方法拿出来,和大家一起分享一下,希望大家可以尽量少走一些弯路,尽快的找到bug的解决方法。 说起来很简单,主要分3步:1,首先要能找到官方文档;2,看introduction或者overview;3,对症下药 如何找到官方文档 这一点对于大部分的编程语言和工具来说,都没啥大问题,大家可以很容易的在官方网站上找到相应的技术连接或者文档。 到目前为止,我遇到的唯一一个找了比较久的链接是css的链接,在W3C里面: https://www.w3.org/community/webed/wiki/Main_Page#CSS 但是想想也对,因为css就是W3C制定的。 从这我们也可以学到一点,就是需要我们经常整理所知道的,或者了解的,技术的分类和历史。这样,下次再有问题时,就可以快速的定位到某一个技术或者和它相关的几个技术。 快速理解文档架构 大部分的技术文档都有一个introduction或者overview部分,这部分可不是随便写的。 文档的结构也像是我们写代码时采用的架构一样,从大到小,一步步深入。特别是英文文档,因为外国人写的文章都非常傻瓜,出发点特别低,是采用循序渐进的方式,让你深入理解下去的。 这也是我问什么推荐大家读英文官方文档的原因。 所以这块的内容,我们不应该随便看。一句一句读吧!!! 如果看不懂怎么办?这个要从两个方向考虑,一个是英语不懂;一个是描述的相关技术或者背景不懂。英语不懂怎么办?这个时候可以用百度了,查单词的意思(仅限于查单词意思)。刚开始如果发现要查的单词特别多,千万不要怕。因为不同的技术文档,是由不同的人写的。很有可能你可以很容易的看懂另一份技术文档,但是这一篇你却完全读不懂。所以,静下心,好好读,慢慢查。等你读完了,你会发现后面的章节会容易了很多。为什么?因为同一份技术文档,基本上是那么几个人写的,用的单词和术语都一致,所以我们只需要摸清他喜欢使用那几个英语单词就ok了。 相关的背景或者技术不懂怎么办?看看这块内容和你的关心的部分关系大不大,如果不大,那忽略过去就好了。如果有关系,那你就得先把这块内容了解清楚了。顺便恭喜你一下,如果遇到这种问题,说明你的技术库又添加了一项新技能。对症下药 接下来的事情就比较简单了,等你完成步骤2后,你已经知道该在哪里找你需要的信息了。 如果还是找不到怎么办?那请重复步骤2,所谓书读百遍,其义自现!!! 最后一个问题,可不可以直接买一本中文的书来看呢? 答案是,可以,但是这个就像是吃别人已经咀嚼过的食物一样,虽然最终结果可能一样,但是如果以后在其它技术上遇到相同的问题呢? 继续去买书吗?如果书还没出呢?其实没太大必要!另外,翻译出来的书,可能是针对旧的版本的。一旦新版本中有相应的更新,你是不知道的。 不知不觉又说了这么多。 最后说一句,如果官方网站就是没有提供技术文档呢?那就先看一下github上有没有源码。另外顺便注意一下,如果它连技术文档都没有,真正使用过它的人会多嘛?先去github(如果有的话)上看下它的star数量吧。

Web服务器例如websphere、tomcat和weblogic的工作原理和流程是什么样的?

找一下JVM原理看看

java structs工程发布到websphere后报Error 503: Failed to load target servlet [action]是什么意思啊?

检查以下你的配置文件啊,不能装载目标servlet 503状态码  由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方式处理它。   注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。

webstorm 中 配置 svn时出错的问题

  1、下载 SlikSVN。  2、安装。路径 D:Program Filesslikin。  3、在WebStorm中配置 file->settings->Version Contorl->subversion->with conmand line client  设置成你的 D:Program Filesslikinsvn.exe。

rklbwebcast是什么文件?

文件类型要看文件的后缀,txt是记事本,exe是电脑应用程序,apk是手机应用,mp3是音频,等等这样

什么是webcas

网站

webcast_mate文件能删除吗

webcast_mate文件可以删除。webcast_mate文件可以删除不会影响使用。WebCast是利用卫星广播信道进行因特网内容"推送"的服务,即根据ICP和用户的要求,定时将网站的内容投递到用户的电脑硬盘上,并按照设定的时间间隔更新。WebCast软件可以自动判断一个网页是否在规定的时间间隔内被改变过。WebCast软件还可以监控广播网页的浏览情况,用户每点击一次页面或一条广告后,该记录会被自动存储,并在用户下次上网时回传到网络运行中心的数据库,并报送内容提供商。

PS中普通保存和存储为web格式有什么区别

ps普通保存时pnd格式的,在dreamweaver插入的时候并预览的时候不能显示,web格式可以直接插入dreamweraver中并且可以在fireworks中编辑。哈哈

SWEBOX的的歌词翻译

This is for the lonely 这是孤单 This is for the lonely 这是孤单 Sometimes I feel I wished on the wrong star 有时我觉得我向错星星许愿 Cuz I always seem so far 因为我终是睇得好远 One that I dream of 一但我联想的时候 Torn away from love 这个人远远离开我的爱 But I"ll make it on my own 但是我永远把他放在我的一部分 Cuz I"m learning to be strong 因为我学识变的更坚强 Memories of standing all alone 回忆是顾单的 This is for the lonely 这是孤单 This is for the lonely 这是孤单 We all live underneath the same blue sky 我们永远生活在同一片蓝天下 This is for the lonely ones tonight 这是一个好孤单的晚上 I"ll help you find a way 我会帮你寻找一条路 To hold on 去扶持你 At night I pray 在晚上我会为你祈祷 But no one"s by my side 但是无人在我身边 My tears they go unheard 我的眼泪不知不觉的留走 I look for the words 我正在寻找所有爱的语言 To raise my heart 目的就是来壮强我的心灵 For now I"ll say this prayer 这就是我所渴的祈求 That somehow some day somewhere 某时 某天 某地 I will turn around and find love standing there 在这里我会寻找到我的爱 This is for the lonely 这是孤单 This is for the lonely 这是孤单 We all live underneath the same blue sky 我们永远生活在同一片蓝天下 This is for the lonely ones tonight 这是一个好孤单的晚上 I"ll help you find a way 我会帮你寻找一条路 To hold on 去扶持你 This is for the lonely 这是孤单 This is for the lonely 这是孤单 We all live underneath the same blue sky 我们永远生活在同一片蓝天下 All my tears they go unheard 我所有的眼泪不知不觉的留走 Cuz no one"s by my side 因为没人起我身边 It"s hard to be alone 是多艰难的在一起 It"s hard to wait for love 是多艰难的爱 Oh yeah oh oh Oh year oh oh Lonely hey yeah yeah 寂寞 真的好寂寞 This is for the lonely ones tonight 这是一个好孤单的晚上 I"ll help you find a way 我会帮你寻找一条路 To hold on 去扶持你 This is for the lonely 这是孤单 This is for the lonely 这是孤单 We all live underneath the same blue sky 我们永远生活在同一片蓝天下 This is for the lonely ones tonight 这是一个好孤单的晚上 I"ll help you find a way 我会帮你寻找一条路

华为AR2220-S路由器 用PPOE拨号方式上网,上网正常,但是部分网站打开很慢。路由器web管理界面也打不开

网速原因,

H3C路由器怎么配置PPOE上网?出厂默认有没有开启WEB管理界面?没有怎么开启谢谢!

H3C企业级路由的话,基础版是没有WEB管理页面的,高级版才有, 基础版需要输入各种命令来配置路由器不知道怎么操作,请联系你的设备经销商或者拨打华为客服,会指导你如何操作的

PHP is a development framework that can be used for building websites with which of the following?

The answer is B

为什么就一个单独的div样式应用部了,其他的都没问题,急_html/css_WEB-ITnose

欢迎光临当当网,请登录免费注册 购物车 我的订单 我的当当 礼品卡 帮助 网上购物享当当 首页 图书 百货 品牌 促销 商家 当当榜 礼物 在线读书 更多服务 音乐 影视 少儿 教辅 小说 外语 数码相机 笔记本 连衣裙 高跟鞋 运动鞋 美容护肤 厨卫用品 婴幼奶粉 玩具 没事保健 饰品@charset"utf-8";body{ padding:0; margin:0; font-size:12px;line-height:22px; }ul,li{padding:0; margin:0;}ul{list-style-type:none;}.wrap{width:960px; margin:0 auto;}#welcome ul{padding-left:430px; }#welcome ul li{float:left;}#welcome ul li a { color:#000000; text-decoration:none; margin:0 5px; }#welcome ul li.login a { color:#1a66b3; }#welcome ul li.shopping{background:url(../images/shopping.gif) left center no-repeat; padding-left:20px;}#welcome ul li em { display:block; float:left; height:7px; margin:6px 0; border-right:1px solid #bcbcbc; overflow:hidden; }#welcome ul li a.arrow{ background:url(../images/arrow.gif) right center no-repeat; padding-right:12px;}#mainNav #logo{ float:left; width:160px; text-align:center}#mainNav .large{float:left; width:450px;}#mainNav .large .organge{color:#ff6600; }#mainNav .large ul li{float:left; margin:0 2px; line-height:30px; font-size:14px; text-align:center; font-weight:bold; }#mainNav .large ul li a{display:block; background:url(../images/nav_bg.gif); width:77px; text-decoration:none; color:#333;}#mainNav .large ul li.home a{background:url(../images/nav_home.gif); width:59px;color:#fff; }#mainNav .side { float:right; margin-top:30px; }#mainNav .side ul li em { display:block; float:left; height:7px; margin:6px 0; border-right:1px solid #bcbcbc; overflow:hidden; }#mainNav .side ul li a { margin:0 5px; color:#333; text-decoration:none; }#mainNav .side ul li a.arrow { background:url(../images/arrow.gif) right center no-repeat; padding-right:12px; }#navbar { clear:both; background:#fc883b; height:30px; }#navbar ul li { float:left; line-height:30px; }#navbar ul li a { color:#fff; text-decoration:none; padding:0 9px; }#navbar ul li em { display:block; float:left; border-left:#dc6b04; border-right:1px solid #fba455; height:5px; margin:12px 0; overflow:hidden;#mainNav .side下的样式应用不了,这是我复制别人的代码,别人的代码运行起来没问题,自己复制过来一模一样的为什么就单独一个div样式应用不了呢? 回复讨论(解决方案)补充:是同一台机器 你的页面结构复制乱了,如下浏览器直接查看,side那个div应该属于#mainNav 下的@charset"utf-8";body{ padding:0; margin:0; font-size:12px;line-height:22px; }ul,li{padding:0; margin:0;}ul{list-style-type:none;}.wrap{width:960px; margin:0 auto;}#welcome ul{padding-left:430px; }#welcome ul li{float:left;}#welcome ul li a { color:#000000; text-decoration:none; margin:0 5px; }#welcome ul li.login a { color:#1a66b3; }#welcome ul li.shopping{background:url(../images/shopping.gif) left center no-repeat; padding-left:20px;}#welcome ul li em { display:block; float:left; height:7px; margin:6px 0; border-right:1px solid #bcbcbc; overflow:hidden; }#welcome ul li a.arrow{ background:url(../images/arrow.gif) right center no-repeat; padding-right:12px;}#mainNav #logo{ float:left; width:160px; text-align:center}#mainNav .large{float:left; width:450px;}#mainNav .large .organge{color:#ff6600; }#mainNav .large ul li{float:left; margin:0 2px; line-height:30px; font-size:14px; text-align:center; font-weight:bold; }#mainNav .large ul li a{display:block; background:url(../images/nav_bg.gif); width:77px; text-decoration:none; color:#333;}#mainNav .large ul li.home a{background:url(../images/nav_home.gif); width:59px;color:#fff; }#mainNav .side { float:right; margin-top:30px; }#mainNav .side ul li em { display:block; float:left; height:7px; margin:6px 0; border-right:1px solid #bcbcbc; overflow:hidden; }#mainNav .side ul li a { margin:0 5px; color:#333; text-decoration:none; }#mainNav .side ul li a.arrow { background:url(../images/arrow.gif) right center no-repeat; padding-right:12px; }#navbar { clear:both; background:#fc883b; height:30px; }#navbar ul li { float:left; line-height:30px; }#navbar ul li a { color:#fff; text-decoration:none; padding:0 9px; }#navbar ul li em { display:block; float:left; border-left:#dc6b04; border-right:1px solid #fba455; height:5px; margin:12px 0; overflow:hidden; 欢迎光临当当网,请登录免费注册 购物车 我的订单 我的当当 礼品卡 帮助 网上购物享当当 首页 图书 百货 品牌 促销 商家 当当榜 礼物 在线读书 更多服务 音乐 影视 少儿 教辅 小说 外语 数码相机 笔记本 连衣裙 高跟鞋 运动鞋 美容护肤 厨卫用品 婴幼奶粉 玩具 没事保健 饰品解决了,原来是多了个

箭头背景怎么做_html/css_WEB-ITnose

像http://qa.tourizz.com/newui/latest/today/news-and-promotions这个地址,左侧带箭头的背景怎么做啊,箭头在灰色背景的外面就。选中或者hover的时候背景变成这种黄色箭头。你们觉得怎么做好啊?现在是用css做的,箭头和矩形框衔接总是有偏差,能看出来间隙。 回复讨论(解决方案)html5新特性,把一个矩形翻转45度就是三角形了,三角形显示在矩形右边于是就成了一个箭头形状 html5新特性,把一个矩形翻转45度就是三角形了,三角形显示在矩形右边于是就成了一个箭头形状现在就是这么做的啊,旋转后三角形的底边和左侧矩形的高度不一致,所以总是有间隙。 引用 1 楼 wzs_xyz 的回复:html5新特性,把一个矩形翻转45度就是三角形了,三角形显示在矩形右边于是就成了一个箭头形状现在就是这么做的啊,旋转后三角形的底边和左侧矩形的高度不一致,所以总是有间隙。做得麻烦且不兼容,还不如用背景图片 我是搞不懂它那个为什么要用旋转。那是正方形的对角线,还存在根号的问题。直接用border 也能画三角arrow#arrow { width: 100px; height: 30px; background: #ec8b46; position: relative;}#arrow:after { content: " "; width: 0; height: 0; border-top: 15px solid transparent; border-bottom: 15px solid transparent; border-left: 15px solid #ec8b46; position: absolute; left: 100px;} 我是搞不懂它那个为什么要用旋转。那是正方形的对角线,还存在根号的问题。直接用border 也能画三角XML/HTML code?1arrowCSS code?12345678910111213141516#arrow { width: 100px; height: 30px; background:??我是搞不懂它那个为什么要用旋转。那是正方形的对角线,还存在根号的问题。直接用border 也能画三角XML/HTML code?1arrowCSS code?12345678910111213141516#arrow { width: 100px; height: 30px; background:??谢谢高人,我试了图片和旋转都不行,就这个方法行。但是我不明白为什么这样就能出来三角形? 已经明白了,谢谢

点击左边菜单里如何在右边的区域出现相应的内容_html/css_WEB-ITnose

Stylevantage 111调研内容调研内容调研概况分析调研概况单题分析题目1题目2#wrap {margin: 0 auto;width: 1150px;text-align: left;background: #FFF;}#content-wrap {clear:both;margin: 0; padding:0;width: 1150px;}/* header */#header {position: relative;background: url(../images/headerbg-green.gif) repeat-x 0 0;height: 84px;}#header h1#logo {position: absolute;margin: 0; padding: 20px 0 0 300px;font: bold 3.5em "Trebuchet MS", Arial, Sans-serif;letter-spacing: -3px;color: #CCC;text-transform: lowercase;/* change the values of top and Left to adjust the position of the logo*/top: 0; left: 5px;}#header h2#slogan {position: absolute;margin: 0; padding: 0;font: bold 11px "Trebuchet MS", Arial, Sans-serif;text-transform: none;color: #FFF;/* change the values of top and Left to adjust the position of the slogan*/top: 48px; left:70px;}#header .searchform {position: absolute;top: 5px; right: 3px;}/* main column */#main {float: left;margin-left: 15px;padding: 10px 0 0 5px;width: 900px;border-left: 1px solid #f2f2f2;}.post-footer {background-color: #FAFAFA;padding: 5px; margin-top: 20px;font-size: .9em;border: 1px solid #f2f2f2;}.post-footer .date {background: url(../images/clock.gif) no-repeat left center;padding-left: 20px; margin: 0 10px 0 5px;}.post-footer .comments {background: url(../images/comment.gif) no-repeat left center;padding-left: 20px; margin: 0 10px 0 5px;}.post-footer .readmore {background: url(../images/page.gif) no-repeat left center;padding-left: 20px; margin: 0 10px 0 5px;}/* sideabar */#sidebar {float: left;width: 15%;margin: 0; padding: 10px 0 0 0;display: inline;}#sidebar ul.sidemenu {list-style: none;text-align: left;margin: 0 0 8px 0;padding: 0;text-decoration: none;font-size: 12px;border-top: 1px solid #EFF0F1;}#sidebar ul.sidemenu li {border-bottom: 1px solid #EFF0F1;background: url(../images/arrow.gif) no-repeat 2px 9px;padding: 3px 5px 3px 18px;}* html body #sidebar ul.sidemenu li { height: 1%; }#sidebar ul.sidemenu a {font-weight: bold;background-image: none;text-decoration: none;}/* footer */#footer {clear: both;background: #FFF url(../images/footerbg.gif) repeat-x left top;border-top: 1px solid #F2F2F2;text-align: center;height: 80px;font-size: .9em;}#footer a { text-decoration: none; } /* Alignment classes */.float-left { float: left;}.align-left { text-align: left; }.align-right { text-align: right; }.align-center { text-align: center; }/* display classes */.clear { clear: both; }.block { display: block; }.hide { display: none; }.green { color: #32CD32; }我想实现点击左边菜单右边刷新的效果,好像用frame框架能做,但不知道怎么写,求各位大神帮助 回复讨论(解决方案)直接用frame就行了呗 left.html里面写

css+div如何做一个右边有小箭头的层_html/css_WEB-ITnose

DIV CSS 网上很多小箭头都在左边或者上边下边的,自己怎么调都调不到右边,郁闷啊层边框半圆形的,半透明最好,多谢 回复讨论(解决方案)找张图片放到对应的位置得了 哈哈 不行的,我这层里面还要放东西呢,还要半透明呢,里面是菜单,楼上的不是偷工减料么 大牛呢,没人了么 你的右边和左边的区别是什么? ◆用好??字符就行了或者用css3?,如果不考?兼容性 用border来实现就是,如果要三角透明那么你懂得 border .border{width: 0; height: 0; border: .75em solid; border-color: #f00 #555 #ccc #000;} 当然我是偷懒了,一般都是用一个i来做的 i别忘记dib vam/vat 最近刚好用到这个,希望对你有用,是ccs3的向左的箭头arrow-left{ width: 0;height: 0;border-top: 17px dashed transparent;border-bottom: 17px dashed transparent;border-right: 15px solid #777;font-sie: 0;}向右的箭头arrow-right{ width: 0;height: 0;border-top: 17px dashed transparent;border-bottom: 17px dashed transparent;border-left: 15px solid #777;font-sie: 0;}向上的箭头arrow-top{ width: 0;height: 0;border-left: 17px dashed transparent;border-right: 17px dashed transparent;border-bottom: 15px solid #777;font-sie: 0;}向下的箭头arrow-bottom{ width: 0;height: 0;border-left: 17px dashed transparent;border-right: 17px dashed transparent;border-top: 15px solid #777;font-sie: 0;}

javaweb怎么连接mysql数据库

安装好mysql之后,那么你现在应该安装JDK了(JDK1.6就可以)安装好JDK之后,就是安装Eclipse了,要支持JDK版本,Eclipse安装的时候会自动去找JDK安装位置的,如果你是解压版的Eclipse,就要配置eclipse.ini文件了,将对应的JDK配置好,这些已经准备就绪的时候,就到mysql中创建数据库和表先创建数据库:CREATE DATABASE SCUTCS;接着,创建表:CREATE TABLE STUDENT(SNO CHAR(7) NOT NULL,SNAME VARCHAR(8) NOT NULL,SEX CHAR(2) NOT NULL,BDATE DATE NOT NULL,HEIGHT DEC(5,2) DEFAULT 000.00,PRIMARY KEY(SNO));然后插入数据,可以用SQL语句insert into <表名> values (value1, value2, ...);

photoshop用WEB储存照片时出现无法完成此操作,出现了未知错误。?

需要把存储为WEB所用格式的数据值设置大点可以解决问题。工具:ps2018、windows101、打开电脑,在键盘上点击开始菜单,然后鼠标右键点击,找到运行并点击,输入regedit进入。2、如图所示,然后依次打开HKEY_CURRENT_USER选项、Software选项、Adobe选项、Photoshop选项、120.0选项。3、空白处新建-DWORD值,如图所示,并命名为OverridePhysicalMemoryMB。4、然后单击编辑OverridePhysicalMemoryMB,数值数据输入2000,然后选择十进制。5、最后,把之前的ps关掉,重新打开,然后发现可以保存为web格了,这样操作即可。

融云web端怎么保持连接状态

融云web端保持连接状态的方法:新增一个模板页面,把原来的首页地址给他,其他都不变,这样页面每次跳转都有一个父级页面,把socket的js文件在这个页面引入就可以了。根据查询相关信息显示融云,稳定的即时通讯云服务商,全球通信能力,支持多语言多平台开发。

想用VS2010练习c++ 新手 安装的时候应该勾选哪些啊 有basic c++ c# f# web developer 图形库

c++ 就ok了

css知多少(8)--float上篇_html/css_WEB-ITnose

1. 引言对于我们所有的web前端开发人员,float是或者曾经一度是你最熟悉的陌生人??你离不开它,却整天承受着它所带给你的各种痛苦,你以为它很简单就那么一点知识,但却驾驭不了它各种奇怪的现象。这就是我们又爱又恨的??float。所以,系统的学一学float是非常非常重要的。除了看书和看博客文章之外,我推荐大家去看一个奇葩(声音很有磁性,你懂得)录制的教程《CSS深入理解之float浮动》,讲的很好很透彻。 2. 重新认识float 2.1. 误解和“误用”既然提到“误用”,各位看官就此想想,自己平日是怎么使用float的?另外,既然“误用”加了引号,就说明这样的使用并不是真正的误用,而是误打误撞使用之后,带来了真正的效果。这样一问大家,我想绝大多数用float都是为了??横向排版、或者多列布局。这样的使用是正确的,大部分人都这样使用,bootstrap的栅格系统也是使用了float来实现的,并且在css3被普及之前,多列布局的最佳解决方案也是使用float??要不然你就用table。但是,这样使用确实是对float的一种误解和“误用”,因为float被设计出来的初衷是用于??文字环绕效果。即,一个图片一段文字,图片float:left之后,文字会环绕图片。但是,当时的多列布局和横向排版主要是依靠table实现,后来人们见见的发现,使用table将导致代码量大、混乱、不利于SEO,然后发现float+div是一个很不错的排版解决方案,于是乎??过去几年“css+div”页面排版一直是一个热门话题,也是各种高大上的面试题必考的一项。初学float的同学,你如果没有从最基础的知识入手,而是从网络的零散之后或者同事同学的零散代码学起的话,你可能只知道float是用来排版的,但是你却不知道float的许多个特性,这就导致了你在使用float时的许多问题。不信请看下文。 2.2. 破坏性首先大家来看两个demo,如下图。第一个demo是一个简单不过的例子,显示效果也很正常。第二个demo,唯一的区别就在于加了float:left,上层的却出现了“坍塌”现象。不过,这就是float的“破坏性”??float破坏了父标签的原本结构,使得父标签出现了坍塌现象。导致这一现象的最根本原因在于:被设置了float的元素会脱离文档流。初次接触“脱离文档流”的朋友可以这样理解:div是父亲,img是它的儿子,原本好好的父子关系,原本爷俩可以体面的展示一个包含关系的效果。直到有一天,img被设置了float。老天爷(浏览器)规定,任何float元素都不允许再呆在自己的家族中,于是img被逐出家门,断绝和div父子关系。于是乎,div没有了img儿子,也就不能再展示这种父子的包含关系,于是两者就各过各的,互不相干。??这样一说,容易理解了吧?但是,永远都不要忘记float被设计的初衷??实现文字环绕效果。当div中有文字时,文字还是会环绕在img周围的。如下图:好了,大家现在已经知道了float具有破坏性,可能也有很多朋友之前就知道这一特性,但是你有没有思考一下:float为什么会被设计成具有破坏性,为什么会脱离文档流?这一点非常重要!其实原因非常简单??为了要实现文字的环绕效果?有人可能会问:啊?你刚才不是说了float的初衷就是实现文字环绕效果吗?和破坏性有啥关系?这时我会反问你:如果float不让父元素坍塌,能实现文字环绕效果吗?给你两个图看看你就知道了。看不明白的可以给我留言讨论。 2.3. 包裹性“包裹性”也是float的一个非常重要的特性,大家用float时一定要熟知这一特性。咱们还是先从一个小例子看起:如上图,普通的div如果没有设置宽度,它会撑满整个屏幕,在之前的盒子模式那一节也讲到过。而如果给div增加float:left之后,它突然变得紧凑了,宽度发生了变化,把内容“王福朋”三个字包裹了??这就是包裹性。div设置了float之后,其宽度会自动调整为包裹住内容宽度,而不是撑满整个父容器。注意,此时div虽然体现了包裹性,但是它的display样式是没有变化的,还是block。说道这里咱们回顾一下,在之前的博客中,也提到了“包裹性”,是哪些样式?你可以在此思考一下,我会在博客的评论中给出答案 。知道了包裹性之后,我们还是继续思考:float为什么要具有包裹性?其实答案还得从float的设计初衷来寻找,float是被设计用于实现文字环绕效果的。文字环绕图片比较好理解,但是如果想要让文字环绕一个div呢?此时div不被“包裹”起来,那么如何去实现环绕效果?道理很简单,你也可能是那种一点即通的聪明人,但是关键在于思考。 2.4. 清空格float还有一个大家可能不是很熟悉的特性??清空格。按照管理,咱还是先举例子说明。上图中。第一个例子,正常的img中间是会有空格的,因为多个标签会有换行,而浏览器识别换行为空格,这也是很正常的。第二个例子中,img增加了float:left的样式,这就使得img之间没有了空格,四个img紧紧挨着。如果大家之前没注意,现在想想之前写过的程序,是不是有这个特性。为什么float适合用于网页排版(俗称“砌砖头”)?就是因为float排版出来的网页严丝合缝,中间连个苍蝇都飞不进去。“清空格”这一特性的根本原因是由于float会导致节点脱离文档流结构。它都不属于文档流结构了,那么它身边的什么换行、空格就都和它没关系的,它就尽量的往一边去靠拢,能靠多近就靠多近,这就是清空格的本质。(float内容比较多,咱们分上、下两篇来介绍,这是上篇。下篇将马上发出,敬请期待)-------------------------------------------------------------------------------------------------------------欢迎关注我的教程:《从设计到模式》《深入理解javascript原型和闭包系列》《微软petshop4.0源码解读视频》《json2.js源码解读视频》也欢迎关注我的开源项目??wangEditor,简洁易用的web富文本编辑器-------------------------------------------------------------------------------------------------------------

css知多少(2)--学习css的思路_html/css_WEB-ITnose

两周之前写过该系列的第一篇,其实当时只是一个想法,这段时间迟迟未更新,是在思考一个解决过程。现在初有成效,就开更吧。 1. 一个段子开题不必太严肃,写博客也不像写书,像聊天似的写东西是最好的表达方式。记得之前看过一个段子,也可能是一件真事儿,这不重要。大体内容如下:一个香港的教授说:我们香港的大学和大陆的大学差的很远啊,大陆的大学连看门保安都懂得哲学,因为当你想要进入校园时,保安都会问你一个很哲学的问题“你是谁,你从哪里来,你到哪里去?”。看完段子的第一反映肯定是很自嘲的笑了,笑了之后就忘了,该干嘛干嘛去了。但是我觉得这句话确实有那么一点高达上的意思,虽然我不知道什么是哲学。“你是谁,你从哪里来,你到哪里去”,如果映射到我们这次CSS教程上,可以提这么几个问题:CSS是什么,如何深入理解,它和html是个怎样的关系; CSS有几种来源(5种来源); CSS要干什么事情,如何结合html实现的;看过我其他教程的朋友都知道我的原则:我要写东西,必须又一个我觉得很特别而且很合理、高效的思路,如果没有我宁可不写。大部分写CSS的人一上来可能写选择器,但是我不会那样。闲话不说。要想从根上了解这些问题,还是先从浏览器开始吧。 2. 浏览器是如何工作的之前看过一篇文章,叫做《浏览器的工作原理:新式网络浏览器幕后揭秘》。文章言简意赅的介绍了浏览器的工作过程,web前端程序猿最好了解一下。在此另外推荐一本书《WebKit技术内幕》,笔者很早就关注这本书,已列入近期的读书计划。文章中的内容暂且不详细提,我们先“断章取义”的只说CSS相关的部分。上图是webkit内核渲染html和css的流程图。大家可以从图中看到,html的解析是一条线,css的解析是一条线,两者会在某一点结合,形成最终的视图。如果我们以CSS为重点看,从上图中我们可以总结出学习CSS的三个突破点。浏览器如何加载和解析CSS??CSS的5个来源; CSS和html如何结合起来??选择器; CSS能控制那些显示方式??盒子模式、浮动、定位、背景、字体等;看到这里,不知道有没有朋友觉得很兴奋?因为我们在学习CSS之前,首先是分析浏览器如何加载、处理、使用CSS的,我们按照这个思路去写CSS的教程。而不是一上来就照本宣科的从id选择器开始。我这段时间为何一直没有写博客,其实是在冥思苦想一个更加合理、高效的思路和框架。我如果写出来的东西和别人的一样,那我自己也觉得没意思。本系列文章也是按照这个思路和框架,一步一步展开的。 3. CSS的加载过程CSS??Cascading Style Sheets??层叠样式表。“样式表”大家比较好理解,那何为“层叠”呢?从字面意思来看,层叠肯定是需要多层叠加起来。而这个“多层CSS”到底有几层,每一层是什么,我们程序猿用到的将是哪些层?这几个问题将是我们讨论的重点。另外,这么多层次叠加,如果出现冲突怎么处理,以哪个为准?这也是我们讨论的重点。最后,在这些层次中有一个“浏览器默认样式”层,即浏览器默认的各个html元素的样式。这次我们像浏览器这位“机器人”学习一下,看看它写出来的css能给我们什么帮助。 4. CSS和HTML的结合CSS如何与html结合呢??当然是通过选择器。CSS提供了多种多样的选择器类型,而且每个级别都在不断的增加新的选择器类型,使得选择器更加灵活易用。本系列将拿出一篇文章专门讲解选择器。聪明的人类也通过css提供的选择器在其他临近的方面开疆拓土,例如jquery,zen-coding。对css选择器来说,有一个很重要的话题??级别。在大部分web前端面试题中,你都会看到css选择器级别的判断问题。《css设计指南》书中给出了一个概念??特指度,而且给出了计算公式和计算规则,还给出了一个简单的背诵口诀。想的真周到。最后,与选择器关联密切的还有伪类和伪元素,我们也将拿出一篇文章专门讲解伪类和伪元素,以及它们最典型的用法。 5. 页面呈现页面呈现可以分为两类??文字,块。针对文字来说,我们可以设置字体、字号、加粗、斜体、背景色等等; 对于块来说情况比较多,有盒子模型、浮动、定位、display、背景等;本系列会拿出很大的篇幅去讲解其中的基础知识,以及他们的一些重点应用。 6. 布局布局是css的重头戏,每个系统的布局都有其各自的特点。无好无坏,肯定是各有优缺点,不妨拿出几个比较典型的例子来一起分析一下。例如:经典三列布局 Bootstrap栅格布局 百度首页布局 微博布局 人人网布局 瀑布流布局??7. 下一步下面的文章将会一步一步展开本文的描述,从实例和代码中慢慢道来。继续期待吧!-------------------------------------------------------------------------------------------------------------欢迎关注我的微博。也欢迎关注我的教程:《从设计到模式》《深入理解javascript原型和闭包系列》《微软petshop4.0源码解读视频》《json2.js源码解读视频》-------------------------------------------------------------------------------------------------------------

css知多少(5)--选择器_html/css_WEB-ITnose

1. 引言从本节开始,就进入本系列的第二个部分??css和html的结合??说白了就是选择器。CSS中定义了样式,如何将这些样式设置到相应的html节点上?就不得不通过选择器。让浏览器知道css选择了哪一个dom节点,浏览器就会乖乖的把相应的样式渲染成视图。至于css能把页面渲染成什么样子,这是本系列的第三部分。第一部分讲css样式的加载和层叠,第二部分讲选择器以及选择器的等级,第三部分讲呈现的各种样式(背景、字体、定位、浮动等)。这样一个思路,也正式浏览器使用css的流程,是最有效的学习思路。(第二节中讲过,此处再回顾一遍) 2. 选择器说道css选择器,大家都知道有许多种,但是真要你去掰着手指头数一数的话,你可能需要数几分钟。其实这么多选择器,完全可以分为两类:标签选择器(*是特殊情况),可但标签,也可上下文多标签; 属性选择器(id和class都是属性,特殊的属性);2.1. 标签选择器 2.1.1 通用选择 *通用选择器 * 大家应该都比较熟悉了,最常用的就是 *{margin:0; box-sizing:border-box;}。mragin:0咱们在上一节已经说过,box-sizing:border-box将在后面的盒子模型那块再详细描述。例如,我们在检测bootstrap3的样式时,也可以看到它用到了 * 选择器: 2.1.2 单标签单标签选择器是最基础的css知识了,在上一节的浏览器默认样式中,到处都用了单标签选择。这里不再赘述,css基础薄弱的朋友,可以先去补补课。 2.1.3 多标签多标签选择器一般和html上下文有关,它有以下集中分类选择一个祖先的所有子孙节点,例如 div p{?} 选择一个父元素的所有直属节点,例如 div > p{?} 选择某一个元素紧挨着的兄弟节点,例如 li + li{?} 选择某一个元素的所有同胞节点,例如 span ~ a{?} 以上各种情况的组合应用(不要组合过于复杂,编码讲求可读性第一)给大家列举一个比较典型的应用,如下图上图中的效果应该比较常见,在各个菜单之间加下划线。我之前的实现是:每个li都加一个border-bottom,在把最后一个li的border-bottom去掉。其实完全没必要这样麻烦,下面一个样式设置即可解决:有点意思吧? 2.2. 属性选择器 2.2.1 特殊1:id选择器基础知识,不再赘述。按照许多css教程上讲的,id选择器和属性选择器是不同的两个类别,为什么要把id选择器放在属性选择器下面的呢?因为css选择器是根据html节点的特性来设置的,id也是一个属性,只是它是一个比较特殊的属性,每个html节点的id不能重复。由于特殊,而且比较常用,所以就单独给id选择器一个“#”,本质上就是一个属性选择器。下面两行代码的执行效果完全相同: 2.2.2 特殊2:class选择器基础知识,不再赘述。class也是一个特殊的属性,之所以把它放在属性选择器下,和上文将的id一样。 2.2.3 属性选择器属性选择器有两种情况:只通过属性名选择:img[title]{? } 通过属性名和属性值选择:input[type="text"]{?}这两个也是比较基础的,再次也就不再详细展开了,不了解的朋友可以去看看基础教程补补课。 3. 伪类和伪元素上文提到了若干种选择器类型,伪类和伪元素可针对任何一种选择器使用。 3.1. 伪类伪类分为UI伪类和结构化伪类。 3.1.1 UI伪类UI伪类都比较简单常用,我下面简单写几句代码,就不再详细说了。 3.1.2 结构化伪类(IE低版本不行)先问大家一个问题:如何实现一个表格间隔显示背景颜色,如图:最简单的方式莫过于使用结构化伪类,一句样式设置即可实现。结构化伪类有如下书写选项,至于什么意思,从字面意思即可理解: 3.2. 伪元素记住,伪元素是一个非常重要的概念!其中,:before和:after 非常常用。首先,咱们先看看:before和:after是怎么回事儿。上图中,我们可以看到,可以为元素前后添加内容。这里的“内容”还可以写成unicode编码的方式,如下图:另外,除了可以添加内容外,你还可以自定义执行内容的样式,如下图:以上大体了解了两者的基本用法,下面给家介绍两个典型的应用场景:第一,大家都知道fontAwesome吧,web最流行的icon字体库。这些小图标的应用就是通过伪元素来实现的,如下图:(不知道fontAwesome也没关系,我们在讲到css字体时,会详细介绍)第二,清除浮动的样式大家都知道吧?这就是一个很典型的伪元素应用场景:(在讲到css浮动时,会专门讲解clearfix) 4. 选择器的扩展选择器本来是css的一种规则,用于为css选择html节点的。但是聪明的人类还是通过选择器创造出了其他领域非常伟大的作品。 jQueryjQuery被推广流行的根本原因就是它的“Query”??基于css选择器的“Query”。现在的浏览器都支持querySelectAll()方法了,其实这就是W3C“抄袭”的jQuery的设计。相信各位web前端人员对jquery都比较熟悉了,这里点一下即可。 zen-Codingjquery可以通过一段css选择器表达式从既有的html结构中选择符合表达式的dom组,但是zen-coding反其道而行之??可以根据css选择器表达式创造出html节点。不得不佩服这帮人的创造力。如果你还没用过zen-coding,无论你以后用不用,建议你也一定要去体验一下! 5. 总结本节总结了css的选择器知识,知道了选择器有若干种类型。但是类型多了不一定是个好事儿,下一节就给大家说说类型太多带来的一个问题,以及解决方案。-------------------------------------------------------------------------------------------------------------欢迎关注我的教程:《从设计到模式》《深入理解javascript原型和闭包系列》《微软petshop4.0源码解读视频》《json2.js源码解读视频》也欢迎关注我的开源项目??wangEditor,简洁易用的web富文本编辑器-------------------------------------------------------------------------------------------------------------

css知多少(1)--我来问你来答_html/css_WEB-ITnose

1. 引言各位前端或者伪前端(比如作者本人)的同志们,css对你们来说不是很陌生。比如我,在几年之前上大学的时候,给外面做网站就用css,而且必须用css。这样算下来也得六年多了,有些功能可能轻车熟路,有些功能可能需要上网查查,看似能应付得了工作的事情??我之前也是(现在工作上不做开发了,只是业余还写代码)。世界上没有绝对简单的东西,只是我们认为它是简单的。就像我们公司现在的开发情况,开发的大环境刚刚转入B/S,开发领导以前都是用.net做C/S的,在我看来,他们就觉得js、css就是那么回事儿,没多高深。但是我还是抱着敬畏的态度,买了一本《CSS设计指南(第三版)》,不管自己会的,还是不会的,我都统统看一遍。书邮回来之后,我花了三个晚上看完了。我有个习惯,就是做一件事情一定要又一个结果,不能觉得自己脑子里明白了就算了,一定要写出来,甚至做出例子来才算完。于是乎,就写几篇博客呗。利己利人。下面我把在看书过程中遇到的自己认为比较重要的(掌握不牢固)或者之前不懂的,都先列出来,出几个题目,各位看官可以试着想想。如果您都会了,那您基础很牢固,没得说;如果你有些不会的,着急你就赶紧自己查查答案,不着急你就等着我后面的博客介绍。闲话说了很多,现在开始! 2. 问题01. 有些浏览器不完全支持css3,现在可以用哪个工具去检测浏览器是否支持,以及支持哪些项?提示:Mo****zr02. 常用的html标签,它们的display属性一般默认为block和inline。有哪些常用标签的display不是block和inline,这些标签显示的时候和block/inline有何区别?提示:table,input, textarea03. 是否用过@import?(比较简单)04. 一个表格的第一行显示红色背景,最后一行显示蓝色背景,中间行使用灰色/白色间隔的背景,如何写?提示:结构化伪类(比较简单)05. 伪元素 ::before、::after 是否用过?都是在哪些地方用的?提示:清除浮动、为一个div增加一个“三角” 重要 06. css??层叠样式表,其中的“层叠”该如何理解? 重要 提示:层叠,即一层一层叠加起来,关键是知道一共有几层,每一层都是什么07. 对“特指度(specificity)”了解多少,知道“I-C-E”的计算规则吗? 重要 提示:参考http://www.cnblogs.com/netlyf/archive/2009/06/19/1506427.html08. 特指度理解不是很麻烦,关键是分析多个css选择符和计算麻烦。有一个简单的解决方案,四句口诀,叫做“查理版简单层叠要点”,是否了解? 重要 提示:例如,“包含ID的选择符要胜过包含类的选择符...”09. 搜索“浏览器默认样式”,找到它,打开看看,里面是浏览器默认的所有样式,你是否都能看得懂。 重要 提示:例如 display:table 和 display:block 有何区别?10. 在你开发的系统的第一个css文件的第一行,就要写上 * {margin:0; padding:0} ,这是为何? 提示:浏览器兼容性(比较简单)11. 样式 p{margin-top:50px; margin-bottom:30px;} 将会导致p之间的垂直距离是多少?提示:垂直外边距??水平外边距????比较简单的基础知识12. “盒子模型”大家都了解了(不知道赶紧去恶补!!),盒子模型的width其实是指内容的宽度,不包括padding、border、margin。其实这样对我们做css布局是很不利的,有什么方法可以让width是全部的宽度? 重要 提示:box-sizing(注意IE低版本的兼容性)13. float的一些影响会让我们经常哭笑不得(特别是初学者),其实了解了float的设计初衷,也许你就会理解这些东西。float的设计初衷是什么?提示:就简单的一句话??14. float具有“包裹性”??例如:abc 和 abc 两者的宽度是不一样的,不信可以为 p 加上背景色试试。是否理解这种“包裹性”?试着想想,还有哪些元素(或css属性)也有这种“包裹性”? 重要 提示:和第13问题有密切关系15. float还有一个表象是“破坏性”,它会导致父元素高度塌陷,这个大家应该都知道吧?那么这是为何呢?另外,还有哪个css属性,也导致这种“破坏性” 重要 提示:float和absolute都将导致元素脱离文档流(针对13、14、15问题,可以参考教程http://www.imooc.com/learn/121和http://www.imooc.com/learn/192,讲的很好,只是讲师的声音很有“磁性”,要忍耐住)16. css清除浮动有三种方法,是否知道。你平时是怎么清除浮动的?业内最常用的经典清除浮动样式是什么? 重要 提示:搜索“clearfix”17. 相对定位relative如何理解,它和绝对定位absolute的最根本区别是什么?提示:一个在文档流内,一个在文档流外18. “定位上下文”是否知道? 重要 19. 经典的网页三列布局如何实现?如果不考虑IE6、7,最好的实现多列布局的方式是什么? 重要 提示:table-cell20. 是否用过inline-block,IE6、7如何兼容?提示:比较简单,百度即可 3. 结束当前就总结了这么多问题,大家可以对照着问题想想答案。如果你觉得还有写比较重要的知识,可以给我留言,我将会考虑加入进来。另外,接下来我将写一个关于css重点知识的简短的系列文章,以及结合我做过的wangEditor富文本框以及对bootstrap框架的了解,把本文这些问题介绍一下。近期工作很忙,更新起来可能会很慢,敬请期待吧!-------------------------------------------------------------------------------------------------------------欢迎关注我的微博。也欢迎关注我的教程:《从设计到模式》《深入理解javascript原型和闭包系列》《微软petshop4.0源码解读视频》《json2.js源码解读视频》-------------------------------------------------------------------------------------------------------------

css知多少(7)--盒子模型_html/css_WEB-ITnose

1. 引言从这一节开始,我们就进入本系列的第三部分??css呈现。本部分将描述css在页面的几种布局和呈现的特性。包括两类:文字、块。第一类??文字。这部分相对比较简单一些,例如设置字号、字体、颜色、背景色、是否加粗等。重点的地方在于设置字体、设置行高、文字相关的距离都用相对值,这些东西在《css知多少(4)??解读浏览器默认样式》那一节已经说过了。另外还有一个重点,就是web端最流行的字体库fontAwesome,关于它我之前有一篇文章专门讲过,请参见《请用fontAwesome代替网页icon小图标》,这里就不再重复去讲了。第二类??块。这部分的知识点非常多,重要的有:盒子模型,float,position,display。本文章讲盒子模型,后面的文章会依次介绍其他的内容。 2. 什么是“盒子”说道“盒子”我还记得好几年之前,我还在上大学的时候,被人问道过“盒子模型”,我当时都不知道什么意思。回到宿舍急忙上网去查,原来就是我早就知道的margin,padding和border,但是我竟然不知道“盒子”这个词。??所以,不要只满足于网上查来的代码段、小技巧,要全面的了解一些知识体系。当然,后来我又知道,盒子模型不仅仅是margin,padding和border,还有其他的知识。在此插一句题外话,也是我这几天思考的一点东西。我在思考:web前端的这么知识应该是怎样的一个知识体系架构?之前我以为可以以W3C为纲要,把W3C的东西学会了就够了。后来发现我错了,W3C还不全面。真正全面的覆盖了web前端知识体系的东西是??浏览器内核??这并不是说让你去详细了解浏览器内核、做出一个浏览器。浏览器是web前端代码运行的一个平台,浏览器内核里有哪些模块,我们就需要去学习哪些东西。详细的先不说,以后有机会再分享。这里照顾一下初学者。初学css的朋友,一开始学css基础知识的时候一定学过padding,border和margin,即内边距、边框、外边距。他们三者就构成了一个“盒子”。就像我们收到的快递,本来买了一个小小的iphone,收到的确实那么大一个盒子。因为iphone白色的包装盒和iphone机器之间有间隔层(内边距),iphone白色盒子有厚度,虽然很薄(边框),盒子和快递箱子之间还有一层泡沫板(外边距)。这就是一个典型的盒子。如上图,真正的内容就是这些文字,文字外围有10px的内边距,5px的border,10px的外边距。看到盒子了吧? 3. 盒子的宽度 3.1. 设置了固定宽度的情况下遇到这种问题,我建议在查询各种资料之前,不如先自己动手做一个实验:如上图,得到网页效果之后,我们可以用截图工具来量一下文字内容的宽度。发现,文字内容的宽度刚好是300px,就是我们设置的宽度。因此,在盒子模型中,我们设置的宽度都是内容宽度,不是整个盒子的宽度。而整个盒子的宽度是:(内容宽度 + border宽度 + padding宽度 + margin宽度)之和。这样我们改四个中的其中一个,都会导致盒子宽度的改变。这对我们来说不友好。没关系,这个东西不友好早就有人发现了,而且已经解决,下文再说。 3.2. 充满父容器的情况下默认情况下,div的display:block,宽度会充满整个父容器。如下图:但是别忘记,这个div是个盒子模型,它的整个宽度包括(内容宽度 + border宽度 + padding宽度 + margin宽度),整个的宽度充满父容器。问题就在这里。如果父容器宽度不变,我们手动增大margin、border或padding其中一项的宽度值,都会导致内容宽度的减少。极端情况下,如果内容的宽度压缩到不能再压缩了(例如一个字的宽度),那么浏览器会强迫增加父容器的宽度。这可不是我们想要看到的。 3.3. 包裹内容的情况下这种情况下比较简单,内容的宽度按照内容计算,盒子的宽度将在内容宽度的基础上再增加(padding宽度 + border宽度 + margin宽度)之和。 4. 再看盒子的宽度前面提到,为盒子模型设置宽度,结果只是设置了内容的宽度,这个不合理。如何解决这一问题?答案就是:box-sizing:border-box如上图,div设置了box-sizing:border-box之后,300px的宽度是内容 + border + 边框的宽度(不包括margin),这样就比较符合我们的实际要求了。建议大家在为系统写css时候,第一个样式是:大名鼎鼎的bootstrap也把box-sizing:border-box加入到它的 * 选择器中,我们为什么不这样做呢? 5. 纵向margin的重叠这里提到margin,不得不提一下margin的这一特性??纵向重叠。如下图,的纵向margin是16px,那么两个之间纵向的距离是多少?按常理来说应该是 16 + 16 = 32px,但是答案仍然是 16px。因为纵向的margin是会重叠的,大的会把小的“吃掉”(可以自己去实验)。 6. 用div画“三角”“三角”在日常的网页中是很常见的,例如百度首页:以及我的开源项目wangEditor(http://www.cnblogs.com/wangfupeng1988/p/4198428.html)中的页面效果:你当然可以使用背景图片、fontAwesome来实现这一效果,但是你也可以用div来实现这一效果,很简单,而且可以封装通用: 7. 总结这一节我们用不小的篇幅讲解了盒子模型的相关知识,比较适合初学者,但是更加适合那些没有系统学习过css的有经验的开发人员,还是那句话:建议大家系统的学习知识体系。下面我们将继续这一部分,再说一说float。-------------------------------------------------------------------------------------------------------------欢迎关注我的教程:《从设计到模式》《深入理解javascript原型和闭包系列》《微软petshop4.0源码解读视频》《json2.js源码解读视频》也欢迎关注我的开源项目??wangEditor,简洁易用的web富文本编辑器-------------------------------------------------------------------------------------------------------------

css知多少(11)--position_html/css_WEB-ITnose

1. 引言本文将用一篇文章介绍position(定位),在学习position之前,我们应该去思考一个问题:什么情况下我们需要定位?如果没有定位将无法满足我们怎样的需求?我们要知道,被人类创造出来的每一个知识,都有它的用途,都要解决一些之前遇到的问题。如果没有定位,我们做出来的网页将会是按部就班的自上而下、自左而右的平铺在浏览器上,外加通过margin和padding调整一下间距,还有就是通过float来浮动某些元素。做一些简单的网页这样就够了,例如N年之前的yahoo,虽然现在看来很low。但是有些情况下,这种按部就班的网页排版满足不了我们的要求,我们需要某些元素跑出来,悬浮在网页上面,而且需要给它指定一个位置。这时候我们就需要用到了position,而且是非用不可。如下图: 2. relative查资料可知道,position一共有四个可选属性:static/relative/absolute/fixed。其中static(静态定位)是默认值,即所有的元素如果不设置其他的position值,它的position值就是static,有它跟没有它一样。就不多介绍了。相对定位relative可以用一个例子很轻松的演示出来。例如我们写4个,出来的样子大家不用看也能知道。然后我们在第三个上面,加上position:relative并且设置left和top值,看这个有什么变化。上图中,大家应该要识别出两个信息(相信大部分人会忽略第二个信息)第三个发生了位置变化,分别向右向下移动了10px; 其他的三个位置没有发生变化,这一点也很重要。因此,relative会导致自身位置的相对变化,而不会影响其他元素的位置、大小的变化。这是relative的要点之一。还有第二个要点,就是relative产生一个新的定位上下文,下文有关于定位上下文的详细介绍,这里可以先通过一个例子来展示一下区别:注意看这两图的区别,下文将有解释。 3. absolute说道absolute,推荐大家去看一个视频教程,讲师对absolute讲的非常透彻,本文的一些内容也是参考了这篇教程,好东西大家一起分享吗!话归正传,咱们还是拿之前那个例子说事儿,先写一个基本的页面??4个然后,我们把第三个改为absolute,看看会发生什么变化。从上面的结果中,我们能看出几点信息:absolute元素脱离了文档结构。和relative不同,其他三个元素的位置重新排列了。只要元素会脱离文档结构,它就会产生破坏性,导致父元素坍塌。(此时你应该能立刻想起来,float元素也会脱离文档结构) absolute元素具有“包裹性”。之前的宽度是撑满整个屏幕的,而此时的宽度刚好是内容的宽度。 absolute元素具有“跟随性”。虽然absolute元素脱离了文档结构,但是它的位置并没有发生变化,还是老老实实的呆在它原本的位置,因为我们此时没有设置top、left的值。 absolute元素会悬浮在页面上方,会遮挡住下方的页面内容。最后,通过给absolute元素设置top、left值,可自定义其内容,这个都是平时比较常用的了。这里需要注意的是,设置了top、left值时,元素是相对于最近的定位上下文来定位的,而不是相对于浏览器定位。下文马上会讲定位上下文。但是有时候设置top、left值并不是定位的最佳解决方案。例如想要元素A紧跟在元素B的上方,可通过设置元素B为absolute,然后调整B的margin值来确定,这样更有效率。如下图:以上提到的信息,如果展开来说,内容非常多,而且用文本也不好描述,还是推荐大家去看慕课网的那篇视频教程,讲的很有意思。最后,再提几个小知识点。设置absolute会使得inline元素被“块”化,这在上一节将display时已经说过; 设置absolute会使得元素已有的float失效。不过float和absolute同时使用的情况不多; 上文提到了absolute会使元素悬浮在页面之上,如果有多个悬浮元素,层级如何确定?答案是“后来者居上”4. fixed其实fixed和absolute是一样的,唯一的区别在于:absolute元素是根据最近的定位上下文确定位置,而fixed永远根据浏览器确定位置。上文很多次提到了“定位上下文”,那么它到底是一个什么东东?答案马上揭晓。 5. 定位上下文5.1 relative的定位relative元素的定位永远是相对于元素自身位置的,和其他元素没关系,也不会影响其他元素。5.2 fixed的定位fixed元素的定位永远是相对于浏览器边界的,和其他元素没有关系。但是它具有破坏性,会导致其他元素位置的变化。5.3 absolute的定位absolute的定位相对于前两者要复杂许多。如果为absolute设置了top、left,浏览器会根据什么去确定它的纵向和横向的偏移量呢?答案是浏览器会递归查找该元素的所有父元素,如果找到一个设置了position:relative/absolute/fixed的元素,就以该元素为基准定位,如果没找到,就以浏览器边界定位。如下两个图所示:上图中的“某一层祖先元素”就是该absolute元素的定位上下文。讲到这里,我们上文中的那个图,大家能看明白了吧?还有不明白的可以留言给我。 6. 总结我感觉position这篇文章是这一系列中最难写的文章,它的知识点比较多,而且非常难理解,因此position也是css的一个重点知识,不懂position的前端开发人员要抓紧恶补一下。写了这么多,感觉还是写的不是很全面,或者不是很系统,很希望大家把自己的意见反馈给我。这个系列博客算是这个教程的第一版,我计划后期抽时间会录制一个视频版,到时候希望会更加全面系统一些。-------------------------------------------------------------------------------------------------------------欢迎关注我的教程:《从设计到模式》《深入理解javascript原型和闭包系列》《微软petshop4.0源码解读视频》《json2.js源码解读视频》也欢迎关注我的开源项目??wangEditor,简洁易用的web富文本编辑器-------------------------------------------------------------------------------------------------------------

《css知多少》系列完结_html/css_WEB-ITnose

《css知多少》系列就此完结了。常来光顾的朋友可能会觉得突然:css的知识点还有很多,怎么突然就完了,还没讲完呢?这样说是对的。不过凡事都有一个定位,如果盲目求多,定位模糊,那样就没有目的没有方向了。我的身份不是前端开发人员,而是产品经理。我规划的产品是一款项目管理软件,我也是一个PMP。我深知一个项目一定要有目标、范围、进度和质量要求。一旦达到,项目即可结束,准备下一个项目的启动。我接下来,要继续优化我的富文本编辑器wangEditor。还要把我之前写的《深入理解javascript原型和闭包》做一次修订,录制成视频教程。另外,我还想录制一个MS Project的使用教程,发挥一下我PMP的作用。Project是一款非常强大的项目进度管理软件,但是真正能用得好的项目经理,并不多。闲话不扯,书归正传。《css知多少》的读者建议是了解css基础知识(或者刚刚入门),但是没有系统学习、归纳、总结过的人,还有那些整天忙于coding、bug、加班当饭吃的,而没有时间去看书学习的码工们。《css知多少》里虽然内容不多,但是都是我觉得应该讲的基础,那些不需要讲的基础我就没有讲。所以,如果你是css大牛,那你不必看了(来给我指正一下我也欢迎啊!);如果你css都没有入门,那你也不用看了,我是从来不会写入门教程的。我的经历告诉我:学习有捷径。学习的捷径之一就是多看看别人是怎么理解这些知识的。举两个例子。如果你喜欢《水浒》,千万不要只读原著当故事看,一定要读一读各代名家的批注和点评,看他们是如何理解的。之前学C#时,看《CLR via C#》晦涩难懂,但是我又通过看《你必须知道的.net》而更加了解了。因为后者就是中国一个80后写的,我通过他对C#的了解,作为桥梁和阶梯,再去窥探比较高达上的书籍和知识。??《css知多少》也是一样的。最后,真诚的希望你能借助别人的力量来提高自己。我也一直在这样要求我自己。该系列目录如下:css知多少(1)??我来问你来答 css知多少(2)??学习css的思路 css知多少(3)??样式来源与层叠规则 css知多少(4)??解读浏览器默认样式 css知多少(5)??选择器 css知多少(6)??选择器的优先级 css知多少(7)??盒子模型 css知多少(8)??float上篇 css知多少(9)??float下篇 css知多少(10)??display css知多少(11)??position -------------------------------------------------------------------------------------------------------------欢迎关注我的教程:《从设计到模式》《深入理解javascript原型和闭包系列》《微软petshop4.0源码解读视频》《json2.js源码解读视频》也欢迎关注我的开源项目??wangEditor,简洁易用的web富文本编辑器-------------------------------------------------------------------------------------------------------------

web 浏览器桌面通知NOTIFICATION

这个需要自己手写来模拟旧版的Notification(Chrome20几)支持内嵌html以及一些复杂的类型新版的API已经去掉了,要想实现,可以自己模拟一个

如何配置Web服务器实现负载均衡

不建议windows使用软件来做负载均衡,linux因为开源还可以考虑。 如果应用真的需要还是用硬件负载均衡设备来做吧。

如何在多web服务器共享SESSION数据

  一、问题起源  稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个模块中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题,就是用户在这个服务器登录之后,进入另一个服务器的别的模块时,仍然需要重新登录,这就是一次登录,全部通行的问题,映射到技术上,其实就是各个服务器之间如何实现共享 SESSION 数据的问题。  二、PHP SESSION 的工作原理  在解决问题之前,先来了解一下 PHP SESSION 的工作原理。在客户端(如浏览器)登录网站时,被访问的 PHP 页面可以使用 session_start() 打开 SESSION,这样就会产生客户端的唯一标识 SESSION ID(此 ID 可通过函数 session_id() 获取/设置)。SESSION ID 可以通过两种方式保留在客户端,使得请求不同的页面时,PHP 程序可以获知客户端的 SESSION ID;一种是将 SESSION ID 自动加入到 GET 的 URL 中(这个只能在unix系统下能实现,windows系统不能实现自动加入url中),或者 POST 的表单中,默认情况下,变量名为 PHPSESSID;另一种是通过 COOKIE,将 SESSION ID 保存在 COOKIE 中,默认情况下,这个 COOKIE 的名字为 PHPSESSID。这里我们主要以 COOKIE 方式进行说明,因为应用比较广泛。  那么 SESSION 的数据保存在哪里呢?当然是在服务器端,但不是保存在内存中,而是保存在文件或数据库中。默认情况下,php.ini 中设置的 SESSION 保存方式是  files(session.save_handler = files),即使用读写文件的方式保存 SESSION 数据,而 SESSION 文件保存的目录由 session.save_path 指定,文件名以  sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。如果访问量大,可能产生的  SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path="N;/save_path",N 为分级的级数  ,save_path 为开始目录。当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到  相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件。读取 SESSION 数据是也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应  的 SESSION 变量。  三、多服务器共享SESSION 的主要障碍及解决办法  通过了解 SESSION 的工作原理,我们可以发现,在默认情况下,各个服务器会各自分别对同一个客户端产生SESSION ID,如对于同一个用户浏览器,A 服务器产生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a,而 B 服务器生成的则是c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。  确定了问题所在之后,就可以着手进行解决了。想要共享 SESSION 数据,那就必须实现两个目标:  一个是各个服务器对同一个客户端产生的 SESSION ID 必须相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE;  另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。 简单地说就是多服务器共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION  数据。  第一个目标的实现其实很简单,只需要对 COOKIE 的域(domain)进行特殊地设置即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各  个服务器所设置的 COOKIE 是不能相互访问的。  四、代码实现  首先创建数据表,MySQL 的 SQL 语句如下:  CREATE TABLE `sess` (  `sesskey` varchar(32) NOT NULL default "",  `expiry` bigint(20) NOT NULL default "0",  `data` longtext NOT NULL,  PRIMARY KEY (`sesskey`), KEY `expiry` (`expiry`)  ) TYPE=MyISAM  sesskey 为 SESSION ID,expiry 为 SESSION 过期时间,data 用于保存 SESSION 数据。  默认情况下 SESSION 数据是以文件方式保存,想要使用数据库方式保存,就必须重新定义 SESSION 各个操作的处理函数。PHP 提供了 session_set_save_handle()  函数,可以用此函数自定义 SESSION 的处理过程,当然首先要先将 session.save_handler 改成 user,可在 PHP 中进行设置: session_module_name("user");  接下来着重讲一下 session_set_save_handle() 函数,  此函数有六个参数: session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc ) 各个参数为各项操作的函数名,这些操作依次是:  打开、关闭、读取、写入、销毁、垃圾回收。PHP 手册中有详细的例子,  在这里我们使用 OO 的方式来实现这些操作,详细代码如下:    define("MY_SESS_TIME",3600); //SESSION 生存时长  //类定义  class My_Sess  {  /**  * 数据库连接对象,设置成了静态变量,因为不设置为静态变量,数据库连接对象在其他方法不能被调用,目前还不清楚什么原因  *  * @var obj  */  static public $db;  /**  * 构造函数  *  * @param obj $dbname 数据库连接对象  */  function __construct($dbname){  self::$db = $dbname;  }  /**  * 初始化session,使用数据库mysql来存储session的值,利用session_set_save_handler方法实现  *  */  function init()  {  $domain = "";  //不使用 GET/POST 变量方式  ini_set("session.use_trans_sid",0);  //设置垃圾回收最大生存时间  ini_set("session.gc_maxlifetime",MY_SESS_TIME);  //使用 COOKIE 保存 SESSION ID 的方式  ini_set("session.use_cookies",1);  ini_set("session.cookie_path","/");  //多主机共享保存 SESSION ID 的 COOKIE,因为我是本地服务器测试所以设置$domain=""  ini_set("session.cookie_domain",$domain);  //将 session.save_handler 设置为 user,而不是默认的 files  session_module_name("user");  //定义 SESSION 各项操作所对应的方法名  session_set_save_handler(  array("My_Sess","open"),//对应于类My_Sess的open()方法,下同。  array("My_Sess","close"),  array("My_Sess","read"),  array("My_Sess","write"),  array("My_Sess","destroy"),  array("My_Sess","gc")  );  //session_start()必须位于session_set_save_handler方法之后  session_start();  }  function open($save_path, $session_name) {  //print_r($sesskey);  return true;  } //end function  function close(){  if(self::$db){  self::$db->close();  }  return true;  }  function read($sesskey) {  $sql = "SELECT `data` FROM `sess` WHERE `sesskey`=" . (self::$db->qstr($sesskey)) . " AND `expiry`>=" . time();  $rs=self::$db->execute($sql);  if($rs){  if($rs->EOF){  return "";  } else {//读取到对应于 SESSION ID 的 SESSION 数据  $v = $rs->fields[0];  $rs->close();  return $v;  }  }  return "";  }  function write($sesskey,$data){  $qkey = $sesskey;  $expiry = time()+MY_SESS_TIME;  $arr = array(  "sesskey" => $qkey,  "expiry" => $expiry,  "data" => $data);  self::$db->replace("sess", $arr, "sesskey", true);  return true;  }  function destroy($sesskey) {  $sql = "DELETE FROM `sess` WHERE `sesskey`=".self::$db->qstr($sesskey);  $rs =self::$db->execute($sql);  return true;  }  function gc($maxlifetime = null) {  $sql = "DELETE FROM `sess` WHERE `expiry`<".time();  self::$db->execute($sql);  //由于经常性的对表 sess 做删除操作,容易产生碎片,  //所以在垃圾回收中对该表进行优化操作。  $sql = "OPTIMIZE TABLE `sess`";  self::$db->Execute($sql);  return true;  }  }  //使用 ADOdb 作为数据库抽象层。  require_once("adodb/adodb.inc.php");  //数据库配置项,可放入配置文件中(如:config.inc.php)。  $db_type = "mysql";  $db_host = "127.0.0.1";  $db_user = "root";  $db_pass = "111";  $db_name = "sess_db";  //创建数据库连接。  $cnn=&ADONewConnection($db_type);  $cnn->Connect($db_host,$db_user,$db_pass, $db_name);  //初始化 SESSION 设置,初始化时已经包含了session_start()!  $sess = new My_Sess($cnn);  $sess->init();  $_SESSION["a"]="aaa";  $_SESSION["b"]="bbb";  $_SESSION["c"]="ccc";  print_r($_SESSION);  ?>  五、遗留问题 如果网站的访问量很大的话,SESSION 的读写会频繁地对数据库进行操作,这样效率就会明显降低。考虑到 SESSION 数据一般不会很大,可以尝试用  C/Java 写个多线程的程序,用 HASH 表保存 SESSION 数据,并通过 socket 通信进行数据读写,这样 SESSION 就保存在内存中,读写速度应该会快很多。另外还可  以通过负载均衡来分担服务器负载。

如何在多web服务器共享SESSION数据

一、问题起源  稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个模块中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题,就是用户在这个服务器登录之后,进入另一个服务器的别的模块时,仍然需要重新登录,这就是一次登录,全部通行的问题,映射到技术上,其实就是各个服务器之间如何实现共享 SESSION 数据的问题。  二、PHP SESSION 的工作原理  在解决问题之前,先来了解一下 PHP SESSION 的工作原理。在客户端(如浏览器)登录网站时,被访问的 PHP 页面可以使用 session_start() 打开 SESSION,这样就会产生客户端的唯一标识 SESSION ID(此 ID 可通过函数 session_id() 获取/设置)。SESSION ID 可以通过两种方式保留在客户端,使得请求不同的页面时,PHP 程序可以获知客户端的 SESSION ID;一种是将 SESSION ID 自动加入到 GET 的 URL 中(这个只能在unix系统下能实现,windows系统不能实现自动加入url中),或者 POST 的表单中,默认情况下,变量名为 PHPSESSID;另一种是通过 COOKIE,将 SESSION ID 保存在 COOKIE 中,默认情况下,这个 COOKIE 的名字为 PHPSESSID。这里我们主要以 COOKIE 方式进行说明,因为应用比较广泛。  那么 SESSION 的数据保存在哪里呢?当然是在服务器端,但不是保存在内存中,而是保存在文件或数据库中。默认情况下,php.ini 中设置的 SESSION 保存方式是  files(session.save_handler = files),即使用读写文件的方式保存 SESSION 数据,而 SESSION 文件保存的目录由 session.save_path 指定,文件名以  sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。如果访问量大,可能产生的  SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path="N;/save_path",N 为分级的级数  ,save_path 为开始目录。当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到  相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件。读取 SESSION 数据是也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应  的 SESSION 变量。  三、多服务器共享SESSION 的主要障碍及解决办法  通过了解 SESSION 的工作原理,我们可以发现,在默认情况下,各个服务器会各自分别对同一个客户端产生SESSION ID,如对于同一个用户浏览器,A 服务器产生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a,而 B 服务器生成的则是c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。  确定了问题所在之后,就可以着手进行解决了。想要共享 SESSION 数据,那就必须实现两个目标:  一个是各个服务器对同一个客户端产生的 SESSION ID 必须相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE;  另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。 简单地说就是多服务器共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION  数据。  第一个目标的实现其实很简单,只需要对 COOKIE 的域(domain)进行特殊地设置即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各  个服务器所设置的 COOKIE 是不能相互访问的。  四、代码实现  首先创建数据表,MySQL 的 SQL 语句如下:  CREATE TABLE `sess` (  `sesskey` varchar(32) NOT NULL default "",  `expiry` bigint(20) NOT NULL default "0",  `data` longtext NOT NULL,  PRIMARY KEY (`sesskey`), KEY `expiry` (`expiry`)  ) TYPE=MyISAM  sesskey 为 SESSION ID,expiry 为 SESSION 过期时间,data 用于保存 SESSION 数据。  默认情况下 SESSION 数据是以文件方式保存,想要使用数据库方式保存,就必须重新定义 SESSION 各个操作的处理函数。PHP 提供了 session_set_save_handle()  函数,可以用此函数自定义 SESSION 的处理过程,当然首先要先将 session.save_handler 改成 user,可在 PHP 中进行设置: session_module_name("user");  接下来着重讲一下 session_set_save_handle() 函数,  此函数有六个参数: session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc ) 各个参数为各项操作的函数名,这些操作依次是:  打开、关闭、读取、写入、销毁、垃圾回收。PHP 手册中有详细的例子,  在这里我们使用 OO 的方式来实现这些操作,详细代码如下:    define("MY_SESS_TIME",3600); //SESSION 生存时长  //类定义  class My_Sess  {  /**  * 数据库连接对象,设置成了静态变量,因为不设置为静态变量,数据库连接对象在其他方法不能被调用,目前还不清楚什么原因  *  * @var obj  */  static public $db;  /**  * 构造函数  *  * @param obj $dbname 数据库连接对象  */  function __construct($dbname){  self::$db = $dbname;  }  /**  * 初始化session,使用数据库mysql来存储session的值,利用session_set_save_handler方法实现  *  */  function init()  {  $domain = "";  //不使用 GET/POST 变量方式  ini_set("session.use_trans_sid",0);  //设置垃圾回收最大生存时间  ini_set("session.gc_maxlifetime",MY_SESS_TIME);  //使用 COOKIE 保存 SESSION ID 的方式  ini_set("session.use_cookies",1);  ini_set("session.cookie_path","/");  //多主机共享保存 SESSION ID 的 COOKIE,因为我是本地服务器测试所以设置$domain=""  ini_set("session.cookie_domain",$domain);  //将 session.save_handler 设置为 user,而不是默认的 files  session_module_name("user");  //定义 SESSION 各项操作所对应的方法名  session_set_save_handler(  array("My_Sess","open"),//对应于类My_Sess的open()方法,下同。  array("My_Sess","close"),  array("My_Sess","read"),  array("My_Sess","write"),  array("My_Sess","destroy"),  array("My_Sess","gc")  );  //session_start()必须位于session_set_save_handler方法之后  session_start();  }  function open($save_path, $session_name) {  //print_r($sesskey);  return true;  } //end function  function close(){  if(self::$db){  self::$db->close();  }  return true;  }  function read($sesskey) {  $sql = "SELECT `data` FROM `sess` WHERE `sesskey`=" . (self::$db->qstr($sesskey)) . " AND `expiry`>=" . time();  $rs=self::$db->execute($sql);  if($rs){  if($rs->EOF){  return "";  } else {//读取到对应于 SESSION ID 的 SESSION 数据  $v = $rs->fields[0];  $rs->close();  return $v;  }  }  return "";  }  function write($sesskey,$data){  $qkey = $sesskey;  $expiry = time()+MY_SESS_TIME;  $arr = array(  "sesskey" => $qkey,  "expiry" => $expiry,  "data" => $data);  self::$db->replace("sess", $arr, "sesskey", true);  return true;  }  function destroy($sesskey) {  $sql = "DELETE FROM `sess` WHERE `sesskey`=".self::$db->qstr($sesskey);  $rs =self::$db->execute($sql);  return true;  }  function gc($maxlifetime = null) {  $sql = "DELETE FROM `sess` WHERE `expiry`<".time();  self::$db->execute($sql);  //由于经常性的对表 sess 做删除操作,容易产生碎片,  //所以在垃圾回收中对该表进行优化操作。  $sql = "OPTIMIZE TABLE `sess`";  self::$db->Execute($sql);  return true;  }  }  //使用 ADOdb 作为数据库抽象层。  require_once("adodb/adodb.inc.php");  //数据库配置项,可放入配置文件中(如:config.inc.php)。  $db_type = "mysql";  $db_host = "127.0.0.1";  $db_user = "root";  $db_pass = "111";  $db_name = "sess_db";  //创建数据库连接。  $cnn=&ADONewConnection($db_type);  $cnn->Connect($db_host,$db_user,$db_pass, $db_name);  //初始化 SESSION 设置,初始化时已经包含了session_start()!  $sess = new My_Sess($cnn);  $sess->init();  $_SESSION["a"]="aaa";  $_SESSION["b"]="bbb";  $_SESSION["c"]="ccc";  print_r($_SESSION);  ?>  五、遗留问题 如果网站的访问量很大的话,SESSION 的读写会频繁地对数据库进行操作,这样效率就会明显降低。考虑到 SESSION 数据一般不会很大,可以尝试用  C/Java 写个多线程的程序,用 HASH 表保存 SESSION 数据,并通过 socket 通信进行数据读写,这样 SESSION 就保存在内存中,读写速度应该会快很多。另外还可  以通过负载均衡来分担服务器负载。

如何在多web服务器共享SESSION数据

一、问题起源  稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个模块中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题,就是用户在这个服务器登录之后,进入另一个服务器的别的模块时,仍然需要重新登录,这就是一次登录,全部通行的问题,映射到技术上,其实就是各个服务器之间如何实现共享 SESSION 数据的问题。  二、PHP SESSION 的工作原理  在解决问题之前,先来了解一下 PHP SESSION 的工作原理。在客户端(如浏览器)登录网站时,被访问的 PHP 页面可以使用 session_start() 打开 SESSION,这样就会产生客户端的唯一标识 SESSION ID(此 ID 可通过函数 session_id() 获取/设置)。SESSION ID 可以通过两种方式保留在客户端,使得请求不同的页面时,PHP 程序可以获知客户端的 SESSION ID;一种是将 SESSION ID 自动加入到 GET 的 URL 中(这个只能在unix系统下能实现,windows系统不能实现自动加入url中),或者 POST 的表单中,默认情况下,变量名为 PHPSESSID;另一种是通过 COOKIE,将 SESSION ID 保存在 COOKIE 中,默认情况下,这个 COOKIE 的名字为 PHPSESSID。这里我们主要以 COOKIE 方式进行说明,因为应用比较广泛。  那么 SESSION 的数据保存在哪里呢?当然是在服务器端,但不是保存在内存中,而是保存在文件或数据库中。默认情况下,php.ini 中设置的 SESSION 保存方式是  files(session.save_handler = files),即使用读写文件的方式保存 SESSION 数据,而 SESSION 文件保存的目录由 session.save_path 指定,文件名以  sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。如果访问量大,可能产生的  SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path="N;/save_path",N 为分级的级数  ,save_path 为开始目录。当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到  相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件。读取 SESSION 数据是也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应  的 SESSION 变量。  三、多服务器共享SESSION 的主要障碍及解决办法  通过了解 SESSION 的工作原理,我们可以发现,在默认情况下,各个服务器会各自分别对同一个客户端产生SESSION ID,如对于同一个用户浏览器,A 服务器产生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a,而 B 服务器生成的则是c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。  确定了问题所在之后,就可以着手进行解决了。想要共享 SESSION 数据,那就必须实现两个目标:  一个是各个服务器对同一个客户端产生的 SESSION ID 必须相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE;  另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。 简单地说就是多服务器共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION  数据。  第一个目标的实现其实很简单,只需要对 COOKIE 的域(domain)进行特殊地设置即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各  个服务器所设置的 COOKIE 是不能相互访问的。  四、代码实现  首先创建数据表,MySQL 的 SQL 语句如下:  CREATE TABLE `sess` (  `sesskey` varchar(32) NOT NULL default "",  `expiry` bigint(20) NOT NULL default "0",  `data` longtext NOT NULL,  PRIMARY KEY (`sesskey`), KEY `expiry` (`expiry`)  ) TYPE=MyISAM  sesskey 为 SESSION ID,expiry 为 SESSION 过期时间,data 用于保存 SESSION 数据。  默认情况下 SESSION 数据是以文件方式保存,想要使用数据库方式保存,就必须重新定义 SESSION 各个操作的处理函数。PHP 提供了 session_set_save_handle()  函数,可以用此函数自定义 SESSION 的处理过程,当然首先要先将 session.save_handler 改成 user,可在 PHP 中进行设置: session_module_name("user");  接下来着重讲一下 session_set_save_handle() 函数,  此函数有六个参数: session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc ) 各个参数为各项操作的函数名,这些操作依次是:  打开、关闭、读取、写入、销毁、垃圾回收。PHP 手册中有详细的例子,  在这里我们使用 OO 的方式来实现这些操作,详细代码如下:    define("MY_SESS_TIME",3600); //SESSION 生存时长  //类定义  class My_Sess  {  /**  * 数据库连接对象,设置成了静态变量,因为不设置为静态变量,数据库连接对象在其他方法不能被调用,目前还不清楚什么原因  *  * @var obj  */  static public $db;  /**  * 构造函数  *  * @param obj $dbname 数据库连接对象  */  function __construct($dbname){  self::$db = $dbname;  }  /**  * 初始化session,使用数据库mysql来存储session的值,利用session_set_save_handler方法实现  *  */  function init()  {  $domain = "";  //不使用 GET/POST 变量方式  ini_set("session.use_trans_sid",0);  //设置垃圾回收最大生存时间  ini_set("session.gc_maxlifetime",MY_SESS_TIME);  //使用 COOKIE 保存 SESSION ID 的方式  ini_set("session.use_cookies",1);  ini_set("session.cookie_path","/");  //多主机共享保存 SESSION ID 的 COOKIE,因为我是本地服务器测试所以设置$domain=""  ini_set("session.cookie_domain",$domain);  //将 session.save_handler 设置为 user,而不是默认的 files  session_module_name("user");  //定义 SESSION 各项操作所对应的方法名  session_set_save_handler(  array("My_Sess","open"),//对应于类My_Sess的open()方法,下同。  array("My_Sess","close"),  array("My_Sess","read"),  array("My_Sess","write"),  array("My_Sess","destroy"),  array("My_Sess","gc")  );  //session_start()必须位于session_set_save_handler方法之后  session_start();  }  function open($save_path, $session_name) {  //print_r($sesskey);  return true;  } //end function  function close(){  if(self::$db){  self::$db->close();  }  return true;  }  function read($sesskey) {  $sql = "SELECT `data` FROM `sess` WHERE `sesskey`=" . (self::$db->qstr($sesskey)) . " AND `expiry`>=" . time();  $rs=self::$db->execute($sql);  if($rs){  if($rs->EOF){  return "";  } else {//读取到对应于 SESSION ID 的 SESSION 数据  $v = $rs->fields[0];  $rs->close();  return $v;  }  }  return "";  }  function write($sesskey,$data){  $qkey = $sesskey;  $expiry = time()+MY_SESS_TIME;  $arr = array(  "sesskey" => $qkey,  "expiry" => $expiry,  "data" => $data);  self::$db->replace("sess", $arr, "sesskey", true);  return true;  }  function destroy($sesskey) {  $sql = "DELETE FROM `sess` WHERE `sesskey`=".self::$db->qstr($sesskey);  $rs =self::$db->execute($sql);  return true;  }  function gc($maxlifetime = null) {  $sql = "DELETE FROM `sess` WHERE `expiry`<".time();  self::$db->execute($sql);  //由于经常性的对表 sess 做删除操作,容易产生碎片,  //所以在垃圾回收中对该表进行优化操作。  $sql = "OPTIMIZE TABLE `sess`";  self::$db->Execute($sql);  return true;  }  }  //使用 ADOdb 作为数据库抽象层。  require_once("adodb/adodb.inc.php");  //数据库配置项,可放入配置文件中(如:config.inc.php)。  $db_type = "mysql";  $db_host = "127.0.0.1";  $db_user = "root";  $db_pass = "111";  $db_name = "sess_db";  //创建数据库连接。  $cnn=&ADONewConnection($db_type);  $cnn->Connect($db_host,$db_user,$db_pass, $db_name);  //初始化 SESSION 设置,初始化时已经包含了session_start()!  $sess = new My_Sess($cnn);  $sess->init();  $_SESSION["a"]="aaa";  $_SESSION["b"]="bbb";  $_SESSION["c"]="ccc";  print_r($_SESSION);  ?>  五、遗留问题 如果网站的访问量很大的话,SESSION 的读写会频繁地对数据库进行操作,这样效率就会明显降低。考虑到 SESSION 数据一般不会很大,可以尝试用  C/Java 写个多线程的程序,用 HASH 表保存 SESSION 数据,并通过 socket 通信进行数据读写,这样 SESSION 就保存在内存中,读写速度应该会快很多。另外还可  以通过负载均衡来分担服务器负载。

如何在多web服务器共享SESSION数据

php可以配置某个域名共享session,也可以自己设置

[译]如何为Web应用的性能打包_html/css_WEB-ITnose

原文: Packaging for Performance 杰微刊 兼职译者缪晨翻译, 杰微刊 审校及发布。 最近有个很有趣的主题,是关于web应用的静态资源(JS/CSS)打包的。 在当今前端界Craig Silverstein"s 和 Rebecca Murphey"s 在这个主题上的几篇文章表现出了对打包本质的深刻理解。现在面对的主要问题是:JavaScript与CSS的打包策略(基于现有最佳性能的实践)在迁移到HTTP/2的时候是否需要做一些改变?虽然在HTTP/2中打包的作用——减少HTTP请求数,变得毫无作用,但实际上我们还没有迁移到HTTP/2。以上的几篇文章证明了这个事实。在eBay 几个月前准备将网站迁移到到HTTPS时做过类似的测试。在这篇文章当中,我将简单介绍下我们打包的方法,以及我们的方法对性能的提高。 eBay的绝大多数页面遵循一个本地模板来打包静态资源。一个页面中的所有CSS跟JavaScript都被各自打包成一个资源,CSS在head标签中加载,而JS在底部加载。虽然这在减少HTTP请求数上做的很好,但依然有可挖掘的空间——最主要的一点是更有效的利用浏览器的缓存。当用户访问eBay的页面时,所有没访问过的页面都需要下载整个JS与CSS,但其中包含了前面页面中用过的核心类库(如jQuery)。当我们计划迁移到HTTPS(和HTTP/2)时,我们意识到这种粗粒度的打包策略是不行的。我们及其他人的研究都表明,这种整个打包在一起再每个页面单独加载资源的方式,在性能的优化上并不好。我们需要一个平衡,这时我们提出了我们自己的打包解决方案。 Inception 我们首先标注出了所有eBay页面都会调用的核心JS和CSS,然后把他们聚合为一个资源。为了达到这个目的,我们建立了个内部的Node.js 模块,叫做Inception。这个模块包含了所有公用的JS和CSS模块,而且会被所有团队(eBay各个页面的所有者)作为依赖添加。被标注的核心JS类库为:jQuery, marko (模板引擎), marko-widgets (UI 组件抽象),以及内部的分析及跟踪类库。而CSS我们有我们自己的类库叫做Skin,从中我们提取了core、button、icons、dialog和form等模块。在eBay我们使用的打包工具叫作 Lasso。Inception模块作为Lasso的插件提供以下功能: 1、强制所有模块(购买,售卖,浏览,结算等)遵循准确的核心JS和CSS库的版本。不遵循话会构建失败。 2、将Inception 中的资源打包成一个URL,所有的模块都引用相同的URL,例如:inception-hashcode.js 和 inception-hashcode.css. 3、使各团队依然可以将Inception中的JS/CSS 作为他们自己模块依赖的一部分进行引用。Lasso的优化器会删除重复的加载,并确定只有一份会被发送到浏览器端。由于两个原因这个功能好到爆。首先,我们想要推广模块级的封装,因此当团队构建模块时,他们可以自由地将某个核心库作为依赖添加,而不必担心重复加载。这样可以保证这个模块可以独立运行。第二,各团队不需要追踪依赖是否在Inception当中。他们可以随意的添加依赖,工具可以处理这方面的优化。 现在有了Inception,我们可以看下我们得到的好处: 1、 浏览器缓存: 关于将所有资源打包进一个URL,上文提到了一个缺点,就是不能很好的利用浏览器缓存。Inception解决了这个问题。因为核心的JS和CSS类库(顺带一提,这是主要的负荷)在不同的模块上都采用同一个URL进行引用,这样在用户各种浏览eBay的过程中,浏览器缓存都被很有效的利用了。这个缓存大大提升了性能,特别是连接缓慢的情况下。附带的,新的浏览器通过各种方式支持 代码缓存,这样我们同时可以避免对Inception中的大量的JS进行重复的解析与编译。 2、库文件一致性: 在之前的打包系统中我们发现在各个模块中核心类库的版本缺乏一致。由于各个团队维护自己的核心类库,例如当用户从一个模块跳转到另一个的时候,使用了不用版本的jQuery或者按钮样式。实际结果并不只是UI不一致,而且实现也是不一致的。Inception修复了这个问题,因为它是一个统一维护核心类库的地方。 3、通向先进的Web应用: 当所有模块中的页面依赖于相同的核心类库时,他们支架你的过渡就变得非常容易,因为在浏览过程中只有这个应用单独需要的JS和 CSS需要下载。这样我们就可以使用 应用壳架构来构建我们的web应用,为将eBay建设成为一个先进Web应用铺平了道路,我们过去已经(在一个模块中) 探索 过一个类似的途径——使用 Structured Page Fragments 的方法,我们可以看到感知性能的明显提升。 4、简单的升级方式: 最后,Inception使我们可以在一个核心的地方将核心类库升级到一个更新的版本。Inception本身遵从 语义化版本,因此所有使用Inception的团队Inception 都可以根据一个语义的方式来获得更新。升级在之前是很有问题的,因为我们必须在挨个团队进行手工升级。 模块 现在核心类库已经由Inception来管理了,那页面中的其它资源呢?就是那些应用/模块中特定的CSS和JS。对于每个模块我们采用另一种打包的方式,我们把分为两组:常量和变量。 常量: 在所有的请求当中不变的CSS和JS 被定为常量。这些主要适用于各个模块中在不同的请求参数时不变的UI组件。常量模块打包成一个资源,这样又可以继续利用浏览器缓存。当一个用户重复浏览同一个页面的时候,这个包一般都会命中浏览器缓存,进而获得性能上的优势。 变量: 一小部分资源在各个页面中会根据请求的参数不同而变化。这些变化是由于实验,用户登录状态,业务逻辑等原因。这种资源被分入变量组,在运行时单独打包。这些只有极低的缓存命中率,可能每个会话都要通过网络重新下载。 总结 作为总结,每个页面会有6个资源包(3个JS和3个CSS),每个包都有各自的用途。所有的URL都根据内有进行哈希,这样缓存会自动过期。 1.Inception —打包核心JS和CSS,最高的负载。 2.常量 —打应用中包不变的CSS和JS。中级的负载。 3.变量 —打包应用中变化,最低的负载。 现在的状态下,这个打包策略貌似是最符合性能需求的。他在HTTP请求次数与浏览器缓存之间找到了一个正确的平衡点。明年我们将迁移到HTTP/2,我们也将继续改进这个方法,尝试更细粒度的打包方案,当然,性能是关键。 ------------好久不见的分隔线------------ 杰微刊旨在分享优质的内容。 我们水平有限,但理想高远。 也同样期待有理想的您对这个世界的贡献。 欢迎任何目的的联系。欢迎关注杰微刊

webmagic怎样判断爬虫状态是关闭还是正在运行

spider.getStatus();//获取爬虫状态spider.getStatus().equals(Spider.Status.Running);//运行中Spider.Status.InitSpider.Status.RunningSpider.Status.Stopped

如何将柯达的扫描控件用于在web上

1.先从网上下载Kodak组件,总共有十来个.dll .OCX文件,我们只需用到其中的两个就OK了。 2.打开你的项目,先引用IMGEDIT.OCX和IMGSCAN.OCX。(如果引用时有问题,得在“运行”里用命令“regsvr32.exe ”执行一下)。 3.在开始位置引用命名空间

uiwebview 加载html 复制功能不能用

url解码之后是html标签,你试着能不能把保存成HTML文件,接着加载HTML文件就可以了。或是用一个谷歌的框架,能解析出HTML标签中的图片地址之类的。希望能给你一点思路

Web安全技术与防火墙毕业论文参考文献(15个)

[1] 杨波,朱秋萍. Web安全技术综述[J]. 计算机应用研究, 2002,(10) . [2] 罗铁坚,徐海智,董占球. Web安全问题[J]. 计算机应用, 2000,(04) . [3] 张霆,王亚东,陈玉华. Web安全技术与防火墙的功能[J]. 黑龙江水专学报, 2000,(03) . [4] 苏莹莹. Web安全技术[J]. 牙膏工业, 2003,(04) . [5] 赵伟,贾卓生. 应用级的Web安全[J]. 铁路计算机应用, 2004,(01) . [6] 谭云松,史燕. 一种新的Web安全与防火墙技术[J]. 计算机时代, 2002,(03) . [7] 邓谱. Web安全技术与防火墙[J]. 重庆电力高等专科学校学报, 2000,(04) . [8] 刘大勇. Web的安全威胁与安全防护[J]. 大众科技, 2005,(06) . [9] 杨继东. 浅析密码与Web安全[J]. 甘肃农业, 2005,(05) . [10] 李文锋. Web攻击方法及其安全研究[J]. 科学技术与工程, 2005,(04) . [1] 边娜. Web安全技术与防火墙[J]. 山西财经大学学报, 2000,(S2) [1] 邓谱. Web安全技术与防火墙[J]. 重庆电力高等专科学校学报, 2000,(04) [2] 张洪霞 , 刘仁涛. 浅谈安全的网络城墙——防火墙[J]. 应用能源技术, 2002,(04) [3] 沈芳阳, 阮洁珊, 李振坤, 黄智勇, 邓静, 刘怀亮, 柳正青. 防火墙选购、配置实例及前景[J]. 广东工业大学学报, 2003,(03) [4] 史晓龙. 防火墙技术在网络中的应用[J]. 公安大学学报(自然科学版), 2001,(03) [5] Web应用防火墙来势汹汹[J]. 电力信息化, 2009,(07) [6] 闫宝刚. 防火墙组网方案分析[J]. 大众标准化, 2004,(08) [7] 潘登. 浅析防火墙技术[J]. 株洲工学院学报, 2004,(02) [8] 芦军, 丁敏. 浅谈防火墙设计[J]. 房材与应用, 2004,(01) [9] 陈冰. 企业计算机网络防火墙的选择[J]. 供用电, 2004,(04) [10] 徐文海. 防火墙技术及虚拟专用网络的建立[J]. 铁道运营技术, 2003,(04)

webservice有哪些协议

WebService有哪些协议?这个问题问的可能会有点问题.首先:Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。他自己本身是一个技术的名称而已如果您说的是.NET的WebService那么就是SOAP协议了..XML格式的.具体的话.技术支持Web Service平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,Web Service平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。这些协议有:XML和XSD可扩展的标记语言(标准通用标记语言下的一个子集)是Web Service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD 定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。Web Service平台是用XSD来作为数据类型系统的。当你用某种语言如VB. NET或C# 来构造一个Web Service时,为了符合Web Service标准,所有你使用的数据类型都必须被转换为XSD类型。如想让它使用在不同平台和不同软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是一种协议,如 SOAP。xml web service[2]SOAPSOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。例如,你可以使用 SMTP,即因特网电子邮件协议来传递SOAP消息,这可是很有诱惑力的。在传输层之间的头是不同的,但XML有效负载保持相同。Web Service 希望实现不同的系统之间能够用“软件-软件对话”的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现“基于Web无缝集成”的目标。WSDLWeb Service描述语言WSDL 就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。UDDIUDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。调用RPC与消息传递Web Service本身其实是在实现应用程序间的通信。我们有两种应用程序通信的方法:RPC远程过程调用 和消息传递。使用RPC的时候,客户端的概念是调用服务器上的远程过程,通常方式为实例化一个远程对象并调用其方法和属性。RPC系统试图达到一种位置上的透明性:服务器暴露出远程对象的接口,而客户端就好像在本地使用的这些对象的接口一样,这样就隐藏了底层的信息,客户端也就根本不需要知道对象是在哪台机器上。软件支持操作系统离不开丰富的应用软件的支持。同样,Web Service这项技术只有通过日益广泛的应用才能体现出其价值,比较流行的实现方法是使用.NET 和 Java两种技术,并且两种实现方法可以互相操作;如今我们已经可以看到使用微软、Oracle、SUN、Borland等不同厂商的Web Service构建工具建立的Web Service应用。微软.NET微软的.NET技术应该算是时下最为流行的Web Service 开发技术。首先因为其公司在以前相应的产品就占有相当大的市场份额,以至使新推出的.NET得以有比较稳定的用户群;其次也是更重要的是 .NET平台不仅延续了微软一贯的编程风格,而且还增加了许多支持Web 服务的关键性技术,使得.NET在操作的简单性和执行的稳定性,高效性上达到了一个非常好的结合。微软的Visual Studio. NET便是一个便于 Web 服务的开发工具。微软的目标是,将其新编程语言——C#作为Web Service的首选语言。虽然C#看起来与Java类似,但是还有一些Java中没有的独特的功能。.NET技术中用于Web Service 开发的主要工具是ASP. NET。从技术上说,ASP. net  提供了一些超出ASP以前版本的优点(例如:代码和HTML(标准通用标记语言下的一个应用)的分离,与脚本语言相比较,对“真正”的编程语言如 C# 的支持)。IBM的WebSphereIBM公司是业界第一家能够提供全面支持Web服务的电子商务基础设施中间件的公司。通过多年来与W3C(The World Wide Web Consortium)的共同努力,包括DB2、Lotus、Tivoli 和WebSphere在内的所有IBM软件都实现了对SOAP、WSDL、UDDI、Linux、XML(标准通用标记语言下的一个子集)、J2EE等开放技术和标准的全面支持。IBM公司的WebSphere也是比较好的基础架构软件开发平台。WebSphere软件平台及开发工具包括WebSphere Studio Application DeveloperWSAD  基于J2EE、XML 和Web服务等开放标准,并具备 IBM 在可靠性、扩展性和安全性上的主要优势。WebSphere 是 IBM 在 Web Services策略中的核心平台,它支持所有开发、发布、部署 Web Services应用所必需的开放标准和技术,包括 UDDI,SOAP,J2EE,WSDL,和对 XML 技术集成的增强,这使得它在全球有很多用户。Borland的JBuilderBorland公司在 JBuilder7中,用户可以用其Borland Web Services Kit for Java和Borland JBuilder MobileSet 3进行更快捷地开发Web Service和无线应用。这样将使开发者能够在同一个开发环境中轻松地创建和集成Web Service。新推出的JBuidler8更是针对Web Service开发更提供了方便和高效的方法。总之,在Web Service开发上,.NET 和Java都是很好的选择,尽管两者都有一些需要完善的地方,但是它们还是最好的开发手段和技术。具体选择哪种开发工具,也是仁者见仁,智者见智的问题。从根本上说,这两种方法没有孰优孰劣的问题,只是根据使用者对这两种方法的掌握程度和对具体语言的偏爱程度来决定。

基于sso的web系统怎么实现权限管理

单点登录SSO(SingleSignOn)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因此要点也就以下几个:存储信任验证信任只要解决了以上的问题,达到了开头讲得效果就可以说是SSO。最简单实现SSO的方法就是用Cookie,实现流程如下所示:常用的两种web单点登录SSO的实现原理X不然发现以上的方案是把信任存储在客户端的Cookie里,这种方法虽然实现方便但立马会让人质疑两个问题:Cookie不安全不能跨域免登对于第一个问题一般都是通过加密Cookie来处理,第二个问题是硬伤,其实这种方案的思路的就是要把这个信任关系存储在客户端,要实现这个也不一定只能用Cookie,用flash也能解决,flash的SharedObjectAPI就提供了存储能力。一般说来,大型系统会采取在服务端存储信任关系的做法,实现流程如下所示:常用的两种web单点登录SSO的实现原理以上方案就是要把信任关系存储在单独的SSO系统(暂且这么称呼它)里,说起来只是简单地从客户端移到了服务端,但其中几个问题需要重点解决:如何高效存储大量临时性的信任数据如何防止信息传递过程被篡改如何让SSO系统信任登录系统和免登系统对于第一个问题,一般可以采用类似与memcached的分布式缓存的方案,既能提供可扩展数据量的机制,也能提供高效访问。对于第二个问题,一般采取数字签名的方法,要么通过数字证书签名,要么通过像md5的方式,这就需要SSO系统返回免登URL的时候对需验证的参数进行md5加密,并带上token一起返回,最后需免登的系统进行验证信任关系的时候,需把这个token传给SSO系统,SSO系统通过对token的验证就可以辨别信息是否被改过。对于最后一个问题,可以通过白名单来处理,说简单点只有在白名单上的系统才能请求生产信任关系,同理只有在白名单上的系统才能被免登录。通过第二种方案的演变,可以使用发放票据的方式实现websso登录:常用的两种web单点登录SSO的实现原理通过第三种方式,客户端只做票据的发放和获取,不涉及用户信息传输,用户信息均可交给子系统和SSO系统之间处理,更有效保护用户隐私。以上只是提供了些简单的实现技术,但需要强调的是这只是技术实现而已,仅仅是为了解决上面谈到的一些问题,SSO本身来说并不是什么高科技,有了这个认识比较有利于我们深入探索SSO

基于sso的web系统怎么实现权限管理

单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因此要点也就以下几个: 存储信任 验证信任 只要解决了以上的问题,达到了开头讲得效果就可以说是SSO。最简单实现SSO的方法就是用Cookie,实现流程如下所示: 常用的两种web单点登录SSO的实现原理X 不然发现以上的方案是把信任存储在客户端的Cookie里,这种方法虽然实现方便但立马会让人质疑两个问题: Cookie不安全 不能跨域免登 对于第一个问题一般都是通过加密Cookie来处理,第二个问题是硬伤,其实这种方案的思路的就是要把这个信任关系存储在客户端,要实现这个也不一定只能用Cookie,用flash也能解决,flash的Shared Object API就提供了存储能力。 一般说来,大型系统会采取在服务端存储信任关系的做法,实现流程如下所示: 常用的两种web单点登录SSO的实现原理 以上方案就是要把信任关系存储在单独的 SSO系统(暂且这么称呼它)里,说起来只是简单地从客户端移到了服务端,但其中几个问题需要重点解决: 如何高效存储大量临时性的信任数据 如何防止信息传递过程被篡改 如何让SSO系统信任登录系统和免登系统 对于第一个问题,一般可以采用类似与memcached的分布式缓存的方案, 既能提供可扩展数据量的机制,也能提供高效访问。对于第二个问题,一般采取数字签名的方法,要么通过数字证书签名,要么通过像md5的方式,这就需要SSO系统返回免登URL的时候对需验证的参数进行md5加密,并带上token一起返回,最后需免登的系统进行验证信任关系的时候,需把这个token传给SSO系统,SSO系统通过对token的验证就可以辨别信息是否被改过。对于最后一个问题,可以通过白名单来处理,说简单点只有在白名单上的系统才能请求生产信任关系,同理只有在白名单上的系统才能被免登录。 通过第二种方案的演变,可以使用发放票据的方式实现websso登录: 常用的两种web单点登录SSO的实现原理 通过第三种方式,客户端只做票据的发放和获取,不涉及用户信息传输,用户信息均可交给子系统和SSO系统之间处理,更有效保护用户隐私。 以上只是提供了些简单的实现技术,但需要强调的是这只是技术实现而已,仅仅是为了解决上面谈到的一些问题,SSO本身来说并不是什么高科技,有了这个认识比较有利于我们深入探索SSO

java web目录文件中.setting这个文件夹是什么意思

.classpath保存的是项目所用的外部引用包的路径。.mymetadata 保存的是工程属性文件.project 是工程构建配置文件.metadata文件夹的作用 Eclipse内所有改动都放在这个文件夹.setting文件夹的作用 .settings 把.js文件的编码方式由改成默认的ISO-8859-1改成GBK时,这个文件会有记录。 如果把这个文件删了,在eclipse中查看js文件的中文字符就是乱码,但发布的时候还是能正常显示中文的。 结论:这个文件是eclipse查看js文件的时候用的,记录了用什么编码方式查看。与发布无关。.settings文件夹不会被打到.war包里。-----------by copy

outlook电脑客户端与Outlook Web Access 设置

登录新浪邮箱,点击设置点击"帐户",下拉至"POP3/SMTP服务",选择开启,点击保存。这一步是必须的,接受其他服务商的邮件也必须设置,而不是仅仅的配置outLook客户端。打开outLook,"开始"——"所有程序"——"outLook Express".在工具选项卡选择"帐户",选择"邮件",选择添加,选择"邮件".填写用户名和邮箱地址。这些步骤都很简单接下来就是重点。选择"POP3",接收邮件服务器和发送邮件服务器的地址可以通过登录你的网页版邮箱,在"帐户设置"中获取。下图是常用邮箱的地址然后填写帐户名和密码,帐户名已经自动填入,密码就是你登陆网页版邮箱的密码,无须选择安全密码登录,点击完成。这一步也很简单。回到帐户选项卡,选中账户,选择"属性",打开属性选项卡,选择"服务器",选择"我的服务器要求身份验证",点击"应用",点击"确定"。这一步也是必须的,否则就无法连接到服务器。8在工具栏选择"工具",选择"接收全部邮件",ok,一切完成,以后收发邮件就不用打开浏览器了。^^

Openvidu Server 的WebRTC通讯实现 IV

a. 在openvidu中,一个激活的会议由kurentoSession实例表示。当创参会者加入会议时,openvidu会创建一个kurentoSession实例。 b. 在kurento服务器上,一个会议由一个pipeLine 和N N个mediaEndpoint表示。N表是参会方数量,每一个参会方会创建一个发布媒体用的MediaElement和(n-1)个订阅其它媒体流用的MediaElement,它们被编排入一个PepleLine中, 形成N N的连接。 所以,当第一个用户加入会议室时,系统会在Openvidu上创建一个KurentoSession实例,同时在Kurento上创建一个pipleLine, KurentoSession 实例引用了这个pipepline. N个用户会有N个kurentoSession, 但只有一个pipleline。PipleLine的描述是在Kurento Client包里。 管理器中另外一个重要的是sessionManager,session代表的是会议,所以sessionMananger 实际就是所有具体会议的管理. 在io.openvidu.server.core包下的SessionManager只是一个虚类,它声明了一些会议的操作方法: 这些方法都和会议有关, 可以发现,上面的功能通常对应我们音视频软件进入会议室的功能。 开openvidu中,它的具体的实现是KurentoSessionManager,它会在server启动的时候初始化。 在III中说了,sessionid 代表的会议号,创建会议的时候会创建一个sessionNotActive(Session类)对象,代表的是还未正式使用的会议,当第一个用户首次加入的时候,才会正式使用这个会议,KurentoSessionManager的joinRoom方法描述了相关的逻辑。 与sessionNotActive不同,一个开始使用的会议用KurentoSession来表示(继承自Session),首次加入会议, 需要创建这个Ksession, 它会指定一个具体的Kurrento Server,ksession的创建需要指定具体kms,用来表示在具体哪个KMS创建会议。社区版实际上只有一个KMS,但在实现上如下图, 已经默认使用获取最小负载的方式获得kms。 sessionManager对外提供会议操作功能的统一入口,每个会议对应的kurentoSession负责实际与kurento server的通信,来完具体的会议操作。所以在kurentoSession中我们可以看到相类似的会议功能定义: 上图是一个包含有浏览器、application 、 openvidu server, 、kurento server 等在内的一个逻辑通讯图。 浏览器端加载会议应用程序,通过http协议与application server通信,完成业务请求和获取用于会议的token和sessionID. applicaiton server只负责业务请求,它通过与openvidu server通信来生成浏览器客户端加入会议需要的token和sessionID信息。 浏览器获取token和sessionid后,与openvidu建立websocket连接,它将openvidu作为webrtc中的singal server,与openvidu通信,完成建立webrtc所需要的singal通信。 与webrtc中描述的P2P通讯不同,kurento server 充当代理,与每一个参与方建立p2p连接,通过创建pipleline和编排media endpoint完成多方的通讯。 但是Kurento Server与任意参与方建立的通讯仍旧是P2P通讯。所以,浏览器会与kurento server建立webrtc连接。 他们的通讯默认是RTP over UPD, 也可以是RTP over TCP。 openvidu与kurento也是通过websocket连接进行通讯的,与kurento的通信包含两个方面: a. 作为控制方,创建pipleline,根据加入的用户创建media endpoint, 并编排他们。 b。 作为信号服务器, 与Kurento进行webrtc连接时需要的信号通讯:例如发送sdp, icecandidate,sdp响应等,由于kurento并不是浏览器端,Sdp answser的创建,也是由openvidu完成的。 Openvidu与Kurento之间的通讯编码使用json RPC方式。 kurento 提供了client 包,方便opnvidu 实现rpc调用。 4.1 PipleLine org.kurento.client包里包含一个pipleLIne类,它代表kurento server上的media pipleLine元素; 前面已经提到,一个会议对应一个kurencto pipleLine。而在openvidu中kurentoSession代表一个会议,它包含有一个pipleliene属性: private MediaPipeline pipeline; 在首个用户加入会议的时候,会创建PipleLine实例: 查看createPipeline方法可以看到,pipleLine使用kurentoclient来创建的。 kms.getKurentoClient().createMediaPipeline(...) PipleLine创建好一个,将作为会议的具体Rpc对象负责其它对象的创建和方法调用。 4.2 MediaEndpoint,publisherEndpoint、SubscriberEndpoint openvidu里定义了一个个类:MediaEndpoint。 它对应的是kurento server上MediaElement的抽象,下图是Kurento上的元素概念: 在MediaEndpoint类中,定义了三个endpoint属性,代表三种连接类型: ··· ··· WebRtcEndpoint 、RtpEndpoint 、PlayerEndpoint 这三个类来自kurent client包,代表JSonrpc的客户端类,在上图的kurento元素中能够找到对应的元素。 MediaEndpoint对三个类做了风中,使用endpointType来表示当前是那种类型(也就是哪个引用有值)。它有两个子类publisherEndpoint和SubscriberEndpoint,分别表示一个用于publish的mediaElement 和用于subscribe的mediaElement 。 在前文提到, openvidu的会议在kurento server上表示N*N 模型的media element关系, Server会为每一个参会者创建一个用于音视频发布的mediaElement 和(n-1)个用于订阅其它用户发布的音视频的media element,publisherEndpoint和SubscriberEndpoint对应的就是这个概念。 无论publisherEndpoint和SubscriberEndpoint是WebRtcEndpoint 、 RtpEndpoint,PlayerEndpoint中的哪个类型,它们封装的rpc对象都由 pipeline创建。 4.3 KurentoParticipant openvidu中的KurentoParticipant类代表的是参会方(不同于我们平时理解的用户),每个用户加入会议后才会创建KurentoParticipant,在 "3.Openvidu Server与WebRTC的通信" 的示例图中表征的是一个浏览器与Kurento server的连接。一个用户可以打开多个浏览器页面,每个加入会议的页面实际上都代表一个KurentoParticipant。 KurentoParticipant没有具体的JsonPRC对象,相反它拥有一个PublisherEndpoint和 一组subscribers,它们在kurento server刚好表示一个会议参与方: 由于KurentoParticipant代表的是会议的参会方,这个类中定义了几乎所有与publisher和subscribers 有关的操作: 4.4 KurentoSession KurentoSession 代表的是一个会议,在kurento上对应的是pipeline mediaElement,但它不属于JsonRPC对象,它对pipeline mediaElement的操作是由PipleLine Jsonrpc对象来完成的,所以它包含由pipeline属性: 这个类中定义了很多会议操作的方法: 浏览器客户端在创建连接获取token和session时,并不会直接创建KurentoSession,默认的只会创建一个session对象,并把它放在sessionNotActive组里。当用户Join会议的时候(调用 KurentoSessionManager.joinRoom(Participant participant, String sessionId, Integer transactionId) ),才会创建KurentoSession 实例。

使用Outlook web access 发邮件的时候,正文部分无法输入文字

请问如何解决的,我这也是显示存储空间不足,无法执行此命令

Exchange2003在win2003下如何实现web方式的登录(OWA)

一般要先安装一个 web 服务器

Outlook Web Access 是什么?

官网的说明,自己看下吧

如何监视在web应用中用户的登入与登出时间(原创)

在最近的工作中,由于为系统修改bug,发现了这样一个问题 在我们现存的一个系统中存在以下一个需求: 当用户登录成功时,会记录用户的登陆时间,当用户登出这个系统时,记录登出系统的时间,该时间记录在日志中供用户进行查询。 这是一个很普通的用户需求,在这个系统中,登陆成功后,将记录用户登录时间,当用户使用系统提供的"退出系统"按钮退出时,将触发一个事件进行记录用户登出系统的时间以及清空该用户session的操作。问题就出现在这里,在一般情况下,一个b/s结构的系统,用户在退出系统时的习惯,大多数是直接关闭页面,而不是使用系统提供的"退出系统"操作,因此,对于退出时间的记录就无法实现了。 那么,如何准确的记录用户登出的时间呢?这个是我今天要在这里讨论的问题。 在web应用中,一般采用session来维护用户的信息,一个HttpSession的开始代表用户进入该系统,而该HttpSession的结束才说明该用户在该系统访问的结束。如果用户不是显式的调用HttpSession.invalidate()方法的话,一个HttpSession是不会被认为结束的。因此我认为应该通过监视用户登录后绑定的HttpSession的方法来监视用户的登入与登出。 这与一般的论坛记录当前在线用户的方法应该是相同的,如果不监视session,不考虑用户超时登出的情况,则在线人数可能会一直增加下去。 下面说明我用来解决该问题的方法: 实际上,方法很简单。我定一个类实现了HttpSessionBindingListener的接口,该接口提供了两个方法valueBound和valueUnbound,valueBound表示当session与预定义的对象绑定时调用,valueUnbound则为session与预定义的对象取消绑定的时候调用,当然如果session超时或者invalidate的时候都会被调用。定义了这个类后我们要做的就是将该监听器和session绑定到一起。使用HttpSession.setAttribute("BinderObject",new SessionBinder());这样的方法即可。在该方法执行后,程序将调用valueBound方法。而当执行HttpSession.invalidate()方法后或者session超时以后,程序将调用valueUnbound方法,这样就可以通过定义这两个方法的方法体实现记录登入和登出时间或者其他的操作了。 以下是部分相关代码:import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionBindingListener;public class SessionBinder implements HttpSessionBindingListener {private String logId = ""; //将logId在加载session的时候进行记录,是因为当调用valueUnbound的时候无法在获取session中的信息 public void valueBound(HttpSessionBindingEvent event) {logId = (String)event.getSession().getAttribute("logId");System.out.println(logId+"Login successful");} public void valueUnbound(HttpSessionBindingEvent event) {System.out.println(logId+"Login out!");if (logId != null) {}}在登陆成功后绑定sessionrequest.getSession().setAttribute("logId", logId);request.getSession().setAttribute("BinderObject",new SessionBinder()); 登出时调用invaldate,取消session的绑定 request.getSession().invalidate();

请教下移植UIP时webserver如何修改

可以使用winhex软件,直接将HTML文件用WINHEX打开,有个菜单命令式保存为C文件,保存后就是数组了。软件的下载就不用说了吧。

Java,我做一个web项目的注销,怎么清除session里的值,

用session的removeAttribute("uiUsers");方法试试嘿嘿,不好用的话跟我说声,我再给你看看

什么是Web数据库,其基本工作原理是什么

数据库(database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用

Web数据库的原理与步骤

万维网简称为Web。Web可以描述为在Internet上运行的、全球的、交互的、动态的、跨平台的、分布式的、图形化的超文本信息系统。1.Web的工作原理Web是伴随着Internet技术而产生的。在计算机网络中,对于提供Web服务的计算机称为Web服务器。Web采用浏览器/服务器的工作方式。每个Web服务器上都放置着大量的Web信息。Web信息的基本单位是Web页(网页),多个网页组成了一个Web节点。每个Web节点的起始页称为“主页”,且拥有一个URL地址(统一资源定位地址)。Web节点之间及网页之间都是以超文本结构(非线性的网状结构)来进行组织的。2.Web的工作步骤Web的工作步骤如下。(1)用户打开客户端计算机中的浏览器软件(例如Internet Explorer)。(2)用户输入要启动的Web主页的URL地址,浏览器将生成一个HTTP请求。(3)浏览器连接到指定的Web服务器,并发送HTTP请求。(4)Web服务器接到HTTP请求,根据请求的内容不同作相应的处理,再将网页以HTML文件格式发回给浏览器。(5)浏览器将网页显示到屏幕上。WWW世界中的标记语言HTML语言HTML(Hypertext Markup Language,超文本标记语言)是创建网页的计算机语言。所谓网页实际上就是一个HTML文档。文档内容由文本和HTML标记组成。HTML文档的扩展名就是.html或.htm。浏览器负责解释HTML文档中的标记,并将HTML文档显示成网页。(1)HTML标记HTML标记的作用是告诉浏览器网页的结构和格式。每一个标记用尖括号<>括起来。大多数标记都有一个开始标记和一个结束标记。标记不分大小写。多数标记都带有自己的属性。例如字体标记<FONT>有FACE、COLOR、SIZE等属性:FACE定义字体;COLOR定义字体的颜色;SIZE定义字体的大小。使用格式:<FONT FACE= SONG SIZE=3 COLOR=RED > BEIJING </FONT>。网页中有很多文本链接和图片链接。链接,又被称为超链接,用于链接到WWW万维网中的其他网页上。在HTML文档中表示超链接的标记是<A>,通过属性HREF指出链接的网页地址URL。(2)HTML程序HTML程序必须以<HTML>标记开始,以</HTML>标记结束。在<HTML>和</HTML>标记之间主要由两部分组成:文件头和文件体。文件头用标记<HEAD> </HEAD>来标识,文件体用标记<BODY></BODY>来标识。在文件的头部通常包含整个网页的一些信息。例如<TITLE></TITLE>标记是用来说明网页的名称;<META></META>标记是用来说明网页的其他信息,如设计者姓名和版权信息等。所有在浏览器中要显示的内容称为网页的主体,必须放在<BODY></BODY>标记中。下面给出的是一个空网页的HTML程序。<HTML><HEAD><TITLE>(在此标记中写网页的标题)</TITLE></HEAD><BODY>(在此标记中写网页的内容)</BODY></HTML>(3)HTML规范HTML规范又称为HTML标准,它总在不断地发展。每一新版本的出现,HTML都会增加新的特性和内容。在不同的浏览器中,网页的显示效果可能会有所不同。每一个浏览器都使用自己独特的方式解释HTML文档中的标记,并且多数浏览器不完全支持HTML的所有特性。因为,像Microsoft和Netscape公司在HTML标准上又开发了一些特有的HTML标记和属性,称之为HTML的扩展。这些标记和属性只被他们自己的浏览器所识别,不可能被其他公司的浏览器识别。如果浏览器不能识别HTML文档中的标记,则会忽略这个标记。(4)HTML程序的编辑环境与运行环境HTML文档是一个普通的文本文件(ASCII),不包含任何与平台、程序有关的信息。因此HTML文档可以利用任何文本编辑器来方便地生成。要注意的是HTML文档的扩展名必须是.html或.htm。运行HTML文档可以在任何浏览器下进行,并可在浏览器上查看网页的HTML源代码。关于HTML语言中标记的种类与使用方法将会在第5章中更详细地进行介绍。可扩展标记语言(XML)HTML是Web上的通用语言,随着Internet的深入人心,WWW上的Web文件日益复杂化、多样化,人们开始感到了HTML这种固定格式的标记语言的不足。1996年W3C开始对HTML的后续语言进行研究,并于1998年正式推出了XML(Extensible Markup Language,可扩展标记语言)。在设计网页时,XML提供了比HTML更灵活的方法。(1)XML语言的特点XML是国际组织W3C为适应WWW的应用,将SGML (Standard Generalized Markup Language)标准进行简化形成的元标记语言。简单地说,XML是使用标记来描述内容或与内容相关的形式信息的通用语言。一个XML文档由标记和字符数据组成。而作为元标记语言,XML不再使标记固定,允许网页的设计者定义数量不限的标记来描述内容,同时还允许设计者创建自己的使用规则。(2)XML的DTDDTD(Document Type Definition,文档类型定义)是一组应用在XML文档中的自定义标记语言的技术规范。DTD中定义了标记的含义及关于标记的语法规则。语法规则中确定了在XML文档中使用哪些标记符,它们应该按什么次序出现,标记符之间如何 嵌套,哪些标记符有属性等等。DTD可以包含在它所描述的XML文档中,但通常它是一份单独的文档或者一系列文档。作为外部文件可通过URL链接,被不同的XML文档 共享。XML把DTD的定义权开放,不同行业可以根据自己的实际需求定义描述内容的DTD,以适应本行业内部的信息交流和存档需要。因此,适合于不同行业、不同平台的标记语言大批涌现。DTD定义的基本格式是:<!DOCTYPE 根元素[……规则……]>。其中的规则包括:元素声明ELEMENT,属性声明ATTLIST,实体声明ENTITY,等。通常出版发行业描述图书的信息需要有:书号、书名、作者、出版社、出版日期等,那么下面给出的便是为描述图书信息而制定的一个DTD和与它对应的XML文档。<?xml version=1.0 encoding=iso-8859-1?><!DOCTYPE BookInformation [<!ELEMENT BookInformation ((Book)+)><!ELEMENT Book(BookNumber, BookName, Writer, BookConcern, PublishingTime)><!ELEMENT BookNumber (#PCDATA)><!ELEMENT BookName (#PCDATA)><!ELEMENT Writer (#PCDATA)><!ELEMENT BookConcern (#PCDATA)><!ELEMENT PublishingTime(year, month)><!ELEMENT year(#PCDATA)><!ELEMENT month (#PCDATA)>]><BookInformation><Book><BookNumber>ISBN0001</BookNumber><BookName>XML3.0技术内幕</BookName><Writer>John</Writer><BookConcern>清华大学出版社</BookConcern><PublishingTime><year>2001</year><month>8</month></PublishingTime></Book><Book>另一本书信息省略</Book></BookInformation>不难看出,在XML的程序清单中使用了具有意义的标记,如<BookName>、<Writer>和<PublishingTime>等。这种用法的优点是:标记具有含义,源码易于阅读理解;其次是处理程序可以根据文档类型定义来验证XML文档是否合法。(3)XML的CSS与XSL强调内容描述与形式描述的分离,一方面可以使XML文件的编写者更集中精力于数据本身,而不受显示方式的细节影响;另一方面允许为相同的数据定义不同的显示方式,从而适合于不同应用、不同媒体,使XML数据得到最大程度的重用。XML文档数据的显示形式是通过样式单定义的。CSS(Cascading Style Sheets)是XML使用的一种标准的级联样式单,XSL(Extensible Style Language)则是可扩展的样式语言。由于XML允许用户创建任何所需的标记,而通用浏览器却既无法预期用户标记的意义,又无法为显示这些标记而提供规则,因此用户必须为自己创建的XML文档编写样式单,样式单可以实现共享。浏览器对一个XML文档的处理过程是,首先去关联它所指定的样式单文件,如果该样式单是一个XSL文件,则按照规定对XML数据进行转换然后再显示,XSL本身也是基于XML语言的,可以将XML转化为HTML后再显示。如果该样式单是一个CSS文件,浏览器就会按照样式单的规定给每个标记赋予一组样式后再显示。

如何让webbrowser控件支持Html5

代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Xilium.CefGlue; namespace Xilium.CefGlue.WindowsForms{ public class BsLifeSpanHandler : CefLifeSpanHandler { private CefWebClient bClient; public BsLifeSpanHandler(CefWebClient bc) { bClient = bc; } protected override void OnAfterCreated(Xilium.CefGlue.CefBrowser browser) { base.OnAfterCreated(browser); bClient.Created(browser); } }}然后打开CefWebClient.cs文件,添加声明1private readonly CefDownloadHandler downloadHandler;在构造函数中加入1downloadHandler = new BsDownloadHandler();然后添加一个方法名在文档末尾 protected override CefDownloadHandler GetDownloadHandler() { return downloadHandler; }

如何让webbrowser控件支持Html5

跟随窗体变化大小要在resize事件中,举例说明PrivateSubForm_Resize()WebBrowser1.Move10,10,Me.ScaleWidth-20,Me.ScaleHeight-20EndSub

有哪些关于JavaWeb后端的书籍?

从加入BAT起,就一直从事后端开发,从PHP到JAVA,也经历过自学成才的过程。接下来我就根据我的经验来为大家分享我读过的,javaweb后端开发的好书。《thinkinginjava》中文版叫《Java编程思想》,是Java学习领域的圣经,也是入门书。基本上,Java成手都会推荐新人来看这本,里面详尽介绍了Java的基本概念,对于打牢Java基础,后面不论是做web开发,还是app开发,都有非常重要的作用。不过这本书过于厚重,里面有些Java的使用方式已经过时,因此只建议读懂这本书的前半部分,夯实基础即可。《headfirstjava》这本书可以与上面的那本辅助着看,相对来说,它读起来更加轻快,里面很多结合实际生活的例子也很幽默,算是深入浅出。或者可以考虑先读这本,把基础打个七分牢固,然后再去读《thinkinginjava》来补充最后的三分。《headfirstservlet》javaweb开发少不了要知道servlet,就算现在有很多成熟的框架,比如SSH,SSM,SPRINGBOOT,其中已经将servlet的部分封装了起来,但是发展到后期想往高级Java工程师方向前进的话,还是需要去了解很多底层的原理。《图解HTTP》javaweb开发自然少不了web相关的。作为目前最广泛使用的http协议,在开发过程中自然也要掌握相关的知识,才能写出优雅美丽的接口。《JavaEE互联网轻量级框架整合开发》目前所有开发Javaweb的项目都会选择使用框架,从而减轻程序员的很多负担,目前常用的框架SSM已经逐渐把SSH淘汰,因此,非常建议了解这本介绍SSM框架的书,能够大大提高工作效率。《深入浅出SpringBoot2.x》最后是这本springboot,因为springboot目前势头更加强劲,由于它能够仅仅依赖注解就完成配置,而不需要很麻烦的xml文件,我们公司很多项目已经淘汰了SSM,用上了springboot。以上是我的浅见,欢迎各位在下方评论区给我交流点赞。

[江南游戏www.jnweb.org] 兵者诡道 (R.U.S.E)完整破解版怎么安

谁可以说一说?我和LZ是同样的情况

.net 读取文件 web程序如何读取文件 如何读取文件显示出来

不好意识,做任务的。

Web探索之旅 | 第一部分:什么是Web?

什么是 Web 呢? 这个问题不容易回答。 Web 这个英语单词有好几个意思:“网,蜘蛛网,网状物;万维网;织物;圈套”。 我们也经常用到它的合成词,例如 Webpage(网页。是 Web 和 page(page 表示“页面”)的合成),Website(网站。是 Web 和 site(site 表示“站点”)的合成)。 一般在 IT (Information Technology 的缩写,表示“信息技术”)领域,Web 被翻译成“网络”,或者很多时候我们不翻译,就直接用 Web 这个词。因为 network(或简称 net)这个单词也有“网络”的意思。但是 Web 和 network 是有区别的。 那么到底什么是 Web 呢? 在 IT 领域, Web 是 World Wide Web(万维网,一般简写为 WWW)的简称。World 表示“世界”,Wide 表示“广阔的”,Web就是“网”。 WWW 可以让 Web 客户端(例如我们常用的浏览器,如 Chrome,Firefox,等等)访问 Web 服务器上的页面。 是一个由许多互相链接的超文本组成的系统,通过互联网访问。 在这个系统中,每个有用的事物,称为一样“资源”,并且由一个 URI (Uniform Resource Identifier 的缩写,表示“统一资源标识符”)标识。 这些资源通过 HTTP (HyperText Transfer Protocol 的缩写,表示“超文本传输协议”。我们之后的课程会介绍 HTTP 协议并实践)协议传送给用户,用户通过点击链接来获得资源。 Web 是比较偏应用层的概念。可以说 network 是我们最宽泛的“网络”概念的底层基础,而 Web 则是指顶层的应用,甚至包含了人与人利用 Web 进行的交互。 用什么来形容 Web 比较好呢? 有的人可能会想到 surfing(“冲浪”),或者说 Surfing the Internet / Web(互联网 / 网际冲浪)。因为我们在网站上浏览网页时就有点像冲浪一般“一页页”地翻过。 不禁想起了腾格尔演唱的电视剧《康熙王朝》的片尾曲《大男人》:“一生有一种大海的气魄,岁月一页页无情翻过”。我们也经常“无情”地快速翻过我们的网页,甚至我们的人生。 但是说到 Web,我们还是用另一个意象来表示吧。 我选择用“蜘蛛网”来形象地表现 Web: 为什么用蜘蛛网(希望对蜘蛛恐惧的朋友见谅)来形象地表示呢? 因为 Web 在英语中有“蜘蛛网”的意思,而且蜘蛛网的每个连接的结点,正好可以表示全球这个大 Web 中的每一台电脑。只要上了网,这些电脑都在 Web 上互联。 这一节中,我们首先要来区分一下 Internet 和 Web 这两个时常容易被混淆的概念。 我们必须对你说:“Internet 不等于 Web !” Web 是 Internet 的一部分,虽然 Web 是 Internet 中最被人熟知的那一部分服务。 如上图所见,我们可以看到,Internet 是由 Web 和其他服务(service)所组成。 Internet 表示“互联网”,又称网际网路,或音译因特网、英特网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。 这种将计算机网络互相联接在一起的方法可称作“网络互联”,在这基础上发展出覆盖全世界的全球性互联网络,称为互联网,就是互相连接在一起的网络结构。 除了 Web,Internet 还包含其他服务: 今天,人们有时候比较容易混淆 Internet 和 Web 的概念,是因为现在越来越多的 Internet 的服务(e-mail,FTP,newsgroups,等)都通过 Web 这个接口来呈现给用户,这些服务中的很多都已经整合到 Web 中。 举一些例子: 其他还有,就不一一列举了。 说了 Internet 和 Web 之间的区别,也介绍了一些常见的 Internet 服务。我们再来看一个很流行的概念:Cloud(“云”),相信你或多或少听说过“云计算”,“大数据”之类名词。 说到 Cloud 的定义,至今没有太统一的说法。各方解释都不太一样。 我们可以简单地把 Cloud 定义为:通过 Web 这个“接口”获取到一些 Internet 服务(service),或者把这些服务本身定义为“云”。 可以用下图来形象地表示: 上图中,用云朵来表示的那些各式各样的 service(服务),就是我们用户要通过 Web 这个接口来获取到的。这些服务有: 当然了,我们一般所说的云或云计算则更复杂,有几种类型。例如: 如果你有兴趣,可以进一步去了解。 下面我们来聊聊 Web 的历史吧,看看这么有意思的 Web 是如何诞生及发展的。 我们简单来介绍一下: 上图为美国当时全国范围的 ARPAnet。 那么谁发明了 Web 呢? Tim Berbers Lee(蒂姆·伯纳斯·李),就是下面这位大牛,看上去蛮和蔼的。他在 1991 年(也有说是 1989 年...)提出了 Web(World Wide Web 的缩写,或 WWW)。 这张照片其实摄于 1994 年的欧洲核子研究组织(CERN)。 在他之前,没有浏览器,没有 WWW,网络世界一片空白。如果当初为谋取个人利益,蒂姆将自己的 WWW 设想乃至后来的万维网申请知识产权和专利,如今的互联网世界是不可能发展得这么快的。 蒂姆假想说:“那样的话,世界上至少会有 16 种不同的 Web,有 CERN 网,有微软网,有苹果网,等等”。 1994 年,Tim Berners Lee 创立了著名的 W3C(World Wide Web Consortium 的缩写,表示“万维网联盟”)组织,因为他觉得 Web 发展迅猛,需要有一个类似基金会或委员会的机构来规范,以达成全球统一标准。 W3C 后来发明了一系列的语言和规范:HTML,CSS,XML 等。现在的 HTML5 也是他们规定的。 W3C 最重要的工作是发展 Web 规范(被称为 recommendations,表示“推荐”),这些规范描述了 Web 的通信协议(比如 HTML 和 XHTML)和其他的构建模块。 W3C 的官方网站是 http://www.w3.org 。 你如果想学各种技术(HTML,CSS,XML,Javascript,PHP,等等),可以去 W3C 学院: http://www.w3schools.com 。 对应中文网站是: http://www.w3school.com.cn 。 今天的课就到这里,一起加油吧! 下一课: Web探索之旅 | 第二部分第一课:客户端语言 热爱生活,喜欢游泳,略懂烹饪。 人生格言:「向着标杆直跑」

触发onblur后,查询数据库中其他信息显示在页面上 前端代码怎么写?用的webstorm

逻辑就是:给元素绑定onblur事件,事件函数作用就是请求一个查询接口。这个跟使用的编辑器没有关系;

webservice调用方式http和soap的区别,该如何处理

SOAP简单的理解,就是这样的一个开放协议SOAP=RPC+HTTP+XML:采用HTTP作为底层通讯协议;RPC作为一致性的调用途径,XML作为数据传送的格式,允许服务提供者和服务客户经过防火墙在INTERNET进行通讯交互。RPC的描叙可能不大准确,因为SOAP一开始构思就是要实现平台与环境的无关性和独立性,每一个通过网络的远程调用都可以通过SOAP封装起来,包括DCE(Distributed Computing Environment ) RPC CALLS,COM/DCOM CALLS, CORBA CALLS, JAVA CALLS,etc。SOAP 使用 HTTP 传送 XML,尽管HTTP 不是有效率的通讯协议,而且 XML 还需要额外的文件解析(parse),两者使得交易的速度大大低于其它方案。但是XML 是一个开放、健全、有语义的讯息机制,而 HTTP 是一个广泛又能避免许多关于防火墙的问题,从而使SOAP得到了广泛的应用。但是如果效率对你来说很重要,那么你应该多考虑其它的方式,而不要用 SOAP。为了更好的理解SOAP,HTTP,XML如何工作的,不妨先考虑一下COM/DCOM的运行机制,DCOM处理网络协议的低层次的细节问题,如PROXY/STUB间的通讯,生命周期的管理,对象的标识。在客户端与服务器端进行交互的时候,DCOM采用NDR(Network Data Representation)作为数据表示,它是低层次的与平台无关的数据表现形式。Web service一般就是用SOAP协议通过HTTP来调用它,其实他就是一个WSDL文档,客户都可以阅读WSDL文档来用这个Web service。客户根据WSDL描述文档,会生成一个SOAP请求消息。Web service都是放在Web服务器 (如IIS) 后面的,客户生成的SOAP请求会被嵌入在一个HTTP POST请求中,发送到Web服务器来。Web服务器再把这些请求转发给Web service请求处理器。请求处理器的作用在于,解析收到的SOAP请求,调用Web service,然后再生成相应的SOAP应答。Web服务器得到SOAP应答后,会再通过HTTP应答的方式把它送回到客户端。个人以为就把webservice当成是Http这种请求和响应方式就可以处理大部分问题了。webservice 的调用有3种方式1. httpget 2. httppost3. httpsoapsoap 的优点是 可以传递结构化的 数据,而前两种不行。btw, soap 最终也是使用 HTTP 传送 XMLHTTP就是邮局的协议,他们规定了你的信封要怎么写,要贴多少邮票等。。。。 SOAP就是你们之间交流的协议,负责把你所需要表达的意思写在信纸上,同时也负责让对方能够看得懂你的信。SOAP (Simple Object Access Protocol) 顾名思义,是一个严格定义的信息交换协议,用于在Web Service中把远程调用和返回封装成机器可读的格式化数据。事实上SOAP数据使用XML数据格式,定义了一整套复杂的标签,以描述调用的远程过程、参数、返回值和出错信息等等。而且随着需要的增长,又不得增加协议以支持安全性,这使SOAP变得异常庞大,背离了简单的初衷。另一方面,各个服务器都可以基于这个协议推出自己的API,即使它们提供的服务及其相似,定义的API也不尽相同,这又导致了WSDL的诞生。WSDL (Web Service Description Language) 也遵循XML格式,用来描述哪个服务器提供什么服务,怎样找到它,以及该服务使用怎样的接口规范,简言之,服务发现。现在,使用Web Service的过程变成,获得该服务的WSDL描述,根据WSDL构造一条格式化的SOAP请求发送给服务器,然后接收一条同样SOAP格式的应答,最后根据先前的WSDL解码数据。绝大多数情况下,请求和应答使用HTTP协议传输,那么发送请求就使用HTTP的POST方法。

web服务服务中的soap信息包括什么内容

Types:定义了消息交换中使用的数据类型。在 DemoWebServiceService.wsdl 中,您可以导入 DemoWebServiceService_schema1.xsd,而不需要在 WSDL 文件中定义数据类型。Message: 定义了所交换的消息。您有两个消息,“hello” 和 “helloResponse”。消息 hello 其中有一部分是 “parameters”。这个部分有一个元素 “tns:hello”。而消息 helloResponse 其中有一部分是 “parameters”,刚好与 hello 的一样。这个部分有一个元素 “tns:helloResponse”。这两个元素 hello 和 helloResponse 都定义在 DemoWebServiceService_schema1.xsd 中。您很快会下面看到它的内容。Port Type:支持终端的操作。一个操作会提供一个输入消息和一个输出消息。您有一个名为 “hello” 的操作,它由一个输入消息 “tns:hello” 和一个输出消息 “tns:helloResponse” 组成。这是一个请求-响应传输。一个 WSDL 为终端提供了 4 种不同的传输基本参数:one-wayrequest-responsesolicit-responsenotification在 one-way 传输中,一个终端只能接收消息。在 request-response 传输中,一个终端会先接收一个消息然后再发送一个相应的消息。在 solicit-response 传输中,一个终端会先发送一个消息然后再接收一个相应的消息。在 notification 传输中,一个终端只能发送消息。Binding:定义了由一种端口类型定义的操作和消息的协议细节和消息格式规范。您会为 style 属性提供一个 “document”。这个 style 属性包含 2 种不同类型的消息,rpc 和 document。如果是 rpc,消息会包含了一些参数和返回值。如果是 document ,消息则包含一些文档。transport 属性的值包含了 SOAP 的传输 URI。http://schemas.xmlsoap.org/soap/http 表示您将使用 SOAP 规范中的 HTTP 绑定。您要为 soapAction 属性中 SOAP 的 HTTP 绑定的 SOAPAction HTTP 头指定 URI。由于您使用了一个 SOAP 的 HTTP 绑定,因此必须指定 soapAction 属性的值。您可以为 soapAction 属性指定一个空字符串,即 ""。soap:body 元素指定了如何在 SOAP 消息主体元素内聚集消息各部分。而 use 属性则提供了两个不同的选项:literal 和 encoded。如果您使用 literal,这表示您使用一个使用元素或类型属性的具体的模式定义。如果您使用 encoded,那么您使用的是带有编码规则的抽象类型。Service:定义了一组相关的端口。Port:通过为一个绑定指定一个网络地址而定义一个通信终端。
 首页 上一页  2 3 4 5 6 7 8 9 10 11 12  下一页  尾页