游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

鉴权必须了解的5个兄弟cookiesessiontokenj

  本文你将看到:基于HTTP的前端鉴权背景cookie为什么是最方便的存储方案,有哪些操作cookie的方式session方案是如何实现的,存在哪些问题token方案是如何实现的,如何进行编码和防篡改?jwt是做什么的?refreshtoken的实现和意义session和token有什么异同和优缺点单点登录是什么?实现思路和在浏览器下的处理从状态说起
  HTTP无状态我们知道,HTTP是无状态的。也就是说,HTTP请求方和响应方间无法维护状态,都是一次性的,它不知道前后的请求都发生了什么。但有的场景下,我们需要维护状态。最典型的,一个用户登陆微博,发布、关注、评论,都应是在登录后的用户状态下的。标记那解决办法是什么呢?::标记::。
  在学校或公司,入学入职那一天起,会录入你的身份、账户信息,然后给你发个卡,今后在园区内,你的门禁、打卡、消费都只需要刷这张卡。
  前端存储这就涉及到一发、一存、一带,发好办,登陆接口直接返回给前端,存储就需要前端想办法了。
  前提是,你要把卡带在身上。
  前端的存储方式有很多。最矬的,挂到全局变量上,但这是个体验卡,一次刷新页面就没了高端点的,存到cookie、localStorage等里,这属于会员卡,无论怎么刷新,只要浏览器没清掉或者过期,就一直拿着这个状态。前端存储这里不展开了。有地方存了,请求的时候就可以拼到参数里带给接口了。基石:cookie
  可是前端好麻烦啊,又要自己存,又要想办法带出去,有没有不用操心的?
  有,cookie。cookie也是前端存储的一种,但相比于localStorage等其他方式,借助HTTP头、浏览器能力,cookie可以做到前端无感知。一般过程是这样的:在提供标记的接口,通过HTTP返回头的SetCookie字段,直接种到浏览器上浏览器发起请求时,会自动把cookie通过HTTP请求头的Cookie字段,带给接口
  配置:DomainPath
  你不能拿清华的校园卡进北大。
  cookie是要限制::空间范围::的,通过Domain(域)Path(路径)两级。
  Domain属性指定浏览器发出HTTP请求时,哪些域名要附带这个Cookie。如果没有指定该属性,浏览器会默认将其设为当前URL的一级域名,比如www。example。com会设为example。com,而且以后如果访问example。com的任何子域名,HTTP请求也会带上这个Cookie。如果服务器在SetCookie字段指定的域名,不属于当前域名,浏览器会拒绝这个Cookie。Path属性指定浏览器发出HTTP请求时,哪些路径要附带这个Cookie。只要浏览器发现,Path属性是HTTP请求路径的开头一部分,就会在头信息里面带上这个Cookie。比如,PATH属性是,那么请求docs路径也会包含该Cookie。当然,前提是域名必须一致。CookieJavaScript标准参考教程(alpha)
  配置:ExpiresMaxAge
  你毕业了卡就不好使了。
  cookie还可以限制::时间范围::,通过Expires、MaxAge中的一种。
  Expires属性指定一个具体的到期时间,到了指定时间以后,浏览器就不再保留这个Cookie。它的值是UTC格式。如果不设置该属性,或者设为null,Cookie只在当前会话(session)有效,浏览器窗口一旦关闭,当前Session结束,该Cookie就会被删除。另外,浏览器根据本地时间,决定Cookie是否过期,由于本地时间是不精确的,所以没有办法保证Cookie一定会在服务器指定的时间过期。MaxAge属性指定从现在开始Cookie存在的秒数,比如606024365(即一年)。过了这个时间以后,浏览器就不再保留这个Cookie。如果同时指定了Expires和MaxAge,那么MaxAge的值将优先生效。如果SetCookie字段没有指定Expires或MaxAge属性,那么这个Cookie就是SessionCookie,即它只在本次对话存在,一旦用户关闭浏览器,浏览器就不会再保留这个Cookie。CookieJavaScript标准参考教程(alpha)
  配置:SecureHttpOnly
  有的学校规定,不带卡套不让刷(什么奇葩学校,假设);有的学校不让自己给卡贴贴纸。
  cookie可以限制::使用方式::。
  Secure属性指定浏览器只有在加密协议HTTPS下,才能将这个Cookie发送到服务器。另一方面,如果当前协议是HTTP,浏览器会自动忽略服务器发来的Secure属性。该属性只是一个开关,不需要指定值。如果通信是HTTPS协议,该开关自动打开。HttpOnly属性指定该Cookie无法通过JavaScript脚本拿到,主要是Document。cookie属性、XMLHttpRequest对象和RequestAPI都拿不到该属性。这样就防止了该Cookie被脚本读到,只有浏览器发出HTTP请求时,才会带上该Cookie。CookieJavaScript标准参考教程(alpha)
  HTTP头对cookie的读写回过头来,HTTP是如何写入和传递cookie及其配置的呢?HTTP返回的一个SetCookie头用于向浏览器写入一条(且只能是一条)cookie,格式为cookie键值配置键值。例如:SetCookie:usernamejimu;domainjimu。com;pathblog;ExpiresWed,21Oct201507:28:00GMT;Secure;HttpOnly
  那我想一次多set几个cookie怎么办?多给几个SetCookie头(一次HTTP请求中允许重复)SetCookie:usernamejimu;domainjimu。comSetCookie:height180;domainme。jimu。comSetCookie:weight80;domainme。jimu。com
  HTTP请求的Cookie头用于浏览器把符合当前空间、时间、使用方式配置的所有cookie一并发给服务端。因为由浏览器做了筛选判断,就不需要归还配置内容了,只要发送键值就可以。Cookie:usernamejimu;height180;weight80
  前端对cookie的读写前端可以自己创建cookie,如果服务端创建的cookie没加HttpOnly,那恭喜你也可以修改他给的cookie。调用document。cookie可以创建、修改cookie,和HTTP一样,一次document。cookie能且只能操作一个cookie。document。cookieusernamejimu;domainjimu。com;pathblog;ExpiresWed,21Oct201507:28:00GMT;Secure;HttpOnly;
  调用document。cookie也可以读到cookie,也和HTTP一样,能读到所有的非HttpOnlycookie。console。log(document。cookie);usernamejimu;height180;weight80(就一个cookie属性,为什么读写行为不一样?getset了解下)cookie是维持HTTP请求状态的基石了解了cookie后,我们知道cookie是最便捷的维持HTTP请求状态的方式,大多数前端鉴权问题都是靠cookie解决的。当然也可以选用别的存储方式(后面也会多多少少提到)。那有了存储工具,接下来怎么做呢?应用方案:服务端session
  现在回想下,你刷卡的时候发生了什么?
  其实你的卡上只存了一个id(可能是你的学号),刷的时候物业系统去查你的信息、账户,再决定这个门你能不能进这个鸡腿去哪个账户扣钱。
  这种操作,在前后端鉴权系统中,叫session。典型的session登陆验证流程:
  浏览器登录发送账号密码,服务端查用户库,校验用户服务端把用户登录状态存为Session,生成一个sessionId通过登录接口返回,把sessionIdset到cookie上此后浏览器再请求业务接口,sessionId随cookie带上服务端查sessionId校验session成功后正常做业务处理,返回结果
  Session的存储方式显然,服务端只是给cookie一个sessionId,而session的具体内容(可能包含用户信息、session状态等),要自己存一下。存储的方式有几种:Redis(推荐):内存型数据库,redis中文官方网站。以keyvalue的形式存,正合sessionIdsessionData的场景;且访问快。内存:直接放到变量里。一旦服务重启就没了数据库:普通数据库。性能不高。
  Session的过期和销毁很简单,只要把存储的session数据销毁就可以。Session的分布式问题通常服务端是集群,而用户请求过来会走一次负载均衡,不一定打到哪台机器上。那一旦用户后续接口请求到的机器和他登录请求的机器不一致,或者登录请求的机器宕机了,session不就失效了吗?这个问题现在有几种解决方式。一是从存储角度,把session集中存储。如果我们用独立的Redis或普通数据库,就可以把session都存到一个库里。二是从分布角度,让相同IP的请求在负载均衡时都打到同一台机器上。以nginx为例,可以配置iphash来实现。
  但通常还是采用第一种方式,因为第二种相当于阉割了负载均衡,且仍没有解决用户请求的机器宕机的问题。node。js下的session处理前面的图很清楚了,服务端要实现对cookie和session的存取,实现起来要做的事还是很多的。在npm中,已经有封装好的中间件,比如expresssessionnpm,用法就不贴了。这是它种的cookie:
  expresssessionnpm主要实现了:封装了对cookie的读写操作,并提供配置项配置字段、加密方式、过期时间等。封装了对session的存取操作,并提供配置项配置session存储方式(内存redis)、存储规则等。给req提供了session属性,控制属性的setget并响应到cookie和session存取上,并给req。session提供了一些方法。应用方案:token
  session的维护给服务端造成很大困扰,我们必须找地方存放它,又要考虑分布式的问题,甚至要单独为了它启用一套Redis集群。有没有更好的办法?
  我又想到学校,在没有校园卡技术以前,我们都靠学生证。门卫小哥直接对照我和学生证上的脸,确认学生证有效期、年级等信息,就可以放行了。
  回过头来想想,一个登录场景,也不必往session存太多东西,那为什么不直接打包到cookie中呢?这样服务端不用存了,每次只要核验cookie带的证件有效性就可以了,也可以携带一些轻量的信息。这种方式通常被叫做token。
  token的流程是这样的:用户登录,服务端校验账号密码,获得用户信息把用户信息、token配置编码成token,通过cookieset到浏览器此后用户请求业务接口,通过cookie携带token接口校验token有效性,进行正常业务接口处理
  客户端token的存储方式在前面cookie说过,cookie并不是客户端存储凭证的唯一方式。token因为它的无状态性,有效期、使用限制都包在token内容里,对cookie的管理能力依赖较小,客户端存起来就显得更自由。但web应用的主流方式仍是放在cookie里,毕竟少操心。token的过期那我们如何控制token的有效期呢?很简单,把过期时间和数据一起塞进去,验证时判断就好。token的编码
  编码的方式丰俭由人。base64比如node端的cookiesessionnpm库
  不要纠结名字,其实是个token库,但保持了和expresssessionnpm高度一致的用法,把要存的数据挂在session上
  默认配置下,当我给他一个userid,他会存成这样:
  这里的eyJ1c2VyaWQiOiJhIn0,就是{userid:abb}的base64而已。防篡改
  那问题来了,如果用户cdd拿{userid:abb}转了个base64,再手动修改了自己的token为eyJ1c2VyaWQiOiJhIn0,是不是就能直接访问到abb的数据了?
  是的。所以看情况,如果token涉及到敏感权限,就要想办法避免token被篡改。解决方案就是给token加签名,来识别token是否被篡改过。例如在cookiesessionnpm库中,增加两项配置:secret:iAmSecret,signed:true,
  这样会多种一个。sigcookie,里面的值就是{userid:abb}和iAmSecret通过加密算法计算出来的,常见的比如HMACSHA256类(System。Security。Cryptography)MicrosoftDocs。
  好了,现在cdd虽然能伪造出eyJ1c2VyaWQiOiJhIn0,但伪造不出sig的内容,因为他不知道secret。JWT但上面的做法额外增加了cookie数量,数据本身也没有规范的格式,所以JSONWebTokenIntroductionjwt。io横空出世了。
  JSONWebToken(JWT)是一个开放标准,定义了一种传递JSON信息的方式。这些信息通过数字签名确保可信。
  它是一种成熟的token字符串生成方案,包含了我们前面提到的数据、签名。不如直接看一下一个JWTtoken长什么样:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。eyJ1c2VyaWQiOiJhIiwiaWF0IjoxNTUxOTUxOTk4fQ。2jf3kluKWRkwjOP6uQRJFqMlwSABcgqqcJofFH5XCo
  这串东西是怎么生成的呢?看图:
  类型、加密算法的选项,以及JWT标准数据字段,可以参考RFC7519JSONWebToken(JWT)node上同样有相关的库实现:expressjwtnpmkoajwtnpmrefreshtoken
  token,作为权限守护者,最重要的就是安全。业务接口用来鉴权的token,我们称之为accesstoken。越是权限敏感的业务,我们越希望accesstoken有效期足够短,以避免被盗用。但过短的有效期会造成accesstoken经常过期,过期后怎么办呢?一种办法是,让用户重新登录获取新token,显然不够友好,要知道有的accesstoken过期时间可能只有几分钟。另外一种办法是,再来一个token,一个专门生成accesstoken的token,我们称为refreshtoken。accesstoken用来访问业务接口,由于有效期足够短,盗用风险小,也可以使请求方式更宽松灵活refreshtoken用来获取accesstoken,有效期可以长一些,通过独立服务和严格的请求方式增加安全性;由于不常验证,也可以如前面的session一样处理
  有了refreshtoken后,几种情况的请求流程变成这样:
  如果refreshtoken也过期了,就只能重新登录了。session和token
  session和token都是边界很模糊的概念,就像前面说的,refreshtoken也可能以session的形式组织维护。狭义上,我们通常认为session是种在cookie上、数据存在服务端的认证方案,token是客户端存哪都行、数据存在token里的认证方案。对session和token的对比本质上是客户端存cookie存别地儿、服务端存数据不存数据的对比。客户端存cookie存别地儿存cookie固然方便不操心,但问题也很明显:在浏览器端,可以用cookie(实际上token就常用cookie),但出了浏览器端,没有cookie怎么办?cookie是浏览器在域下自动携带的,这就容易引发CSRF攻击(前端安全系列(二):如何防止CSRF攻击?美团技术团队)
  存别的地方,可以解决没有cookie的场景;通过参数等方式手动带,可以避免CSRF攻击。服务端存数据不存数据存数据:请求只需携带id,可以大幅缩短认证字符串长度,减小请求体积不存数据:不需要服务端整套的解决方案和分布式处理,降低硬件成本;避免查库带来的验证延迟单点登录
  前面我们已经知道了,在同域下的客户端服务端认证系统中,通过客户端携带凭证,维持一段时间内的登录状态。但当我们业务线越来越多,就会有更多业务系统分散到不同域名下,就需要一次登录,全线通用的能力,叫做单点登录。虚假的单点登录(主域名相同)
  简单的,如果业务系统都在同一主域名下,比如wenku。baidu。comtieba。baidu。com,就好办了。可以直接把cookiedomain设置为主域名baidu。com,百度也就是这么干的。
  真实的单点登录(主域名不同)
  比如滴滴这么潮的公司,同时拥有didichuxing。comxiaojukeji。comdidiglobal。com等域名,种cookie是完全绕不开的。这要能实现一次登录,全线通用,才是真正的单点登录。这种场景下,我们需要独立的认证服务,通常被称为SSO。一次从A系统引发登录,到B系统不用登录的完整流程
  用户进入A系统,没有登录凭证(ticket),A系统给他跳到SSOSSO没登录过,也就没有sso系统下没有凭证(注意这个和前面Aticket是两回事),输入账号密码登录SSO账号密码验证成功,通过接口返回做两件事:一是种下sso系统下凭证(记录用户在SSO登录状态);二是下发一个ticket客户端拿到ticket,保存起来,带着请求系统A接口系统A校验ticket,成功后正常处理业务请求此时用户第一次进入系统B,没有登录凭证(ticket),B系统给他跳到SSOSSO登录过,系统下有凭证,不用再次登录,只需要下发ticket客户端拿到ticket,保存起来,带着请求系统B接口
  完整版本:考虑浏览器的场景上面的过程看起来没问题,实际上很多APP等端上这样就够了。但在浏览器下不见得好用。看这里:
  对浏览器来说,SSO域下返回的数据要怎么存,才能在访问A的时候带上?浏览器对跨域有严格限制,cookie、localStorage等方式都是有域限制的。这就需要也只能由A提供A域下存储凭证的能力。一般我们是这么做的:
  图中我们通过颜色把浏览器当前所处的域名标记出来。注意图中灰底文字说明部分的变化。在SSO域下,SSO不是通过接口把ticket直接返回,而是通过一个带code的URL重定向到系统A的接口上,这个接口通常在A向SSO注册时约定浏览器被重定向到A域下,带着code访问了A的callback接口,callback接口通过code换取ticket这个code不同于ticket,code是一次性的,暴露在URL中,只为了传一下换ticket,换完就失效。callback接口拿到ticket后,在自己的域下setcookie成功在后续请求中,只需要把cookie中的ticket解析出来,去SSO验证就好访问B系统也是一样总结HTTP是无状态的,为了维持前后请求,需要前端存储标记cookie是一种完善的标记方式,通过HTTP头或js操作,有对应的安全策略,是大多数状态管理方案的基石session是一种状态管理方案,前端通过cookie存储id,后端存储数据,但后端要处理分布式问题token是另一种状态管理方案,相比于session不需要后端存储,数据全部存在前端,解放后端,释放灵活性token的编码技术,通常基于base64,或增加加密算法防篡改,jwt是一种成熟的编码方案在复杂系统中,token可通过servicetoken、refreshtoken的分权,同时满足安全性和用户体验session和token的对比就是用不用cookie和后端存不存的对比单点登录要求不同域下的系统一次登录,全线通用,通常由独立的SSO系统记录登录状态、下发ticket,各业务系统配合存储和认证ticket
  谢谢大家哦
  如果觉得这篇文章还不错,来个【分享、点赞、在看】三连吧,让更多的人也看到来源:HenryLulu几木
  链接:juejin。cnpost6898630134530752520

