当前位置: 首页 > news >正文

福建高端网站建设个人公众号怎么制作教程

福建高端网站建设,个人公众号怎么制作教程,杭州seo外包,h5特效网站欣赏文章目录 一、HTTP协议1.认识URL2.urlencode和urldecode3.HTTP协议格式4.HTTP的方法5.HTTP的状态码6.HTTP常见Header7.重定向8.长连接9.会话保持10.基本工具 二、简单的HTTP服务器实现1.err.hpp2.log.hpp3.procotol.hpp4.Sock.hpp5.Util.hpp6.httpServer.hpp7.httpServer.cc8.总… 文章目录 一、HTTP协议1.认识URL2.urlencode和urldecode3.HTTP协议格式4.HTTP的方法5.HTTP的状态码6.HTTP常见Header7.重定向8.长连接9.会话保持10.基本工具 二、简单的HTTP服务器实现1.err.hpp2.log.hpp3.procotol.hpp4.Sock.hpp5.Util.hpp6.httpServer.hpp7.httpServer.cc8.总结分析 一、HTTP协议 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输议)就是其中之一。 1.认识URL 平时我们俗称的 “网址” 其实就是说的 URL 2.urlencode和urldecode 像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现. 比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义. 转义的规则如下: 将需要转码的字符转为16进制然后从右到左取4位(不足4位直接处理)每2位做一位前面加上%编成%XY格式 “” 被转义成了 “%2B” urldecode就是urlencode的逆过程; encode:对特殊符号和汉字编码为%XX decode:服务器(软件)收到url请求–自己对特殊%XX进行解码 urldecode工具 3.HTTP协议格式 HTTP请求 首行: [方法] [url] [版本] Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束 Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; HTTP响应 首行: [版本号] [状态码] [状态码解释] Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束 Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中 状态码有200,400,302,307,500,404等等 状态码描述404 - Not Found 200 - OK 1.请求和响应怎么保证应用层完整读取完毕了 a.首先读取完整的一行 b.while(读取完整的一行)-所有的请求行请求报头全部读完-直到空行 c.我们能保证把报头读完报头有一个属性Content-Length:XXX正文长度 d.解析出来内容长度再根据内容长度读取正文即可。 2.请求和响应是怎么做到序列化和反序列化的 http自己实现的第一行请求/响应报头只要按照\r\n将字符串1-n即可正文则不需要做 响应的正文可以是html/css/js/图片/视频/音频等 4.HTTP的方法 其中最常用的就是GET方法和POST方法. 5.HTTP的状态码 最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway) 6.HTTP常见Header Content-Type: 数据类型(text/html等) Content-Length: Body的长度 Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上; User-Agent: 声明用户的操作系统和浏览器版本信息; referer: 当前页面是从哪个页面跳转过来的; location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问; Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能; 7.重定向 我们使用手机或者浏览器的时候屏幕什么也没有点就跳转到了其他的页面比如自动跳转到广告商等这是通过重定向完成的。重定向分为临时重定向和永久重定向。 重定向过程客户端向服务器发送http请求服务器给客户端发送的http响应的状态码为3XX附带一个新的url然后客户端重新向新的服务器发起请求—临时重定向。假如一个公司的一个网站因为各种原因(比如同时访问数量受限等)所以重新写了一个网站但是客户不知道新的网站链接只知道老的链接所以公司对老的链接进行永久重定向客户在访问以前的网站的时候自动跳转到新的网站—永久重定向 8.长连接 其实我们看到的网页实际上可能由多种元素构成即一张完整的网页需要多次http请求 http网页中可能包含多个元素如果频繁的发起http请求http是基于TCP的TCP是面向连接的就会有频繁创建连接的问题(客户端和服务器都需要对连接进行管理先描述再组织会对连接创建对应的内核数据结构对连接的管理就变成了对数据结构的管理就会有时间和空间的成本) 所以就提出了长连接长连接需要client和server都要支持建立好一条连接获取一份资源的时候通过同一条连接来完成 Connection:Keep-alive --支持长连接 Connection:close --不支持长连接9.会话保持 我们使用网页的bilibili的时候我们登录一次之后后面的一段时间都不需要我们重新进行登录了关闭页面然后重新点进去也不需要重新登录这就是http的会话保持做到的 会话保持严格意义不是http天然具备的而是后面使用发现需要的 http协议是无状态的即http不关心上一次和下一次的请求只负责当前请求的传输但是用户需要因为用户查看新的网页是常规操作如果发送页面跳转那么新的页面也就无法识别是哪一个用户了为了让用户一经登录可以在整个网站按照自己的身份进行随意访问就需要会话保持。 我们看腾讯视频的时候对于需要会员的视频我们可以通过链接直接获取而不进行登录吗答案是不行的凡是对网页访问有权限要求的网页在被获取之前全部都要做判断进行身份认证。 会话保持有两种方法 第一种方案我们在浏览器进行登录输入信息之后浏览器会把我们用户输入的信息用户名密码保持起来这个被称为cookie数据。cookie分为cookie文件级数据和cookie内存级数据。往后只要访问同一个网站浏览器就会自动推送历史保留信息给服务器 我们登录的时候浏览器保存了cookie文件每次请求账号密码都要进行推送然后服务器再返回资源但是这里有个问题如果黑客在我们的电脑上种植了木马病毒获取了我们的cookie文件这样我们的账号密码就泄漏了那么黑客使用他的浏览器登录我们的账号此时服务器会误认为这个非法用户是你如果是QQ微信对我们就会造成很大的影响 第二种方案我们进行登录的时候输入用户名和密码此时服务器端会根据用户的信息形成一个session文件它有唯一的名称session id来进行唯一标识然后将当前用户的session id返回给用户此时浏览器的cookie文件中保存的是session id。此后用户发送http request 和session id给服务器服务器根据session id进行鉴权此时client保存了cookieserver保存了session。 如果黑客获取了用户的session此时服务器还是会误认为这个非法用户是你但是此时我们已经将矛盾转移了此时黑客盗取的是公司的私密数据有法律进行维护此外还配合了其他的策略来缓解该类问题比如我们在很短的时间内从一个地区到另一个地区QQ就会提醒我们异地登录需要重新进行登录等等 10.基本工具 这里介绍两个基本工具postman 和 fiddler postman不是抓包工具而是一个模拟客户端—浏览器的行为的工具 fiddler是一个抓包工具http工具 postman和fiddler的原理 浏览器将请求发送给fiddler此时fiddler可以作为代理服务器看待然后就fiddler将请求转发给服务器服务器响应的信息通过fiddler转发到用户的手中而postman则就是相当于客户端向服务器发起请求 我们对下文的程序进行抓包 我们可以看到我们的账号和密码都是明文的所以POST和GET都是不安全的只有是否私密的区别安全需要HTTPS来完成。 二、简单的HTTP服务器实现 1.err.hpp #pragma onceenum {USAGE_ERR 1,SOCKET_ERR,BIND_ERR,LISTEN_ERR };2.log.hpp #pragma once#include iostream #include string #include cstdarg #include ctime #include unistd.h#define DEBUG 0 #define NORMAL 1 #define WARNING 2 #define ERROR 3 #define FATAL 4#define LOG_NORMAL log.txt #define LOG_ERR log.error#define NUM 1024const char *to_levelstr(int level) {switch (level){case DEBUG:return DEBUG;case NORMAL:return NORMAL;case WARNING:return WARNING;case ERROR:return ERROR;case FATAL:return FATAL;default:return nullptr;} }void logMessage(int level, const char *format, ...) {char logprefix[NUM];snprintf(logprefix, sizeof(logprefix), [%s][%ld][pid: %d],to_levelstr(level), (long int)time(nullptr), getpid());char logcontent[NUM];va_list arg;va_start(arg, format);vsnprintf(logcontent, sizeof(logcontent), format, arg);std::cout logprefix logcontent std::endl;FILE *log fopen(LOG_NORMAL, a);FILE *error fopen(LOG_ERR, a);if (log error){FILE *cur nullptr;if (level DEBUG || level NORMAL || level WARNING)cur log;if (level ERROR || level FATAL)cur error;if (cur)fprintf(cur, %s%s\n, logprefix, logcontent);fclose(log);fclose(error);} } 3.procotol.hpp #pragma once#include iostream #include string #include sstream #include sys/types.h #include sys/stat.h #include unistd.h #include Util.hppconst std::string sep \r\n; const std::string default_root ./wwwroot; const std::string home_page index.html; const std::string html_404 wwwroot/404.html;class HttpRequest { public:HttpRequest() {}~HttpRequest() {}public:void parse(){// 1. 从inbuffer中拿到第一行分隔符\r\nstd::string line Util::getOneLine(inbuffer, sep);if (line.empty())return;// 2. 从请求行中提取三个字段// std::cout line: line std::endl;std::stringstream ss(line);ss method url httpversion;// 3. 添加web默认路径path default_root; // ./wwwroot,path url; //./wwwroot/a/b/c.html, ./wwwroot/if (path[path.size() - 1] /)path home_page;// 4.获取path对应资源的后缀// ./wwwroot.index.html// ./wwwroot.1.jpgauto pos path.rfind(.);if (pos std::string::npos)suffix .html;elsesuffix path.substr(pos);// 5.得到资源的大小struct stat st;int n stat(path.c_str(), st);if (n 0)size st.st_size;elsesize -1;}public:std::string inbuffer;std::string method;std::string url;std::string httpversion;std::string path;std::string suffix;int size; };class HttpResponse { public:std::string outbuffer; };4.Sock.hpp #pragma once#include iostream #include string #include cstdlib #include cstring #include unistd.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h#include log.hpp #include err.hppstatic const int backlog 5;class Sock { public:void Socket(){_listensock socket(AF_INET, SOCK_STREAM, 0);if (_listensock 0){logMessage(FATAL, create socket error);exit(SOCKET_ERR);}int opt 1;setsockopt(_listensock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, opt, sizeof opt);logMessage(NORMAL, create socket success);}void Bind(const uint16_t port){struct sockaddr_in local;memset(local, 0, sizeof local);local.sin_family AF_INET;local.sin_addr.s_addr INADDR_ANY;local.sin_port htons(port);int n bind(_listensock, (struct sockaddr *)local, sizeof local);if (n 0){logMessage(FATAL, bind socket error);exit(BIND_ERR);}logMessage(NORMAL, bind socket success);}void Listen(){int n listen(_listensock, backlog);if (n 0){logMessage(FATAL, listen socket error);exit(LISTEN_ERR);}logMessage(NORMAL, listen socket success);}int Accept(){struct sockaddr_in peer;socklen_t len sizeof(peer);int sock accept(_listensock, (struct sockaddr *)peer, len);return sock;}int Fd(){return _listensock;}void Close(){if (_listensock 0)close(_listensock);}private:int _listensock; }; 5.Util.hpp #pragma once#include string #include fstreamclass Util { public:static std::string getOneLine(std::string buffer, const std::string sep){auto pos buffer.find(sep);if (pos std::string::npos)return ;std::string sub buffer.substr(0, pos);buffer.erase(0, sub.size() sep.size());return sub;}static bool readFile(const std::string resource, char *buffer, int size){std::ifstream in(resource, std::ios::binary);if (!in.is_open())return false;in.read(buffer, size);in.close();return true;} }; 6.httpServer.hpp #pragma once #include functional #include sys/wait.h #include Sock.hpp #include protocol.hpp #include log.hpp #include err.hpp #include Util.hppnamespace server {static const int defaultport 8080;using func_t std::functionbool(const HttpRequest , HttpResponse );class httpServer{public:httpServer(const func_t func, const uint16_t port defaultport): _func(func), _port(port){}void initServer(){_sock.Socket();_sock.Bind(_port);_sock.Listen();}void handlerEvent(int sock){// 1. 读到完整的http请求// 2. 反序列化// 3. httprequst, httpresponse, _func(req, resp)// 4. resp序列化// 5. sendchar buffer[4096];HttpRequest req;HttpResponse resp;size_t n recv(sock, buffer, sizeof(buffer) - 1, 0);if (n 0){buffer[n] 0;req.inbuffer buffer;req.parse();_func(req, resp); // req - respsend(sock, resp.outbuffer.c_str(), resp.outbuffer.size(), 0);}}void start(){for (;;){int sock _sock.Accept();if (sock 0)continue;pid_t id fork();if (id 0){_sock.Close();if (fork() 0)exit(0);handlerEvent(sock);close(sock);exit(0);}close(sock);waitpid(id, nullptr, 0);}}~httpServer(){}private:Sock _sock;uint16_t _port;func_t _func;}; }7.httpServer.cc #include httpServer.hpp #include memoryusing namespace std; using namespace server;void Usage(std::string proc) {cerr Usage:\n\t proc port\r\n\r\n; }std::string suffixToDesc(const std::string suffix) {std::string ct Content-Type: ;if (suffix .html)ct text/html;else if (suffix .jpg)ct application/x-jpg;ct \r\n;return ct; }// 1. 服务器和网页分离html // 2. url - / : web根目录 bool Get(const HttpRequest req, HttpResponse resp) {// for testcout ----------------------http start--------------------------- endl;cout req.inbuffer;std::cout method: req.method std::endl;std::cout url: req.url std::endl;std::cout httpversion: req.httpversion std::endl;std::cout path: req.path std::endl;std::cout suffix: req.suffix std::endl;std::cout size: req.size 字节 std::endl;cout ----------------------http end--------------------------- endl;// std::string respline HTTP/1.1 200 OK\r\n;std::string respline HTTP/1.1 307 Permanent Redirect\r\n;std::string respheader suffixToDesc(req.suffix);respheader Location: https://www.qq.com/\r\n;std::string respblank \r\n;// std::string body html lang\en\headmeta charset\UTF-8\titlefor test/titleh1hello world/h1/headbodyp多情只有春庭月犹为离人照落花/p/body/html;std::string body;body.resize(req.size 1);if (!Util::readFile(req.path, (char *)body.c_str(), req.size)){Util::readFile(html_404, (char *)body.c_str(), req.size);}respheader Content-Length: ;respheader to_string(body.size());respheader \r\n;resp.outbuffer respline;resp.outbuffer respheader;resp.outbuffer respblank;cout ----------------------http response start--------------------------- endl;std::cout resp.outbuffer resp.outbuffer std::endl;cout ----------------------http response end--------------------------- endl;resp.outbuffer body;return true; }// ./httpServer port int main(int argc, char *argv[]) {// if(argc ! 2)// {// Usage(argv[0]);// exit(0);// }// uint16_t port atoi(argv[1]);// unique_ptrhttpServer httpsvr(new httpServer(Get, port));unique_ptrhttpServer httpsvr(new httpServer(Get));httpsvr-initServer();httpsvr-start();return 0; }8.总结分析 一个用户看到的网页结果可能是多个资源结合而成的所以要获取一个网页效果我们的浏览器一定会 发起多次http请求。 我们进行数据提交的时候本质前端要通过form表单提交的浏览器会自动将form表单中的内容转换成GET/POST方法请求 GET和POST的区别 如下是GET的方式 如下是POST的方式 二者的区别如下 GET通过URL传递参数具体http://ip:port/XXX/YYY?namevaluename1value1 POST提交参数通过http请求的正文提交参数 POST方法通过正文的提交参数所以一般用户看不到私密性更好私密性 ! 安全性GET方法不私密 无论是GET还是POST方法都不安全要谈安全必须加密 --https 通过URL传递参数注定了不能太大 但是POST方法通过正文正文可以很大甚至可以是其他的东西
http://www.w-s-a.com/news/348159/

