您当前的位置:首页 > 互联网教程

后端如何返回blob对象

发布时间:2025-05-22 05:42:17    发布人:远客网络

后端如何返回blob对象

一、后端如何返回blob对象

1、使用jdk中的方法进行传输。在ResultSet中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob。

2、js没有所谓byte,只有一个ArrayBuffer,而且ArrayBuffer又不能通过http传递。要么你是用ajax的response直接获取blob对象的,要么你从服务器返回的是base64编码的字符串,js自己再decode然后转化成ArrayBuffer得到blob对象。

3、Blob对象的slice方法使用三个参数,均为可选参数,如果三个参数均省略时,相当于把一个Blob对象中的原始二进制数据原样复制到一个新建的Blob对象(即slice方法的返回值)中。

4、Blob对象的slice方法的第一个参数start的参数值为一个整数值,代表起始复制位置在Blob对象所代表的原始二进制数据中的位置,当start参数值为0时代表从该数据的起始位置(即第一个字节)开始复制数据;如果start参数值为负数值且Blob对象的size属性值+start参数值大于等于0。

5、则起始复制位置为Blob对象的size属性值+start参数值;如果start参数值为负数值且Blob对象的size属性值+start参数值小于0,则起始复制位置为Blob对象所代表的原始二进制数据的起始位置;如果start参数值为正数值且大于等于Blob对象的size属性值。

二、nodejs怎么设置cookie

通过node.js建立了一个完整的网站不是一件容易的事,这涉及读取页面模板,从数据库中抽出数据构建成新的页面返回给客户端。但光是这样还不行,我们还要设置首部,在chrome中如果CSS没有设置正确的Content-Type,会不起作用的。此处理还要考虑访问量,要设置缓存,缓存不单单是把东西从内存中读入读出就行,这样会撑爆电脑内存的,这用LRU算法(最近最少用的数据会清空出内存)。基于Cookie与数据库与URL重写,我们发展出一个session机制用于在多个action中通信。对于不同的请求交由不同的action来处理,就要发展出路由机制与MVC系统,等等。我信后写这些东西一点点写出来,揭示newland.js中遇到的种种问题与解决方案。如果什么都贪图方便,直接上框架,对我们语言学习是非常不利的。

本文正如标题所说,是操作Cookie。下面是一个完整的例子:

如果去掉其中几句,就是官方给出的例子,除了表明返回一个页面多简单外,一点用也没有。

我们通过http.createServer的回调来处理所有请求与响应,因此什么有用的东西都在它们上面。Cookie位于req对象的headers对象上,为一个字符串,通常为了方便我们将它们转换成一个对象。

写入一个Cookie其实就是在首部设置一个键值对,上面是简单方式,它实际上可以这样:

但真正使用时,我们的Cookie并非这样简单的的格式:

HttpOnly属性:这是微软对Cookie做的扩展。如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。

然后多刷几次页面,我们发现我们还能在控制台看到SSID=Ap4GTEq这个属性,但在前端我们看不到它(当然在firebug中能看到)。

Secure属性:当设置为true时,表示创建的 Cookie会被以安全的形式向服务器传输,也就是只能在 HTTPS连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP连接则不会传递该信息,所以不会被窃取到Cookie的具体内容。同上,在客户端我们也无法在document.Cookie找到被设置了Secure=true的Cookie键值对。Secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,HttpOnly属性的目的是防止程序获取Cookie后进行攻击。我们可以把Secure=true看成比HttpOnly更严格的访问控制。

path属性:指定可访问Cookie的目录。例如:"userId=320; path=/shop";就表示当前Cookie仅能在shop目录下使用。

domain属性:指定可访问Cookie的主机名.主机名是指同一个域下的不同主机,例如:www.google.com和gmail.google.com就是两个不同的主机名。默认情况下,一个主机中创建的Cookie在另一个主机下是不能被访问的,但可以通过domain参数来实现对其的控制,其语法格式为:"name=value; domain=CookieDomain";以google为例,要实现跨主机访问,可以写为:"name=value;domain=.google.com";这样,所有google.com下的主机都可以访问该Cookie。