浓烟四起工业升级,海盗游戏ATLAS钢铁熔炉造出机械猛兽从历史的长河来看,谁先完成工业升级,就会在未来占据优势。英国率先完成了第一次工业革命,成为了近代以来第一个超级大国,第二次工业革命爆发后,德国和美国领先各国,让他们迅速崛起成为……牛黄中成药是怎么样的牛,了解一下这些药方牛黄,即牛的胆囊结石,少数为胆管或肝管的结石,其具有清心、祛痰、开窍、凉肝、息风、清热解毒等功效,用于热病神昏、中风痰迷、惊厥抽搐、癫痫发狂、咽喉肿痛、口舌生疮等症,是几千年来……国货之光还是吹牛?RedmiK60真机上手体验,友商难以招架RedmiK60系列发布会上,卢伟冰表示新机搭载华星光电2K屏幕,显示效果超越三星E5发光材料,成为真正的国货之光。这段话引发部分网友热议,怀疑国产屏幕打败三星只是吹牛,实际情……魅力南疆南疆风情独库小环线10日游天山以南,昆仑以北,那是一处古老而神秘的远方。冰川在戈壁的尽头,牛羊与骏马在路边奔跑,历史在这里停留;艺术在这里积淀;宗教在这里开花;不同的语言文字,民族风俗在这里交杂。……韩国的习俗每个国家都有着自己的礼仪和习俗,那我们如果到了韩国,肯定也要入乡随俗一下,韩国人珍爱白色。国花是木槿花,松树为国树,喜鹊为国鸟,老虎为国兽。忌讳数字4和13,等谐音寓意不好的数……101岁老人,把鸡蛋花当水喝,至今还独居生活,看她如何养生101岁老人,把鸡蛋花当水喝,至今还独居生活,看她如何养生原创2022071714:32新图视野每一位百岁老人,都有自己独特的生活习惯。有的百岁老人喜欢喝酒,有的百……独家9。9元包邮?淘宝首页将上线99特卖频道,主打性价比淘宝也要杀入低价市场了?4月3日,澎湃新闻独家获悉,淘宝已面向部分用户,在其app首页上线了99特卖频道。一张新版淘宝首页截图显示,99特卖频道与淘宝直播并列,在首页最显……女鬼桥开魂路可能是我今年玩过最好的国产恐怖游戏作者:小黑盒白金乌帕前言:米娜桑,今天给大家来一期新鲜出炉的恐怖新游《女鬼桥开魂路》,这个游戏相信大伙对其开发商都耳熟能详,那就是大宇资讯。这家公司也是经典游戏IP……早晨起床第一件事,不是喝水不是排便,而是按顺序做好这6件事早晨,是全新的一天的开始。每一个早晨都散发着生机与活力。因为人类经过一夜的睡眠,充足的休息之后,人体的各方面身体机能都得到了放松和休息。无论是大脑,器官,精神或者心灵,都……CPTMarkets市场分析轻忽风险币圈充满骗局!区块链之梦CPTMarkets市场分析:轻忽风险,币圈充满骗局!区块链之梦走向破灭?跌破眼镜,全球第二大加密货币交易所FTX宣布破产后,加密货币的投资价值再次搬上台面成为投资大众所……陈独秀与妻妹高君曼浪漫而悲凉的婚恋,三个子女命运坎坷高君曼陈独秀是上个世纪初响彻中国大地的风云人物。是他点燃了新文化运动的火种,成了中国第一次思想解放的先驱;是他高举爱国民主的大旗,成了轰轰烈烈五四运动的总司令;是他把马克……四川又火了!天府之地发现巨型铀矿,外媒中国缺啥来啥经过70年的发展,中国旧貌换新颜,在各个领域都取得了举世瞩目的成就,不管是在科教领域,还是在航天领域,中国都走在了世界的前列,中国的伟大成就堪称是人类史上的奇迹。不过在发……
大巴司机谈给中超球队开车能现场看球很开心,怀念主客场赛制直播吧7月6日讯近几年中超联赛一直以赛会制的方式举行,各队大巴车司机们驾驶着充满广州、天津、山东等独特地方元素的球队大巴车,穿梭在赛区城市,成为赛会制中超联赛之下独有的景象。《……NZONE50Pro上手评测NZONE又出新品了,小宇之前就曾上手过NZONE的产品,定位精准、个性鲜明,这次的新品NZONE50Pro小宇也有幸第一时间上手,无论是从外观设计、影像实力还是特色功能上又是……又爱又恨!国王成西部慈善家,湖人从中获利,8人大交易成型不得不说,今年的NBA分为两种门派。第一种就是勇士雄鹿这样志在夺冠的球队。还有一种就是像马刺那样送走当家球星奔着状元签去的。不过还有一支球队在最近也是想向着状元签靠一靠,那就是……拼多多跨境电商TEMU产品支付功能探索1、前言Temu是拼多多公司旗下的跨境电商产品,于2022年9月在美国市场上线,发展势头迅猛。在之前的文章中,我们为大家从总体上介绍了Temu的产品。对于跨境支付产……邱建良憾负秋元皓贵后,双方排名出现大变动坦克邱建良,是中国搏击的领军拳手。但是由于2019年的一次伤病,外加疫情的影响,导致邱建良近两年的时间没能返回搏击赛场。这段时间虽然邱建良在伤愈后仍旧坚持训练,但他的状态依旧受……大美冰丝带明起开门迎客北京冬奥会期间备受瞩目的冰丝带,将于7月9日正式对外开放,游客可通过国家速滑馆微信公众号预约购票。本报记者刘平摄明天,国家速滑馆将正式对外开放,这是冰丝带在北京冬奥会闭幕……健康与功能成儿童家具新重点,黑白调以黑科技博得家长青睐市场前景大好,健康与智能成为主流时代在不断发展,儿童家具市场也瞬息万变。据第七次人口普查显示,我国少儿人口比重有所回升。而二胎、三胎政策也相继落地,随着该项政策推进,少儿……小米急眼了!真香机这就发,友商危险了?关于红米被两家友商疯狂背刺的事情,相信大家还是抱着吃瓜的心态去看待的,毕竟厂商打得头破血流,可对于消费者却是十分友好的,咱们大家也不是跟钱包过不去,自然是哪个性价比高选哪个。……是被迫无奈还是为一己私利,韩国短道头牌林孝俊,为啥要入籍中国是被迫无奈还是为一己私利,韩国短道头牌林孝俊,为啥要入籍中国这位在介绍他名字时露出灿烂微笑的运动员正是林孝埈,这是发生在北京冬奥会中国短道速滑选拔赛上的一幕,作为刚刚入籍……面对焦虑最有效的七个方法?我们为什么会焦虑?我也常常会焦虑!焦虑和未来联手,打压现在的自己焦虑主要是以未来之心衡量现在之缺,想想的未来很美好,可是现在什么都没有,没有基础,甚至没有通往美好生……春季感冒频发,做到这三点很重要立春过后,标志着春天就正式到来了。春季也是各种呼吸道疾病高发的季节,最常见的就是感冒。感冒又称上呼吸道感染,是包括鼻、咽、喉部受到病原体感染,而导致的一系列症状的总称。感冒常见……肥西上派镇十四五规划和2035年远景目标纲要围绕中心主城、产业新城、现代美城、幸福名城发展定位,按照合肥未来城市建设新中心建设要求,结合全镇发展区位、资源禀赋等实际,提出未来五年空间布局,概括为一主三轴五片区格局:……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网