netty(二十一)http代理服务器(二)简书
用简书对上一篇实践
1 手动postman
1.1 no cookie
https://www.jianshu.com/bookmarks
<!DOCTYPE html> <!--[if IE 6]> <html class="ie lt-ie8"> <![endif]--> <!--[if IE 7]> <html class="ie lt-ie8"> <![endif]--> <!--[if IE 8]> <html class="ie ie8"> <![endif]--> <!--[if IE 9]> <html class="ie ie9"> <![endif]--> <!--[if !IE]> <!--> <html> <!-- <![endif]--> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no"> <!-- Start of Baidu Transcode --> <meta http-equiv="Cache-Control" content="no-siteapp" /> <meta http-equiv="Cache-Control" content="no-transform" /> <meta name="applicable-device" content="pc,mobile"> <meta name="MobileOptimized" content="width"/> <meta name="HandheldFriendly" content="true"/> <meta name="mobile-agent" content="format=html5;url=https://www.jianshu.com/sign_in"> <!-- End of Baidu Transcode --> <meta name="description" content="加入简书,开启你的创作之路,来这里接收世界的赞赏。"> <meta name="tencent-site-verification" content="39a5ed77a02c0103af6ac08addbc3851"/> <meta name="360-site-verification" content="604a14b53c6b871206001285921e81d8" /> <meta property="wb:webmaster" content="294ec9de89e7fadb" /> <meta property="qc:admins" content="104102651453316562112116375" /> <meta property="qc:admins" content="11635613706305617" /> <meta property="qc:admins" content="1163561616621163056375" /> <meta name="google-site-verification" content="6ARJIxhZLIgZT7J8MZkENr5mR0-CqshgzYyA3r3jBWU" /> <meta http-equiv="mobile-agent" content="format=html5; url=https://www.jianshu.com/sign_in"> <!-- Apple --> <meta name="apple-mobile-web-app-title" content="简书"> <title>登录 - 简书</title> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="76HHZrZ4xnnHdQfXxABUTm1HwfUbXXAhjGduHHuO5QtoPXAbJwt/5wwv4XdtZpjNkI7GDQ2UMmLIWl4IxFIo+Q==" /> <script data-ad-client="ca-pub-3077285224019295" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <link rel="stylesheet" media="all" href="//cdn2.jianshu.io/assets/web-30728a1164102859481d.css" /> <link rel="stylesheet" media="all" href="//cdn2.jianshu.io/assets/web/pages/common/signin/entry-725103a0668ccb1789d4.css" /> <link href="//cdn2.jianshu.io/assets/favicons/favicon-e743bfb1821442341c3ab15bdbe804f7ad97676bd07a770ccc9483473aa76f06.ico" rel="shortcut icon" type="image/x-icon"> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/57-a6f1f1ee62ace44f6dc2f6a08575abd3c3b163288881c78dd8d75247682a4b27.png" sizes="57x57" /> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/72-fb9834bcfce738fd7b9c5e31363e79443e09a81a8e931170b58bc815387c1562.png" sizes="72x72" /> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/76-49d88e539ff2489475d603994988d871219141ecaa0b1a7a9a1914f4fe3182d6.png" sizes="76x76" /> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/114-24252fe693524ed3a9d0905e49bff3cbd0228f25a320aa09053c2ebb4955de97.png" sizes="114x114" /> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/120-1bb7371f5e87f93ce780a5f1a05ff1b176828ee0d1d130e768575918a2e05834.png" sizes="120x120" /> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/152-bf209460fc1c17bfd3e2b84c8e758bc11ca3e570fd411c3bbd84149b97453b99.png" sizes="152x152" /> <!-- Start of 访问统计 --> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?0c0e9d9b1e7d617b3e6842e85b9fb068"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <!-- End of 访问统计 --> </head> <body class="no-padding reader-song-font" lang="zh-CN"> <div class="sign"> <div class="logo"> <a href="/"> <img src="//cdn2.jianshu.io/assets/web/logo-58fd04f6f0de908401aa561cda6a0688.png" alt="Logo" /> </a> </div> <div class="main"> <h4 class="title"> <div class="normal-title"> <a class="active" href="/sign_in">登录</a> <b>·</b> <a id="js-sign-up-btn" class="" href="/sign_up">注册</a> </div> </h4> <div class="js-sign-in-container"> <form id="new_session" action="/sessions" accept-charset="UTF-8" method="post"> <input name="utf8" type="hidden" value="✓" /> <input type="hidden" name="authenticity_token" value="BjmkEfW6uBsNd8Ik9dlRaY7cQyOno8rS8+B6LSdnPs2BpRNsZMkBhcYtJIRcv53qcxVE27FqiJG33Uo5mLvzPw==" /> <!-- 正常登录登录名输入框 --> <div class="input-prepend restyle js-normal"> <input placeholder="手机号或邮箱" type="text" name="session[email_or_mobile_number]" id="session_email_or_mobile_number" /> <i class="iconfont ic-user"></i> </div> <!-- 海外登录登录名输入框 --> <div class="input-prepend"> <input placeholder="密码" type="password" name="session[password]" id="session_password" /> <i class="iconfont ic-password"></i> </div> <input value="false" type="hidden" name="session[oversea]" id="session_oversea" /> <div> <input id="sign-in-form-captcha-challenge" name="captcha[validation][challenge]" autocomplete="off" type="hidden"> <input id="sign-in-form-captcha-gt" name="captcha[validation][gt]" autocomplete="off" type="hidden"> <input id="sign-in-form-captcha-validate" name="captcha[validation][validate]" autocomplete="off" type="hidden"> <input id="sign-in-form-captcha-seccode" name="captcha[validation][seccode]" autocomplete="off" type="hidden"> </div> <div class="remember-btn"> <input type="checkbox" value="true" checked="checked" name="session[remember_me]" id="session_remember_me" /> <span>记住我</span> </div> <div class="forget-btn"> <a class="" data-toggle="dropdown" href="">登录遇到问题?</a> <ul class="dropdown-menu"> <li> <a href="/users/password/mobile_reset">用手机号重置密码</a> </li> <li> <a href="/users/password/email_reset">用邮箱重置密码</a> </li> <li> <a target="_blank" href="/p/9058d0b8711d">无法用海外手机号登录</a> </li> <li> <a target="_blank" href="/p/498a9fa7da08">无法用 Google 帐号登录</a> </li> </ul> </div> <button class="sign-in-button" id="sign-in-form-submit-btn" type="button"> <span id="sign-in-loading"></span> 登录 </button> </form> <!-- 更多登录方式 --> <div class="more-sign"> <h6>社交帐号登录</h6> <ul> <li id="weibo-link-wrap" class="weibo-loading"> <a class="weibo" id="weibo-link"> <i class="iconfont ic-weibo"></i> </a> </li> <li> <a id="weixin" class="weixin" target="_blank" href="/users/auth/wechat"> <i class="iconfont ic-wechat"></i> </a> </li> <li> <a id="qq" class="qq" target="_blank" href="/users/auth/qq_connect"> <i class="iconfont ic-qq_connect"></i> </a> </li> </ul> <div class="weibo-geetest-captcha"></div> </div> </div> </div> </div> <!-- Javascripts ================================================== --> <!-- Placed at the end of the document so the pages load faster --> <script type="application/json" data-name="page-data">{"user_signed_in":false,"locale":"zh-CN","os":"other","read_mode":null,"read_font":null}</script> <script type="application/json" data-name="flash">{"flash":{"alert":"继续操作前请注册或者登录."}}</script> <script src="//cdn2.jianshu.io/assets/web-base-ee6697f7154e99f83d57.js" crossorigin="anonymous"></script> <script src="//cdn2.jianshu.io/assets/web-c1b7259e03b77cda4f05.js" crossorigin="anonymous"></script> <script src="//cdn2.jianshu.io/assets/web/pages/common/signin/entry-ea458a3a8ae693ca1b9d.js" crossorigin="anonymous"></script> </body> </html>
1.2 手动登录,取得chrome net,找到bookmark这个请求,找到request header,统统复制
1.3 将复制的cookie放到postman中,建一个http header(Cookie -- xxx)
<!DOCTYPE html> <!--[if IE 6]> <html class="ie lt-ie8"> <![endif]--> <!--[if IE 7]> <html class="ie lt-ie8"> <![endif]--> <!--[if IE 8]> <html class="ie ie8"> <![endif]--> <!--[if IE 9]> <html class="ie ie9"> <![endif]--> <!--[if !IE]> <!--> <html> <!-- <![endif]--> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no"> <!-- Start of Baidu Transcode --> <meta http-equiv="Cache-Control" content="no-siteapp" /> <meta http-equiv="Cache-Control" content="no-transform" /> <meta name="applicable-device" content="pc,mobile"> <meta name="MobileOptimized" content="width"/> <meta name="HandheldFriendly" content="true"/> <meta name="mobile-agent" content="format=html5;url=https://www.jianshu.com/bookmarks"> <!-- End of Baidu Transcode --> <meta name="tencent-site-verification" content="39a5ed77a02c0103af6ac08addbc3851"/> <meta name="360-site-verification" content="604a14b53c6b871206001285921e81d8" /> <meta property="wb:webmaster" content="294ec9de89e7fadb" /> <meta property="qc:admins" content="104102651453316562112116375" /> <meta property="qc:admins" content="11635613706305617" /> <meta property="qc:admins" content="1163561616621163056375" /> <meta name="google-site-verification" content="6ARJIxhZLIgZT7J8MZkENr5mR0-CqshgzYyA3r3jBWU" /> <meta http-equiv="mobile-agent" content="format=html5; url=https://www.jianshu.com/bookmarks"> <!-- Apple --> <meta name="apple-mobile-web-app-title" content="简书"> <title>收藏的文章 - 简书</title> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="xvd8wO2b8A/cVdnDPQfZgHXSHUaMjzgjjxF9B06Jc78983jHYF+AjrBH1QRlKteY/dJh/8e+qRDO0/nXaIfxeg==" /> <script data-ad-client="ca-pub-3077285224019295" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <link rel="stylesheet" media="all" href="//cdn2.jianshu.io/assets/web-30728a1164102859481d.css" /> <link rel="stylesheet" media="all" href="//cdn2.jianshu.io/assets/web/pages/bookmarks/index/entry-20df7f9043c483444f18.css" /> <link href="//cdn2.jianshu.io/assets/favicons/favicon-e743bfb1821442341c3ab15bdbe804f7ad97676bd07a770ccc9483473aa76f06.ico" rel="shortcut icon" type="image/x-icon"> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/57-a6f1f1ee62ace44f6dc2f6a08575abd3c3b163288881c78dd8d75247682a4b27.png" sizes="57x57" /> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/72-fb9834bcfce738fd7b9c5e31363e79443e09a81a8e931170b58bc815387c1562.png" sizes="72x72" /> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/76-49d88e539ff2489475d603994988d871219141ecaa0b1a7a9a1914f4fe3182d6.png" sizes="76x76" /> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/114-24252fe693524ed3a9d0905e49bff3cbd0228f25a320aa09053c2ebb4955de97.png" sizes="114x114" /> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/120-1bb7371f5e87f93ce780a5f1a05ff1b176828ee0d1d130e768575918a2e05834.png" sizes="120x120" /> <link rel="apple-touch-icon-precomposed" href="//cdn2.jianshu.io/assets/apple-touch-icons/152-bf209460fc1c17bfd3e2b84c8e758bc11ca3e570fd411c3bbd84149b97453b99.png" sizes="152x152" /> <!-- Start of 访问统计 --> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?0c0e9d9b1e7d617b3e6842e85b9fb068"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <!-- End of 访问统计 --> </head> <!-- 只给10%的用户添加代码 --> <!-- ###第四范式-智能推荐:代码直接复制 无需修改参数### --> <!-- ###功能:上报内容并反馈用户行为### --> <!-- --> <body lang="zh-CN" class="reader-song-font"> <!-- 全局顶部导航栏 --> <nav class="navbar navbar-default navbar-fixed-top" role="navigation"> <div class="width-limit"> <!-- 左上方 Logo --> <a class="logo" href="/"> <img src="//cdn2.jianshu.io/assets/web/nav-logo-4c7bbafe27adc892f3046e6978459bac.png" alt="Nav logo" /> </a> <!-- 右上角 --> <!-- 登录显示写文章 --> <a class="btn write-btn" target="_blank" href="/writer#/"> <i class="iconfont ic-write"></i>写文章 </a> <!-- 如果用户登录,显示下拉菜单 --> <div class="user"> <div data-hover="dropdown"> <a class="avatar" href="/u/ddcb81c0c4af"> <img src="https://cdn2.jianshu.io/assets/default_avatar/4-3397163ecdb3855a0a4139c34a695885.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/120/h/120" alt="120" /> </a> </div> <ul class="dropdown-menu"> <li> <a href="/u/ddcb81c0c4af"> <i class="iconfont ic-navigation-profile"></i> <span>我的主页</span> </a> </li> <li> <!-- TODO bookmarks_path --> <a href="/bookmarks"> <i class="iconfont ic-navigation-mark"></i> <span>收藏的文章</span> </a> </li> <li> <a href="/users/ddcb81c0c4af/liked_notes"> <i class="iconfont ic-navigation-like"></i> <span>喜欢的文章</span> </a> </li> <li> <a href="/my/paid_notes"> <i class="iconfont ic-paid"></i> <span>已购内容</span> </a> </li> <li> <a href="/wallet"> <i class="iconfont ic-navigation-wallet"></i> <span>我的钱包</span> </a> </li> <li> <a href="/settings"> <i class="iconfont ic-navigation-settings"></i> <span>设置</span> </a> </li> <li> <a href="/faqs"> <i class="iconfont ic-navigation-feedback"></i> <span>帮助与反馈</span> </a> </li> <li> <a rel="nofollow" data-method="delete" href="/sign_out"> <i class="iconfont ic-navigation-signout"></i> <span>退出</span> </a> </li> </ul> </div> <div id="navbar-jsds-enter"> </div> <div id="view-mode-ctrl"> </div> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#menu" aria-expanded="false"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> </div> <div class="collapse navbar-collapse" id="menu"> <ul class="nav navbar-nav"> <li class="tab "> <a href="/"> <span class="menu-text">发现</span> <i class="iconfont ic-navigation-discover menu-icon"></i> </a> </li> <li class="tab "> <a href="/subscriptions"> <span class="menu-text">关注</span> <i class="iconfont ic-navigation-follow menu-icon"></i> </a> </li> <li class="tab notification v-notification-dropdown-menu "> <a class="notification-btn" href="/notifications" data-hover="dropdown"> <span class="menu-text">消息</span> <i class="iconfont ic-navigation-notification menu-icon"></i> <span class="badge"></span> </a> </li> <li class="search"> <form target="_blank" action="/search" accept-charset="UTF-8" method="get"> <input name="utf8" type="hidden" value="✓" /> <input type="text" name="q" id="q" value="" autocomplete="off" placeholder="搜索" class="search-input" /> <a class="search-btn" href="javascript:void(null)"> <i class="iconfont ic-search"></i> </a> </form> </li> </ul> </div> </div> </div> </nav> <div class="container bookmarks" id="js-page-top"> <div class="row"> <div class="col-xs-18 col-xs-offset-3 main"> <img class="tag-banner" src="//cdn2.jianshu.io/assets/web/collect-note-955d8c71641a360924390da9da4b0151.png" alt="Collect note" /> <!-- 文章列表模块 --> <ul class="note-list"> <li id="note-60470886" data-note-id="60470886" class="have-img"> <a class="wrap-img" href="/p/a9e6e77456e2" target="_blank"> <img data-echo="https://upload-images.jianshu.io/upload_images/117091-b532272ae54c2e02.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/300/h/240" class="img-blur" src="https://upload-images.jianshu.io/upload_images/117091-b532272ae54c2e02.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/150/h/120" alt="120" /> </a> <div class="content"> <a class="title" target="_blank" href="/p/a9e6e77456e2">如果你计划长期写作,建议你重视这个问题</a> <p class="abstract"> 前些日子我的状态不太对劲,感觉没有什么动力,常常处于某程度的焦躁状态中。后来我反复追问内心(《太傻天书》中的“太傻”)接下来要怎么做,几次下来得... </p> <div class="meta"> <span class="jsd-meta"> <i class="iconfont ic-paid1"></i> 8.7 </span> <a class="nickname" target="_blank" href="/u/dc22650a4033">一鸣</a> <a target="_blank" href="/p/a9e6e77456e2#comments"> <i class="iconfont ic-list-comments"></i> 21 </a> <span> <i class="iconfont ic-list-like"></i> 104 </span> <span> <i class="iconfont ic-list-money"></i> 1 </span> </div> </div> </li> <li id="note-60465195" data-note-id="60465195" class=""> <div class="content"> <a class="title" target="_blank" href="/p/e4faa48d27a2">低情商的十个表现</a> <p class="abstract"> 1. 不懂得基本的社交礼仪 总是喜欢随意地麻烦别人,最经典而又普遍的案例就是:群发求赞、群发测试清理好友(这个行为不仅情商低,智商也低)、没有交... </p> <div class="meta"> <span class="jsd-meta"> <i class="iconfont ic-paid1"></i> 3.1 </span> <a class="nickname" target="_blank" href="/u/4302480a3e8e">水之心</a> <a target="_blank" href="/p/e4faa48d27a2#comments"> <i class="iconfont ic-list-comments"></i> 11 </a> <span> <i class="iconfont ic-list-like"></i> 54 </span> </div> </div> </li> <li id="note-58961798" data-note-id="58961798" class=""> <div class="content"> <a class="title" target="_blank" href="/p/bf216df8abac">“太快发生一段关系,意味着什么?”</a> <p class="abstract"> 问题一:2018年12月我和一个比我大了9岁的男人迅速确认了关系,是为了能尽快走出上一段三年的感情! 说实在真的很痛苦,如果说上一段感情是懵懂、... </p> <div class="meta"> <a class="nickname" target="_blank" href="/u/004747bece28">S小姐说</a> <a target="_blank" href="/p/bf216df8abac#comments"> <i class="iconfont ic-list-comments"></i> 84 </a> <span> <i class="iconfont ic-list-like"></i> 484 </span> </div> </div> </li> </ul> </div> </div> <div> <ul class="pagination"></ul> </div> <div data-vcomp="side-tool"></div> </div> <script type='application/json' data-name="bookmark_page_data"> {"page":1,"totalPages":1} </script> <script type="application/json" data-name="page-data">{"user_signed_in":true,"locale":"zh-CN","os":"other","read_mode":null,"read_font":null,"current_user":{"id":20852558,"nickname":"silyvin","slug":"ddcb81c0c4af","avatar":"https://cdn2.jianshu.io/assets/default_avatar/4-3397163ecdb3855a0a4139c34a695885.jpg","unread_counts":{"total":null},"is_member":false,"ads_free":false}}</script> <script src="//cdn2.jianshu.io/assets/babel-polyfill-d171e3dec4b6c15634dd.js" crossorigin="anonymous"></script> <script src="//cdn2.jianshu.io/assets/web-base-ee6697f7154e99f83d57.js" crossorigin="anonymous"></script> <script src="//cdn2.jianshu.io/assets/web-c1b7259e03b77cda4f05.js" crossorigin="anonymous"></script> <script src="//cdn2.jianshu.io/assets/web/pages/bookmarks/index/entry-965bf8f8666b84cc472b.js" crossorigin="anonymous"></script> </body> </html>
2 netty代理服务器+httpclient
2.1
org.apache.http.conn.HttpHostConnectException: Connect to localhost:443 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused (Connection refused)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:159)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at com.jds.test.httpproxy.httpclient.apache.HttpclientProxySender.send(HttpclientProxySender.java:83)
at com.jds.test.httpproxy.httpclient.ReqQueue$Customer.run(ReqQueue.java:42)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
2.2 client追加host header
ok
原2.5.4,忽略代理服务器http 客户端的HOST头设置,通过本次实践,认为有时不应忽略,将此句常驻代码;2021.2.3-而refeer与origin根据2.5.4的猜测,不常驻,下图显示该两个header为注释状态
3.4中,httpUriRequest.setHeader("Host", host);被注释,本次放开注释才能继续(如2.2种,追加一个http header Host)
HttpclientProxySender
4 netty client
4.1
Caused by: java.lang.NullPointerException
at io.netty.buffer.Unpooled.wrappedBuffer(Unpooled.java:154)
at com.jds.test.httpproxy.miniserver.BodyToResponseEncoder.encode(BodyToResponseEncoder.java:25)
FullHttpResponse response = new DefaultFullHttpResponse(
HttpVersion.HTTP_1_1,
HttpResponseStatus.valueOf(resHttp.getRet()),
Unpooled.wrappedBuffer(resHttp.getBody()));
很明显,对后端jianshu的服务器没有返回,然后返回前端的http报文编码报异常
回顾一下netty client机制:
代理使用nettyclient建立连接——阻塞连接直到close——将后端jianshu报文返回前端,encode——报错
难道是建立连接失败?果然是,而且没有监控connet回调从而没打印日志,这个地方显示了我对netty代码健壮度把握不够
尽管connet没直接抛出异常,但是连接的回调显示:
io.netty.channel.ConnectTimeoutException: connection timed out: www.jianshu.com/106.75.17.181:8080 at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:220) at io.netty.util.concurrent.PromiseTask$RunnableAdapter.call(PromiseTask.java:38) at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:120) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:357) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) at java.lang.Thread.run(Thread.java:745)
原来是端口没给对
4.2 改为80端口:
io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: 485454502f312e31203430302042616420526571756573740d0a5365727665723a2054656e67696e650d0a446174653a204d6f6e2c2031372046656220323032302031363a30303a323920474d540d0a436f6e74656e742d547970653a20746578742f68746d6c0d0a436f6e74656e742d4c656e6774683a203537370d0a436f6e6e656374696f6e3a20636c6f73650d0a0d0a3c21444f43545950452048544d4c205055424c494320222d2f2f494554462f2f4454442048544d4c20322e302f2f454e223e0d0a3c68746d6c3e0d0a3c686561643e3c7469746c653e3430302042616420526571756573743c2f7469746c653e3c2f686561643e0d0a3c626f6479206267636f6c6f723d227768697465223e0d0a3c68313e3430302042616420526571756573743c2f68313e0d0a3c703e596f75722062726f777365722073656e7420612072657175657374207468617420746869732073657276657220636f756c64206e6f7420756e6465727374616e642e20536f72727920666f722074686520696e636f6e76656e69656e63652e3c62722f3e0d0a506c65617365207265706f72742074686973206d65737361676520616e6420696e636c7564652074686520666f6c6c6f77696e6720696e666f726d6174696f6e20746f2075732e3c62722f3e0d0a5468616e6b20796f752076657279206d756368213c2f703e0d0a3c7461626c653e0d0a3c74723e0d0a3c74643e55524c3a3c2f74643e0d0a3c74643e687474703a2f2f3c2f74643e0d0a3c2f74723e0d0a3c74723e0d0a3c74643e5365727665723a3c2f74643e0d0a3c74643e7a75726963683c2f74643e0d0a3c2f74723e0d0a3c74723e0d0a3c74643e446174653a3c2f74643e0d0a3c74643e323032302f30322f31382030303a30303a32393c2f74643e0d0a3c2f74723e0d0a3c2f7461626c653e0d0a3c68722f3e506f77657265642062792054656e67696e653c2f626f64793e0d0a3c2f68746d6c3e0d0a
at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:971)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:327)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:230)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
at java.lang.Thread.run(Thread.java:745)
javax.net.ssl.SSLException: SSLEngine closed already
4.3 改为443端口 ok
同样,netty作为client时,Host也是需要的
5 有机会将netty proxy server改为java 原生server
6 2022.8.11 补充,之前就有的问题
strict-origin-when-cross-origin 好像是跨域所致