Expires属性:指定过期时间,格式为"name=value;; expires=GMT_String";其中GMT_String是以GMT格式表示的时间字符串,超过这个时间,Cookie将消失,不可访问。例如:如果要将Cookie设置为10天后过期,可以这样实现:

Max-Age属性:个人感觉这个东西比Expires更好用,本来就是用于代替Expires,由于市面上的书你抄我,我抄你,都在抄旧知识,导致Expires还在使用。Max-Age的值可以为正数,表示此Cookie从创建到过期所能存在的时间,以秒为单位,此Cookie会存储到客户端电脑,以Cookie文件形式保存,不论关闭浏览器或关闭电脑,直到时间到才会过期。可以为负数,表示此Cookie只是存储在浏览器内存里,只要关闭浏览器,此Cookie就会消失。maxAge默认值为-1。还可以为0,表示从客户端电脑或浏览器内存中删除此Cookie。

Cookie面向的主要是服务器,localstorage面向的是页面端js。页面所需的业务数据可以放在localstorage里,但是认证相关的信息还是需要放在Cookie里的。

一、浏览器允许每个域名所包含的 Cookie数:

Microsoft指出 Internet Explorer 8增加 Cookie限制为每个域名 50个,但 IE7似乎也允许每个域名 50个 Cookie(《Update to Internet Explorer’s Cookie Jar》)。

Firefox每个域名 Cookie限制为 50个。

Opera每个域名 Cookie限制为 30个。

Safari/WebKit貌似没有 Cookie限制。但是如果 Cookie很多,则会使 header大小超过服务器的处理的限制,会导致错误发生。

二、当很多的 Cookie被设置,浏览器如何去响应。除 Safari(可以设置全部Cookie,不管数量多少),有两个方法:

最少最近使用(least recently used(LRU))的方法:当 Cookie已达到限额,自动踢除最老的 Cookie,以使给最新的 Cookie一些空间。 Internet Explorer和 Opera使用此方法。

Firefox很独特:虽然最后的设置的 Cookie始终保留,但似乎随机决定哪些 Cookie被保留。似乎没有任何计划(建议:在 Firefox中不要超过 Cookie限制)。

三、不同浏览器间 Cookie总大小也不同:

Firefox和 Safari允许 Cookie多达 4097个字节,包括名(name)、值(value)和等号。

Opera允许 Cookie多达 4096个字节,包括:名(name)、值(value)和等号。

Internet Explorer允许 Cookie多达 4095个字节,包括:名(name)、值(value)和等号。

注:多字节字符计算为两个字节。在所有浏览器中,任何 Cookie大小超过限制都被忽略,且永远不会被设置。

最后让我们看看newland.js是怎么处理cookie的。

newland.js有个重要的对象叫httpflow,其实就是我的操作流flow的子类,它劫持了所有清求与响应。当一个请求过来时,框架就会new一个httpflow去处理它们。它有个patch方法,用于为操作流添加一些有用属性与方法,而不像express.js那样直接在原生对象上改。实现express.js现在的做法有点像Prototype.js,加之node.js的版本现在还没有到1.0,因此API改动还很频繁的。express.js的行为无异走钢线。而把操作移到一个自定义对象就安全多了。

此外,httpflow还劫持res.writeHead,res.setHeader,目的为实现多次调用setCookie时而不相互覆盖。

此外操作流还有两个有用的方法来添加或移除Cookie。

实质上,经过上面的代码,我们就好方便多次添加或删除Cookie。个人认为用setHeader来操作(即使它已经被偷龙转凤还是不怎么好用),大家还是用addCookie, removeCookie来干吧。这些操作会在用户第一次调用当前的res.whireHead生效!

如果你想查看从客户端来的cookie,那么直接看flow.cookie好了,它会在途中调用一个get_cookie的服务,将原始的字符始形式转换为一个对象。