expires相关知识
-
Expires和Cache-Control?Expires要求客户端和服务端的时钟严格同步。HTTP1.1引入Cache-Control来克服Expires头的限制。如果max-age和Expires同时出现,则max-age有更高的优先级。 Cache-Control: no-cache, private, max-age=0 ETag: abcde Expires: Thu, 15 Apr 2014 20:00:00 GMT Pragma: private Last-Modified: $now // RFC1123 format
-
cookie,seesionStorage,localStorage的理解cookie 设置cookie /** * 设置cookie * @param name cookie的名称 * @param value cookie的值 * @param day cookie的过期时间 */ var setCookie = function (name, value, day) { if(day !== 0){ //当设置的时间等于0时,不设置expires属性,cookie在浏览器关闭后删除 var expires = day * 24 * 60 * 60 * 1000; var date = new Date(+new Date()+expires); document.cookie = name + "=" + escape(value) + ";expires=" + date.toUT
-
nginx 缓存(11)获取全套nginx教程,请访问瓦力博客 介绍nginx是如何设置缓存之前,我们还是先聊聊web浏览器的缓存机制。 1.浏览器缓存 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的头信息进行识别的(如:Expires,Cache-control等)。 Expires Expires是HTTP/1.0控制网页缓存的字段,其值为服务器返回该请求结果缓存的到期时间,即再次发起该请求时,如果客户端的时间小于Expires的值时,直接使用缓存结果。 Expires是HTTP/1.0的字段,但是现在浏览器默认使用的是HTTP/1.1,那么
-
cookie保存用户登录记录js<!DOCTYPE html> <html> <head> <script> function setCookie(cname,cvalue,exdays) { var d=new Date(); d.setTime(d.getTime()+(exdays*24*60*60*1000)); //格林威治时间 (GMT) var expires="expires="+d.toGMTString(); document.cookies=cname+"="+cvalue+";"+expires; } function getCookie(cname) { //格式化 var name=cname+"="; //分割 var ca=document.cookie.split(";"); //遍历 for(var i=0;i<ca.length;i++){ var c=ca[i].trim(); //是否包含用户名
expires相关课程
expires相关教程
- 2.1 expires指令 Nginx 中的 expires 指令通过控制 HTTP 相应中的" Expires" 和 "Cache-Control"的头部值,达到控制浏览器缓存时间的效果。指令格式如下:Syntax: expires [modified] time;expires epoch | max | off;Default: expires off;Context: http, server, location, if in locationNginx 中的时间单位有s(秒), m(分), h(小), d(天)。指令参数说明:epoch: 指定"Expires"的值为1, 即 January,1970,00:00:01 GMT;max: 指定"Expires"的值为31 December2037 23:59:59GMT, "Cache-Control"的值为10年;-1:指定"Expires"的值为当前服务器时间-1s,即永远过期;off:不修改"Expires"和"Cache-Control"的值time中出现@表示具体的时间,比如@18h30m表示的是下午6点半;官方的示例如下:expires 24h; # 24小时过期expires modified +24h;expires @24h;expires 0; # 不缓存,立即过期expires -1; # 用不过期expires epoch;expires $expires;
- 4.1 expires 指令用法 首先准备 nginx.conf,中间简单配置几条 expires 指令用作测试:...http{ server { listen 8000; location / { default_type text/plain; expires 10m; #expires -1h; return 200 '8000, server\n'; } }}...下面观察请求结果:# 使用 expires 10m 配置,可以看到Expires值正好为10分钟后[shen@shen ~]$ curl http://180.76.152.113:8000 -IHTTP/1.1 200 OKServer: nginx/1.17.6Date: Thu, 06 Feb 2020 11:37:17 GMTContent-Type: text/plainContent-Length: 13Connection: keep-aliveExpires: Thu, 06 Feb 2020 11:47:17 GMTCache-Control: max-age=600# 使用 expires -1h 配置, -1h表示环境一个小时前过期了,所以返回Cache-Control的值为no-cache[shen@shen ~]$ curl http://180.76.152.113:8000 -IHTTP/1.1 200 OKServer: nginx/1.17.6Date: Thu, 06 Feb 2020 11:37:32 GMTContent-Type: text/plainContent-Length: 13Connection: keep-aliveExpires: Thu, 06 Feb 2020 10:37:32 GMTCache-Control: no-cache
- 17. Expires 告知客户端资源失效的日期,如果是缓存服务器会在 Expires 指定的时间到了才会额外发起请求。
- 3.1 Django 中 Cookie 操作相关源码 从前面的操作 Cookie 讲解中,我们只用到了和增和查两部分的方法,分别对应 HttpResponse 和 HttpRequest 两个类。接下来,我们去对应的源码中查找所涉及的和 Cookie 相关的代码。request.COOKIES['xxx']request.COOKIES.get('xxx', None)# 源码位置:django/core/handlers/wsgi.pyclass WSGIRequest(HttpRequest): # ... @cached_property def COOKIES(self): raw_cookie = get_str_from_wsgi(self.environ, 'HTTP_COOKIE', '') return parse_cookie(raw_cookie) # ...# 源码位置:django/http/cookie.pyfrom http import cookies# For backwards compatibility in Django 2.1.SimpleCookie = cookies.SimpleCookie# Add support for the SameSite attribute (obsolete when PY37 is unsupported).cookies.Morsel._reserved.setdefault('samesite', 'SameSite')def parse_cookie(cookie): """ Return a dictionary parsed from a `Cookie:` header string. """ cookiedict = {} for chunk in cookie.split(';'): if '=' in chunk: key, val = chunk.split('=', 1) else: # Assume an empty name per # https://bugzilla.mozilla.org/show_bug.cgi?id=169091 key, val = '', chunk key, val = key.strip(), val.strip() if key or val: # unquote using Python's algorithm. cookiedict[key] = cookies._unquote(val) return cookiedict上面的代码并不复杂,在 WSGIRequest 类中的 COOKIES 属性是先从客户端请求中取出 Cookie 信息,调用 get_str_from_wsgi() 方法是从 WSGI 中拿到对应的 Cookie 字符串。接下来用 parse_cookie() 方法将原始 Cookie 字符串中的 key=value 解析出来做成字典形式并返回。这就是为什么我们能像操作字典一样操作 request.COOKIES 的原因。下面的方法是实验1中调用的 get_signed_cookie() 的源码,也不复杂,同样是从self.COOKIES 中取出对应 key 的 value 值,然后使用对应的 salt 解密即可。# 源码位置:django/http/request.py class HttpRequest: # ... def get_signed_cookie(self, key, default=RAISE_ERROR, salt='', max_age=None): """ Attempt to return a signed cookie. If the signature fails or the cookie has expired, raise an exception, unless the `default` argument is provided, in which case return that value. """ try: cookie_value = self.COOKIES[key] except KeyError: if default is not RAISE_ERROR: return default else: raise try: value = signing.get_cookie_signer(salt=key + salt).unsign( cookie_value, max_age=max_age) except signing.BadSignature: if default is not RAISE_ERROR: return default else: raise return value # ...接下来是涉及到创建 Cookie 的方法,我们需要查找 HttpResponse 类或者相关的父类:# 源码位置:django/http/response.pyclass HttpResponseBase: # ... def set_cookie(self, key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None): """ Set a cookie. ``expires`` can be: - a string in the correct format, - a naive ``datetime.datetime`` object in UTC, - an aware ``datetime.datetime`` object in any time zone. If it is a ``datetime.datetime`` object then calculate ``max_age``. """ self.cookies[key] = value if expires is not None: if isinstance(expires, datetime.datetime): if timezone.is_aware(expires): expires = timezone.make_naive(expires, timezone.utc) delta = expires - expires.utcnow() # Add one second so the date matches exactly (a fraction of # time gets lost between converting to a timedelta and # then the date string). delta = delta + datetime.timedelta(seconds=1) # Just set max_age - the max_age logic will set expires. expires = None max_age = max(0, delta.days * 86400 + delta.seconds) else: self.cookies[key]['expires'] = expires else: self.cookies[key]['expires'] = '' if max_age is not None: self.cookies[key]['max-age'] = max_age # IE requires expires, so set it if hasn't been already. if not expires: self.cookies[key]['expires'] = http_date(time.time() + max_age) if path is not None: self.cookies[key]['path'] = path if domain is not None: self.cookies[key]['domain'] = domain if secure: self.cookies[key]['secure'] = True if httponly: self.cookies[key]['httponly'] = True if samesite: if samesite.lower() not in ('lax', 'strict'): raise ValueError('samesite must be "lax" or "strict".') self.cookies[key]['samesite'] = samesite def set_signed_cookie(self, key, value, salt='', **kwargs): value = signing.get_cookie_signer(salt=key + salt).sign(value) return self.set_cookie(key, value, **kwargs) def delete_cookie(self, key, path='/', domain=None): # Most browsers ignore the Set-Cookie header if the cookie name starts # with __Host- or __Secure- and the cookie doesn't use the secure flag. secure = key.startswith(('__Secure-', '__Host-')) self.set_cookie( key, max_age=0, path=path, domain=domain, secure=secure, expires='Thu, 01 Jan 1970 00:00:00 GMT', ) # ...从上面的代码可以看到,最核心的方法是 set_cookie(),而删除 cookie 和 设置加盐的 cookie 方法最后都是调用 set_cookie() 这个方法。而这个方法也比较简单,就是将对应的传递过来的参数值加到 self.cookies 这个字典中。最后我们思考下,难道就这样就完了吗?是不是还需要有一步是需要将 self.cookies 中的所有 key-value 值组成字符串,放到头部中,然后才返回给前端?事实上,肯定是有这一步的,代码如下。在用 “#” 号包围起来的那一段代码正是将 self.cookies 中的所有 key-value 值组成字符串形式,然后放到头部的 “Set-Cookie” 中,正是有了这一步的动作,我们前面设置的 self.cookie 内部的 key-value 值才能真正生效。# 源码位置:django/core/handlers/wsgi.pyclass WSGIHandler(base.BaseHandler): request_class = WSGIRequest def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.load_middleware() def __call__(self, environ, start_response): set_script_prefix(get_script_name(environ)) signals.request_started.send(sender=self.__class__, environ=environ) request = self.request_class(environ) response = self.get_response(request) response._handler_class = self.__class__ status = '%d %s' % (response.status_code, response.reason_phrase) ############################################################################## response_headers = [ *response.items(), *(('Set-Cookie', c.output(header='')) for c in response.cookies.values()), ] ############################################################################# start_response(status, response_headers) if getattr(response, 'file_to_stream', None) is not None and environ.get('wsgi.file_wrapper'): response = environ['wsgi.file_wrapper'](response.file_to_stream) return response
- 2.4 Trailer Trailer 是拖车的意思,正常的报文是 首部字段+回车符+请求体,Trailer 允许在请求体的后面再添加首部信息。Trailer 的值会先表明请求体后面的首部字段是什么。HTTP/1.1 200 OKTrailer: Expires--报文--Expires: May, 1 Sep 2020 23:59:59 GMT使用场景:首部字段的值是动态生成的,事先无法知道。如 content-length 请求体的长度,在分块传输中一开始无法确定内容的长度。还有一些可能是消息的数字签名,完整性校验等。
- 2.4 CGI 的 Cookies 您可以创建一个名为 cookie 的对象并存储文本消息,将信息发送到浏览器,调用 CGI.out 设置cookie头:#!/usr/bin/rubyrequire "cgi"cgi = CGI.new("html5")cookie = CGI::Cookie.new('name' => 'mycookie', 'value' => 'Zara Ali', 'expires' => Time.now + 3600)cgi.out('cookie' => cookie) do cgi.head + cgi.body { "Cookie stored" }end# ---- 输出结果 ----Content-Type: text/htmlContent-Length: 32Set-Cookie: mycookie=Zara+Ali; path=; expires=Sun, 30 Aug 2020 18:01:17 GMT<HEAD><BODY>Cookie stored</BODY>我们回到页面时可以通过下面的方式获取到 Cookies:#!/usr/bin/rubyrequire "cgi"cgi = CGI.new("html5")cookie = cgi.cookies['mycookie']cgi.out('cookie' => cookie) do cgi.head + cgi.body { cookie[0] }end
expires相关搜索
-
e preventdefault
e4a
each
each的用法
easter
easter day
easyui
easyui 官网
echarts
eclipse
eclipse 64位下载
eclipse android
eclipse tomcat
eclipse 教程
eclipse 快捷键
eclipseadt
eclipse安装教程
eclipse插件
eclipse插件下载
eclipse教程