相关文章:

  • 企业网站有哪些举几个例子wordpress ie兼容插件
  • 高端的深圳网站页面设计福清市建设局官方网站
  • 安装网站到服务器合肥建设干部学校网站
  • 影视网站如何做销售案例网站
  • 建设网站对比方案龙岗网站开发公司
  • 网站开发标准网站建设公司兴田德润可信赖
  • 如何建设一个公众号电影网站自动seo优化
  • 个人网站能备案吗酱香拿铁采取了哪些网络营销方式
  • 网站建设及推广好做吗自己做的网站加入购物车价格
  • 涡阳在北京做网站的名人注册一个免费的网站
  • 三门峡建设环境局网站公司注册网上核名通道
  • 叶县建设局网站要看网海外域名是多少
  • 网站运行环境配置Wordpress支付时效
  • logo设计网站知乎港北网站建设
  • 北京市保障性住房建设投资中心官方网站有限责任公司的特点
  • 做网站卖互联网营销怎么做
  • 晋州市建设局网站建站网站系统
  • 专业网站优化方案广东微信网站制作报价表
  • 北京网站建设公司分形科技简述营销网站建设策略
  • 汉中网站建设有限公司vue网站开发
  • 网站备案背景幕布阳江东莞网站建设
  • 北京网站建设要多少钱html网站标签
  • 做兼职做网站的是什么公司网站怎么修改
  • 舆情监控都有哪些内容西安seo网站公司
  • 网站有域名没备案天津网络营销
  • 哈巴狗模式网站开发电子商务平台建设与运营技术
  • 摄影网站源码wordpress内涵段子
  • 实验一 电子商务网站建设与维护图片做网站
  • 网站策划书模板大全中国建设部官方网站资格证查询
  • vps绑定多个网站创意咨询策划公司