-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
148 lines (79 loc) · 97.4 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>众里寻他千百度</title>
<link href="/atom.xml" rel="self"/>
<link href="http://pengdan.raven520.top/"/>
<updated>2019-10-01T09:02:18.646Z</updated>
<id>http://pengdan.raven520.top/</id>
<author>
<name>Raven</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>想点法子用Nginx做"坏事"</title>
<link href="http://pengdan.raven520.top/2019/09/23/%E6%83%B3%E7%82%B9%E6%B3%95%E5%AD%90%E7%94%A8Nginx%E2%80%9C%E5%81%9A%E7%82%B9%E5%9D%8F%E4%BA%8B%E2%80%9D/"/>
<id>http://pengdan.raven520.top/2019/09/23/想点法子用Nginx“做点坏事”/</id>
<published>2019-09-23T06:47:00.423Z</published>
<updated>2019-10-01T09:02:18.646Z</updated>
<content type="html"><</p><pre><code>这里要提醒一下,选择你自己操作系统对应的版本下载到本地即可。</code></pre></li><li><p>接着解压到桌面,你能找到的地方。</p><pre><code>eg: 我解压在E盘下</code></pre></li></ul><p><img src="//pengdan.raven520.top/2019/09/23/想点法子用Nginx“做点坏事”/1.png" alt></p><ul><li>接下来 ,进入 <code>/conf</code> ,找到 <code>nginx.conf</code> ,打开,编辑即可。</li><li>以下是我的配置文件。这里我提取了两个比较重要的配置部分出来。</li></ul><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">server {</span><br><span class="line"><span class="comment"><!-- 本地监听端口--></span></span><br><span class="line"> listen 808; </span><br><span class="line"> location / {</span><br><span class="line"> root html;</span><br><span class="line"> index index.html index.htm;</span><br><span class="line"> <span class="comment"><!-- 要代理的服务器地址--></span></span><br><span class="line"> proxy_pass http://219.231.36.51/;</span><br><span class="line"> proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line"> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line"> proxy_set_header Host $http_host;</span><br><span class="line"> charset utf-8;</span><br><span class="line"> <span class="comment"><!-- 替换 文本内容--></span></span><br><span class="line"> sub_filter 'charset=gb2312' 'charset=utf-8';</span><br><span class="line"> sub_filter '<span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"login_left"</span>></span>' '<span class="tag"><<span class="name">script</span>></span><span class="undefined">console.log("hello world!")</span><span class="tag"></<span class="name">script</span>></span><span class="tag"><<span class="name">h1</span> <span class="attr">style</span>=<span class="string">"color:red;font-size:20px; "</span>></span>还在为登录不上VPN而被别人把好课都抢走而烦恼吗?<span class="tag"></<span class="name">h1</span>></span><span class="tag"><<span class="name">h1</span> <span class="attr">style</span>=<span class="string">"color:red;font-size:20px; "</span>></span>那你现在可以不用担心了,因为有我。<span class="tag"></<span class="name">h1</span>></span><span class="tag"><<span class="name">h1</span> <span class="attr">style</span>=<span class="string">"color:red;font-size:20px; "</span>></span>欢迎访问Raven为您提供的密道成绩系统,无需VPN,即可查成绩,选公选课。提供有体育在线测试考试一键满分(学期末考试周开放)。请收藏此站点!<span class="tag"></<span class="name">h1</span>></span><span class="tag"><<span class="name">h1</span> <span class="attr">style</span>=<span class="string">"color:red;font-size:20px; "</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://raven520.top"</span>></span>前去我的主页<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">h1</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"login_left"</span>></span>'; </span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--缓存相关的配置--></span></span><br><span class="line"></span><br><span class="line"> location ~ .*\.(gif|jpg|png|css|js|default2.aspx)(.*) {</span><br><span class="line"> proxy_pass http://219.231.36.52/;</span><br><span class="line"> proxy_redirect off;</span><br><span class="line"> proxy_cache cache_one;</span><br><span class="line"> proxy_cache_valid 200 302 24h;</span><br><span class="line"> proxy_cache_valid 301 30d;</span><br><span class="line"> proxy_cache_valid any 5m;</span><br><span class="line"> expires 90d;</span><br><span class="line"> proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line"> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line"> proxy_set_header Host $http_host;</span><br><span class="line"> charset utf-8;</span><br><span class="line"> # add_header wall "it is from cache!!!!!";</span><br><span class="line"> #sub_filter 'charset=gb2312' 'charset=utf-8';</span><br><span class="line"></span><br><span class="line"> sub_filter '<div class="login_left">' '<script>console.log("hello ~ world")</script><<h1 style="color:red;font-size:20px; ">还在为登录不上VPN而被别人把好课都抢走而烦恼吗?</h1><h1 style="color:red;font-size:20px; ">那你现在可以不用担心了,因为有我。</h1><h1 style="color:red;font-size:20px; ">欢迎访问Raven为您提供的密道成绩系统,无需VPN,即可查成绩,选公选课。提供有体育在线测试考试一键满分(学期末考试周开放)。请收藏此站点!</h1><h1 style="color:red;font-size:20px; "><a href="http://raven520.top">前去我的主页</a></h1><div class="login_left">'; </span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><ul><li><p>配置完成了以后,启动Nginx, 可以进入nginx主目录,控制台 输入 start nginx。就可以启动nginx了。</p></li><li><p>接下来,启动一个 内网穿透,帮助我们把我们的 主机映射出去。这里 我推荐 使用花生壳,Natapp…当然你也可以自己利用frp 自己搭建穿透的服务器。这里我不再强调如何搭建 内网穿透的服务器,而是 怎么 镜像代理别人的网站做一个简单的总结 。</p></li><li><p>那么,接下来,我就用 花生壳,做一个简单的展示吧。</p></li></ul><p><img src="//pengdan.raven520.top/2019/09/23/想点法子用Nginx“做点坏事”/2.png" alt></p><ul><li><p>配置好主机地址以及 要映射的端口。这里 我们是需要把 Nginx 反向代理的 接口暴露出去,即就是Nginx监听的端口 808。配置好,点击保存,然后打开花生壳送给我们注册的域名,就可以看到我们映射出去的资源了。</p></li><li><p>如下图 。可以看到url是花生壳给我分配的二级域名(我们也可以绑定我们自己的域名,这里不做过多的说明)。而呈现的其中内容的一部分,也被我替换了。</p></li></ul><p><img src="//pengdan.raven520.top/2019/09/23/想点法子用Nginx“做点坏事”/3.png" alt></p><ul><li><p>可以看到原本网页根本没有这些内容:干干净净。</p><p><img src="//pengdan.raven520.top/2019/09/23/想点法子用Nginx“做点坏事”/4.png" alt></p><p>可是啊,同学,你以为这就结束了吗?我告诉你,并没有。因为,还有一个必杀技! 我们可以捕获到 通过我们 暴露连接 登录自己同学的 账号密码的信息(然并卵…,不过你可以登上他的教务系统看看他的照片啊哈哈哈。)。</p><p>日志文件配置如下:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">http {</span><br><span class="line"> log_format post_log '$remote_addr - $remote_user [$time_local] -- $request_body';</span><br><span class="line"> access_log logs/access.log post_log;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure></li></ul><ul><li><p>假设有人登录,那么,这时候进入 /logs目录,查看access.log文件,往下翻日志,就会看到下图的信息。图中打码部分是我的账号密码…</p><p><img src="//pengdan.raven520.top/2019/09/23/想点法子用Nginx“做点坏事”/5.png" alt></p><p>这里要注意的是,因为post提交表单,正方教务系统没有对表达的数据密码进行加密!(安全???????额,好像前端加密也没意义,但总比没有好吧。),所以我们只需要对参数进行url解码即可得到该用户的密码。</p></li></ul><ul><li>最后要总结的是,如果修改了配置文件,如何要Nginx重新加载配置文件呢?</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"># Nginx 重新加载配置文件</span><br><span class="line">nginx -s reload </span><br><span class="line"># 停止 Nginx 的工作。 </span><br><span class="line">nginx -s stop</span><br></pre></td></tr></table></figure><p> 所谓的镜像网站原理实现就是比如Nginx 这样的,别人为你提供了 反向代理的 服务。通过你请求他的服务器,然后他的服务器获取到你想要的信息,返回给你。这就是所谓的镜像技术。请求流量之间多了一层代理,而这个代理,用户自己根本看不到这个代理的过程,因为你不知道别人的服务器是向哪个地址发起数据请求的。故 这种代理模式就称之为 反向代理。</p><p> 而正向代理就很好理解了。就是这个过程是透明的,用户可以知道,如果用过 本地代理的都清楚,就是浏览器向 用户本地的某个 应用发起请求,这个 应用再向目标地址发起请求,这个过程就称之为正向代理,也就是说正向代理 是建立在 用户端上的,而反向代理是建立在服务端的。</p><!-- rebuild by neat -->]]></content>
<summary type="html">
<!-- build time:Thu Dec 19 2019 11:44:03 GMT+0800 (GMT+08:00) --><ul><li><p>前言:</p><p> 之前一直有个想法,就是如何把我们学校的VPN服务映射出去。因为我们每次查成绩的时候,还需要登陆VPN,真
</summary>
<category term="Nginx" scheme="http://pengdan.raven520.top/categories/Nginx/"/>
<category term="Nginx" scheme="http://pengdan.raven520.top/tags/Nginx/"/>
<category term="内网穿透" scheme="http://pengdan.raven520.top/tags/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/"/>
</entry>
<entry>
<title>springboot整合websocket</title>
<link href="http://pengdan.raven520.top/2019/09/23/springboot%E6%95%B4%E5%90%88websocket%E7%9A%84%E6%80%BB%E7%BB%93/"/>
<id>http://pengdan.raven520.top/2019/09/23/springboot整合websocket的总结/</id>
<published>2019-09-23T05:17:02.139Z</published>
<updated>2019-03-21T14:31:04.763Z</updated>
<content type="html"><![CDATA[<!-- build time:Thu Dec 19 2019 11:44:03 GMT+0800 (GMT+08:00) --><h2 id="springboot整合websocket的总结"><a href="#springboot整合websocket的总结" class="headerlink" title="springboot整合websocket的总结"></a>springboot整合websocket的总结</h2><font face="微软雅黑" color="#0099ff">今天总结一下以往使用的websocket的两种方式</font><p>|第一种:</p><ul><li><p>导入依赖</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"><span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web-services<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure></li></ul><p> 值得一提的是,导入 spring-boot-starter-web-services 之后,spring-boot-starter-web 这个场景启动器就可以不用加了,我们可以点开 spring-boot-starter-web-services 可以看到,spring-boot-starter-web-services 里面就有依赖spring-boot-starter-web ,所以无需重复添加</p><p><img src="//pengdan.raven520.top/2019/09/23/springboot整合websocket的总结/Users\Raven\Desktop\Snipaste_2019-03-10_19-08-41.jpg" alt></p><ul><li><p>新建一个配置类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.socket.server.standard.ServerEndpointExporter;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">WebSocketConfig</span> </span>{</span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> ServerEndpointExporter <span class="title">serverEndpointExporter</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> ServerEndpointExporter();</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>新建一个配置websocket的类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.websocket;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.concurrent.CopyOnWriteArraySet;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">import</span> javax.websocket.OnClose;</span><br><span class="line"><span class="keyword">import</span> javax.websocket.OnError;</span><br><span class="line"><span class="keyword">import</span> javax.websocket.OnMessage;</span><br><span class="line"><span class="keyword">import</span> javax.websocket.OnOpen;</span><br><span class="line"><span class="keyword">import</span> javax.websocket.Session;</span><br><span class="line"><span class="keyword">import</span> javax.websocket.server.ServerEndpoint;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.slf4j.Logger;</span><br><span class="line"><span class="keyword">import</span> org.slf4j.LoggerFactory;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"><span class="meta">@Slf</span>4j</span><br><span class="line"><span class="meta">@ServerEndpoint</span>(value = <span class="string">"/websocket"</span>)</span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">WebSocketServer</span> </span>{</span><br><span class="line"> <span class="comment">//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">int</span> onlineCount = <span class="number">0</span>;</span><br><span class="line"> <span class="comment">//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> CopyOnWriteArraySet<WebSocketServer> webSocketSet = <span class="keyword">new</span> CopyOnWriteArraySet<WebSocketServer>();</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//与某个客户端的连接会话,需要通过它来给客户端发送数据</span></span><br><span class="line"> <span class="keyword">private</span> Session session;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">static</span> Logger log = LoggerFactory.getLogger(WebSocketServer.class);</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 连接建立成功调用的方法*/</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">WebSocketServer</span><span class="params">()</span> </span>{</span><br><span class="line">System.out.println(<span class="string">"初始化!"</span>);</span><br><span class="line">}</span><br><span class="line"> <span class="meta">@OnOpen</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onOpen</span><span class="params">(Session session)</span> </span>{</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">this</span>.session = session;</span><br><span class="line"> webSocketSet.add(<span class="keyword">this</span>); <span class="comment">//加入set中</span></span><br><span class="line"> addOnlineCount(); <span class="comment">//在线数加1</span></span><br><span class="line"> log.info(<span class="string">"有新连接加入!当前在线人数为"</span> + getOnlineCount());</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> sendMessage(<span class="string">"连接成功"</span>);</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> log.error(<span class="string">"websocket IO异常"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 连接关闭调用的方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@OnClose</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClose</span><span class="params">()</span> </span>{</span><br><span class="line"> webSocketSet.remove(<span class="keyword">this</span>); <span class="comment">//从set中删除</span></span><br><span class="line"> subOnlineCount(); <span class="comment">//在线数减1</span></span><br><span class="line"> log.info(<span class="string">"有一连接关闭!当前在线人数为"</span> + getOnlineCount());</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 收到客户端消息后调用的方法</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> message 客户端发送过来的消息*/</span></span><br><span class="line"> <span class="meta">@OnMessage</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onMessage</span><span class="params">(String message, Session session)</span> </span>{</span><br><span class="line"> log.info(<span class="string">"来自客户端的消息:"</span> + message);</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//群发消息</span></span><br><span class="line"> <span class="keyword">for</span> (WebSocketServer item : webSocketSet) {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> item.sendMessage(message);</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> session</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> error</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@OnError</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onError</span><span class="params">(Session session, Throwable error)</span> </span>{</span><br><span class="line"> log.error(<span class="string">"发生错误"</span>);</span><br><span class="line"> error.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">sendMessage</span><span class="params">(String message)</span> <span class="keyword">throws</span> IOException </span>{</span><br><span class="line"> </span><br><span class="line"> session.getBasicRemote().sendText(message);</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 群发消息</span></span><br><span class="line"><span class="comment"> * */</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">sendInfo</span><span class="params">(String message)</span> <span class="keyword">throws</span> IOException </span>{</span><br><span class="line"> log.info(message);</span><br><span class="line"> <span class="keyword">for</span> (WebSocketServer item : webSocketSet) {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> item.sendMessage(message);</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">synchronized</span> <span class="keyword">int</span> <span class="title">getOnlineCount</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> onlineCount;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> <span class="title">addOnlineCount</span><span class="params">()</span> </span>{</span><br><span class="line"> WebSocketServer.onlineCount++;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> <span class="title">subOnlineCount</span><span class="params">()</span> </span>{</span><br><span class="line"> WebSocketServer.onlineCount--;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>新建一个html文本</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">xmlns</span>=<span class="string">"http://www.w3.org/1999/xhtml"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"Content-Type"</span> <span class="attr">content</span>=<span class="string">"text/html; charset=utf-8"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>WebSocket Echo Demo<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1"</span>/></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"js/jquery-1.12.3.min.js"</span>></span><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="undefined"></span></span><br><span class="line"><span class="undefined"> var ws = new WebSocket("ws://localhost:8080/websocket");</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="undefined"> ws.onopen = function (e) {</span></span><br><span class="line"><span class="undefined"> console.log('Connection to server opened');</span></span><br><span class="line"><span class="undefined"> }</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="undefined"> function sendMessage() {</span></span><br><span class="line"><span class="undefined"> ws.send($('#message').val());</span></span><br><span class="line"><span class="undefined"> }</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="undefined"> ws.onmessage = function (evt) { </span></span><br><span class="line"><span class="undefined"> var received_msg = evt.data;</span></span><br><span class="line"><span class="undefined"> alert(received_msg);</span></span><br><span class="line"><span class="undefined"> };</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="undefined"> ws.onclose = function(){ </span></span><br><span class="line"><span class="undefined"> // 关闭 websocket</span></span><br><span class="line"><span class="undefined"> alert("连接已关闭..."); </span></span><br><span class="line"><span class="undefined"> };</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="undefined">ws.onerror = function(err) { </span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="undefined">alert("Error: " + err); </span></span><br><span class="line"><span class="undefined">};</span></span><br><span class="line"><span class="undefined"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"> </span><br><span class="line"><span class="tag"><<span class="name">body</span> ></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"vertical-center"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"container"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span> <span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">form</span> <span class="attr">role</span>=<span class="string">"form"</span> <span class="attr">id</span>=<span class="string">"chat_form"</span> <span class="attr">onsubmit</span>=<span class="string">"sendMessage(); return false;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"form-group"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">class</span>=<span class="string">"form-control"</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">name</span>=<span class="string">"message"</span> <span class="attr">id</span>=<span class="string">"message"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">placeholder</span>=<span class="string">"Type text to echo in here"</span> <span class="attr">value</span>=<span class="string">""</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">button</span> <span class="attr">type</span>=<span class="string">"button"</span> <span class="attr">id</span>=<span class="string">"send"</span> <span class="attr">class</span>=<span class="string">"btn btn-primary"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">onclick</span>=<span class="string">"sendMessage();"</span>></span></span><br><span class="line"> Send!</span><br><span class="line"> <span class="tag"></<span class="name">button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">form</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure></li></ul><p>第二种:</p><p> 第二种相对来说麻烦一点,需要配置握手拦截器(HttpSessionHandshakeInterceptor) 以及实现一个WebSocketConfigurer。</p><ul><li><p>1.老规矩 引入websocket依赖(具体版本可以自己添加 不过springboot 默认会由一个版本)</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"><span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web-services<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure></li><li><p>2.配置一个Handle</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> springboot;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"><span class="keyword">import</span> java.util.Map.Entry;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.web.socket.CloseStatus; </span><br><span class="line"><span class="keyword">import</span> org.springframework.web.socket.TextMessage; </span><br><span class="line"><span class="keyword">import</span> org.springframework.web.socket.WebSocketHandler; </span><br><span class="line"><span class="keyword">import</span> org.springframework.web.socket.WebSocketMessage; </span><br><span class="line"><span class="keyword">import</span> org.springframework.web.socket.WebSocketSession; </span><br><span class="line"> </span><br><span class="line"><span class="comment">//extending either TextWebSocketHandler orBinaryWebSocketHandler </span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyHandler</span> <span class="keyword">implements</span> <span class="title">WebSocketHandler</span> </span>{ </span><br><span class="line"> </span><br><span class="line"> <span class="keyword">public</span> Map<WebSocketSession,String> map = <span class="keyword">new</span> HashMap<WebSocketSession,String >();</span><br><span class="line"><span class="comment">//连接关闭后</span></span><br><span class="line"> <span class="meta">@Override</span> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">afterConnectionClosed</span><span class="params">(WebSocketSession arg0, CloseStatus arg1)</span> <span class="keyword">throws</span> Exception </span>{ </span><br><span class="line"> <span class="comment">// TODO Auto-generated method stub </span></span><br><span class="line"> </span><br><span class="line"> System.out.println(<span class="string">"Connection closed..."</span>+arg0.getRemoteAddress().toString()); </span><br><span class="line"> map.remove(arg0);</span><br><span class="line"> } </span><br><span class="line"> <span class="comment">//连接建立后</span></span><br><span class="line"> <span class="meta">@Override</span> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">afterConnectionEstablished</span><span class="params">(WebSocketSession arg0)</span> <span class="keyword">throws</span> Exception </span>{ </span><br><span class="line"> <span class="comment">// TODO Auto-generated method stub </span></span><br><span class="line"> System.out.println(<span class="string">"Connection established..."</span>+arg0.getRemoteAddress().toString());</span><br><span class="line"> </span><br><span class="line"> } </span><br><span class="line"> <span class="comment">//收到消息后</span></span><br><span class="line"> <span class="meta">@Override</span> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">handleMessage</span><span class="params">(WebSocketSession arg0, WebSocketMessage<?> arg1)</span> <span class="keyword">throws</span> Exception </span>{ </span><br><span class="line"> <span class="comment">// TODO Auto-generated method stub </span></span><br><span class="line"> <span class="keyword">try</span> { </span><br><span class="line"> <span class="keyword">if</span>(map.containsKey(arg0)) {</span><br><span class="line"> System.out.println(<span class="string">"Req: "</span>+arg1.getPayload()); </span><br><span class="line"> TextMessage returnMessage = <span class="keyword">new</span> TextMessage(map.get(arg0)+<span class="string">":"</span>+arg1.getPayload().toString()); </span><br><span class="line"> <span class="comment">//arg0.sendMessage(returnMessage); </span></span><br><span class="line"> SendAllUser(returnMessage);</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> </span><br><span class="line"> map.put(arg0,arg1.getPayload().toString());</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) { </span><br><span class="line"> e.printStackTrace(); </span><br><span class="line"> } </span><br><span class="line"> } </span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">SendAllUser</span><span class="params">(TextMessage returnMessage)</span> </span>{</span><br><span class="line"><span class="comment">// TODO Auto-generated method stub</span></span><br><span class="line"> <span class="keyword">if</span>(map.size()!=<span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">for</span> (Entry<WebSocketSession, String> entry : map.entrySet()) { </span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line">entry.getKey().sendMessage(returnMessage);</span><br><span class="line">} <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"><span class="comment">// TODO Auto-generated catch block</span></span><br><span class="line">e.printStackTrace();</span><br><span class="line">}</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"><span class="comment">//错误后(客户端强制断开)</span></span><br><span class="line"> <span class="meta">@Override</span> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">handleTransportError</span><span class="params">(WebSocketSession arg0, Throwable arg1)</span> <span class="keyword">throws</span> Exception </span>{ </span><br><span class="line"> <span class="comment">// TODO Auto-generated method stub </span></span><br><span class="line"> <span class="keyword">if</span>(arg0.isOpen()){ </span><br><span class="line"> arg0.close(); </span><br><span class="line"> } </span><br><span class="line"> map.remove(arg0);</span><br><span class="line"> System.out.println(arg1.toString()); </span><br><span class="line"> System.out.println(<span class="string">"WS connection error,close..."</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Override</span> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">supportsPartialMessages</span><span class="params">()</span> </span>{ </span><br><span class="line"> <span class="comment">// TODO Auto-generated method stub </span></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li><ol start="3"><li><p>配置一个握手拦截器(拦截请求)</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">package springboot;</span><br><span class="line"></span><br><span class="line">import java.util.Map; </span><br><span class="line"></span><br><span class="line">import org.springframework.http.server.ServerHttpRequest; </span><br><span class="line">import org.springframework.http.server.ServerHttpResponse; </span><br><span class="line">import org.springframework.web.socket.WebSocketHandler; </span><br><span class="line">import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; </span><br><span class="line"> </span><br><span class="line">/** </span><br><span class="line"> * </span><br><span class="line"> * 类描述:握手拦截器 </span><br><span class="line"> * com.watcher.websocket.spring MyHandshakeInterceptor </span><br><span class="line"> * Created by 78098 on 2016年11月15日. </span><br><span class="line"> * version 1.0 </span><br><span class="line"> */ </span><br><span class="line">public class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor{ </span><br><span class="line"> </span><br><span class="line"> @Override </span><br><span class="line"> public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) { </span><br><span class="line"></span><br><span class="line"> // TODO Auto-generated method stub </span><br><span class="line"> System.out.println("After handshake "+request.getRemoteAddress().toString()); </span><br><span class="line"> super.afterHandshake(request, response, wsHandler, ex); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> @Override </span><br><span class="line"> public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, Map<String, Object> map) throws Exception { </span><br><span class="line"> // TODO Auto-generated method stub </span><br><span class="line"> System.out.println("Before handshake "+request.getRemoteAddress().toString()); </span><br><span class="line"> return super.beforeHandshake(request, response, handler, map); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ol></li></ul></li><li><p>4.实现配置类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> springboot;</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean; </span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration; </span><br><span class="line"><span class="keyword">import</span> org.springframework.web.socket.config.annotation.EnableWebSocket; </span><br><span class="line"><span class="keyword">import</span> org.springframework.web.socket.config.annotation.WebSocketConfigurer; </span><br><span class="line"><span class="keyword">import</span> org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; </span><br><span class="line"> </span><br><span class="line"><span class="meta">@Configuration</span> <span class="comment">//配置类 </span></span><br><span class="line"><span class="meta">@EnableWebSocket</span> <span class="comment">//声明支持websocket </span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">WebSocketConfig</span> <span class="keyword">implements</span> <span class="title">WebSocketConfigurer</span></span>{ </span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Override</span> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">registerWebSocketHandlers</span><span class="params">(WebSocketHandlerRegistry registry)</span> </span>{ </span><br><span class="line"> </span><br><span class="line"> <span class="comment">//注册websocket实现类,指定参数访问地址;allowed-origins="*" 允许跨域 </span></span><br><span class="line"> registry.addHandler(myHandler(), <span class="string">"/ws"</span>).addInterceptors(myHandshake()).setAllowedOrigins(<span class="string">"*"</span>); </span><br><span class="line"> <span class="comment">//允许客户端使用SockJS </span></span><br><span class="line"> registry.addHandler(myHandler(), <span class="string">"/sockjs/ws"</span>).addInterceptors(myHandshake()).withSockJS(); </span><br><span class="line"> </span><br><span class="line"> <span class="comment">/* registry.addHandler(myHandler(), "/webSocket");</span></span><br><span class="line"><span class="comment"> registry.addHandler(myHandler(), "/webSocket/socketJs").withSockJS();*/</span></span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Bean</span> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> MyHandler <span class="title">myHandler</span><span class="params">()</span></span>{ </span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> MyHandler(); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Bean</span> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> MyHandshakeInterceptor <span class="title">myHandshake</span><span class="params">()</span></span>{ </span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> MyHandshakeInterceptor(); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">以上就是springboot使用websocket的两种方法,用了websocket感觉真的挺简单的,原来,我们有了springboot,世界如此简单。还有一种node.js也可以搭建websocket后台服务器,那个就更简单了。。有兴趣的可以试试。</span><br></pre></td></tr></table></figure></li></ul><!-- rebuild by neat -->]]></content>
<summary type="html">
<!-- build time:Thu Dec 19 2019 11:44:03 GMT+0800 (GMT+08:00) --><h2 id="springboot整合websocket的总结"><a href="#springboot整合websocket的总结" class
</summary>
<category term="websocket" scheme="http://pengdan.raven520.top/categories/websocket/"/>
<category term="springboot" scheme="http://pengdan.raven520.top/categories/websocket/springboot/"/>
<category term="websocket" scheme="http://pengdan.raven520.top/tags/websocket/"/>
<category term="springboot" scheme="http://pengdan.raven520.top/tags/springboot/"/>
</entry>
<entry>
<title>mybatis的总结(1)</title>
<link href="http://pengdan.raven520.top/2019/09/23/mybatis%E6%80%BB%E7%BB%93/"/>
<id>http://pengdan.raven520.top/2019/09/23/mybatis总结/</id>
<published>2019-09-23T05:17:02.137Z</published>
<updated>2019-03-22T10:58:26.005Z</updated>
<content type="html"><![CDATA[<!-- build time:Thu Dec 19 2019 11:44:03 GMT+0800 (GMT+08:00) --><h3 id="mybatis-config-xml-标签属性"><a href="#mybatis-config-xml-标签属性" class="headerlink" title="mybatis-config.xml 标签属性"></a>mybatis-config.xml 标签属性</h3><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">typeAliases</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">typeAlias</span> <span class="attr">type</span>=<span class="string">"com.raven.pojo.hello"</span> <span class="attr">alias</span>=<span class="string">"he"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">package</span> <span class="attr">name</span>=<span class="string">"com.ranve.bean"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">typeAliases</span>></span></span><br></pre></td></tr></table></figure><p><typealias>标签:为这个类起别名 ,不添加==<em>alias</em>==属性默认为 ==类名首字母小写== ,该值可以在==mapper.xml==文件的==resultType==属性种引用</typealias></p><p><package>标签:为这个包的所有类起别名,类名首字母小写,为了防止 这个包下的实体类和子包的实体类名冲突,那么可以再类名上 用注解 ==@Alias(“value”)==起别名</package></p><p><strong>注意:别名用的时候不区分大小写</strong></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">environments</span> <span class="attr">default</span>=<span class="string">"development"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">environment</span> <span class="attr">id</span>=<span class="string">"development"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">transactionManager</span> <span class="attr">type</span>=<span class="string">"JDBC"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">dataSource</span> <span class="attr">type</span>=<span class="string">"POOLED"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"driver"</span> <span class="attr">value</span>=<span class="string">"${jdbc.driver}"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"url"</span> <span class="attr">value</span>=<span class="string">"${jdbc.url}"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"username"</span> <span class="attr">value</span>=<span class="string">"${jdbc.username}"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"password"</span> <span class="attr">value</span>=<span class="string">"${jdbc.passwd}"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">dataSource</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">environment</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">environment</span> <span class="attr">id</span>=<span class="string">"test"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">transactionManager</span> <span class="attr">type</span>=<span class="string">"JDBC"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">dataSource</span> <span class="attr">type</span>=<span class="string">"POOLED"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"driver"</span> <span class="attr">value</span>=<span class="string">"${jdbc.driver}"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"url"</span> <span class="attr">value</span>=<span class="string">"${jdbc.url}"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"username"</span> <span class="attr">value</span>=<span class="string">"${jdbc.username}"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"password"</span> <span class="attr">value</span>=<span class="string">"${jdbc.passwd}"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">dataSource</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">environment</span>></span></span><br><span class="line"><span class="tag"></<span class="name">environments</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--</span></span><br><span class="line"><span class="comment">databaseIdProvider </span></span><br><span class="line"><span class="comment">得到数据库厂商的表示,mybaits可以识别 </span></span><br><span class="line"><span class="comment">在mapper.xml的属性 databaseId 种填写value的值即可</span></span><br><span class="line"><span class="comment">--></span></span><br><span class="line"><span class="tag"><<span class="name">databaseIdProvider</span> <span class="attr">type</span>=<span class="string">"DB_VENDOR"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"MySQL"</span> <span class="attr">value</span>=<span class="string">"mysql"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"Oracle"</span> <span class="attr">value</span>=<span class="string">"oracle"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"SQL Server"</span> <span class="attr">value</span>=<span class="string">"sqlserver"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">databaseIdProvider</span>></span></span><br></pre></td></tr></table></figure><ul><li>可以通过<environments>标签的==default==属性指定数据源</environments></li></ul><hr><h3 id="mapper标签详解:"><a href="#mapper标签详解:" class="headerlink" title="mapper标签详解:"></a>mapper标签详解:</h3><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?xml version="1.0" encoding="UTF-8"?></span></span><br><span class="line"><span class="meta"><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"></span></span><br><span class="line"><span class="tag"><<span class="name">mapper</span> <span class="attr">namespace</span>=<span class="string">"com.raven.dao.PayMapper"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">insert</span> <span class="attr">parameterType</span>=<span class="string">"com.raven.pay"</span> <span class="attr">id</span>=<span class="string">"insertPay"</span>></span></span><br><span class="line"> insert into t_pay(id,paytime,payname) values(0,#{paytime},#{payname})</span><br><span class="line"> <span class="tag"></<span class="name">insert</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">resultType</span>=<span class="string">"com.raven.pay"</span> <span class="attr">id</span>=<span class="string">"selectPay"</span>></span></span><br><span class="line"> select id,paytime,paytime from t_pay where id=#{id}</span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">update</span> <span class="attr">id</span>=<span class="string">"updatePay"</span>></span></span><br><span class="line"> updata t_pay set payname=#{payname},paytime=#{paytime}</span><br><span class="line"> <span class="tag"></<span class="name">update</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">delete</span> <span class="attr">id</span>=<span class="string">"deletePay"</span>></span></span><br><span class="line"> delete from t_pay whereid=#{id}</span><br><span class="line"> <span class="tag"></<span class="name">delete</span>></span></span><br><span class="line"><span class="tag"></<span class="name">mapper</span>></span></span><br></pre></td></tr></table></figure><ul><li>==parameterType==的意思是传来的参数类型,mybatis后面生成sql语句,会自动取出该对象的属性值到对应的#{}表达式中,==paramterType一般也可以省略不写==。</li><li>==resultType==的意思是返回的参数类型,就是查询出来mybatis会给你把查出来的参数封装成一个对象。</li><li>==id==属性又是什么意思呢?这个也是必须写的,你有没有想过一个问题,就是为什么我们只写一个接口mapper,再写一个mapper.xml文件,然后调用 sqlsession.getMapper(T class);就可以直接调用里面的方法呢?这个对象是谁实现的呢?mybatis为我们构造mapper代理对象的时候通过==namespace.id==实现了该接口的每个方法,它的原理就是这么来的。</li></ul><p>另外呢,对于<strong>mysql</strong>数据库而言,平时我们插入数据之后,有可能想获取自增后id的值,那么只需要再==insert==标签 使用如下两个属性即可</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">insert</span> <span class="attr">parameterType</span>=<span class="string">"com.raven.pay"</span> <span class="attr">id</span>=<span class="string">"insertPay"</span> <span class="attr">useGeneratedKeys</span>=<span class="string">"true"</span> <span class="attr">keyProperty</span>=<span class="string">"id"</span>></span></span><br><span class="line"> insert into t_pay(id,paytime,payname) values(0,#{paytime},#{payname})</span><br><span class="line"><span class="tag"></<span class="name">insert</span>></span></span><br></pre></td></tr></table></figure><ul><li>==useGeneratedKeys==表示自增主键获取主键值策略</li><li>==keyProperty==表示获取到主键值以后,将这个值封装给javaBean的那个属性值中。</li></ul><p>而对于 Oracle数据库而言就稍微麻烦一点了。如下:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">insert</span> <span class="attr">parameterType</span>=<span class="string">"com.raven.pay"</span> <span class="attr">id</span>=<span class="string">"insertPay"</span> <span class="attr">databaseId</span>=<span class="string">"oracle"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">selectKey</span> <span class="attr">keyProperty</span>=<span class="string">"id"</span> <span class="attr">order</span>=<span class="string">"BEFORE"</span> <span class="attr">resultType</span>=<span class="string">"Integer"</span>></span></span><br><span class="line"> select PAY_SEQ.nextval from dual</span><br><span class="line"> <span class="tag"></<span class="name">selectKey</span>></span></span><br><span class="line"> insert into t_pay(id,paytime,payname) values(#{id},#{paytime},#{payname})</span><br><span class="line"><span class="tag"></<span class="name">insert</span>></span></span><br></pre></td></tr></table></figure><ul><li>运行过程:先运行selectKey查出id,然后再封装给javabean的属性。</li><li>==注意:这里使用了databaseId属性,也就是说你需要再 mybatis-config.xml中配置该数据库的厂商信息<databaseidprovider>==</databaseidprovider></li></ul><h2 id="mybatis多个参数查询-注意事项"><a href="#mybatis多个参数查询-注意事项" class="headerlink" title="mybatis多个参数查询 注意事项"></a>mybatis多个参数查询 注意事项</h2><ul><li><p>多参数 查询 方法参数需注解 ==@Param==,不加的话,那么会抛出异常,如若不想加@Param,还有一种解决方案就是把sql语句的id=#{id }改成 id=#{param1},#{payname}改成 #{param2},因为mybatis底层默认是把参数封装到map里,所以我们可以用 #{param1}…..#{paramn}取参数,也可以把param换成arg ,即用#{arg0}取值。==如果该方法参数是个list类型,那么可以通过 #{list[0]}…#{list[n]}取到值==</p><ul><li>mapper</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">public Pay getPay(@Param("id")Stirng id,@Param("payname")String payname);</span><br></pre></td></tr></table></figure><ul><li><p>mapper.xml</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"getPay"</span> <span class="attr">resultType</span>=<span class="string">"com.raven.pojo.Pay"</span>></span></span><br><span class="line">select * from t_pay where id=#{id} and payname=#{payname}</span><br><span class="line"><span class="tag"></<span class="name">select</span>></span></span><br></pre></td></tr></table></figure><p>推荐做法1:直接传入==业务逻辑数据模型==,如下:(这样也可以直接取)</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> Pay <span class="title">getPay</span><span class="params">(Pay pay)</span></span>;</span><br></pre></td></tr></table></figure><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"getPay"</span> <span class="attr">resultType</span>=<span class="string">"com.raven.pojo.Pay"</span>></span></span><br><span class="line">select * from t_pay where id=#{id} and payname=#{payname}</span><br><span class="line"><span class="tag"></<span class="name">select</span>></span></span><br></pre></td></tr></table></figure><p>推荐做法2:如果没有对应的==pojo==,那么可以定义并给方法传入一个 Map类型的对象,把要传递的参数值都put进map对象,之后把也可以向推荐做法1那样直接取值。</p></li></ul></li></ul><h2 id="mybatis中-和-的区别?"><a href="#mybatis中-和-的区别?" class="headerlink" title="mybatis中 #{} 和${}的区别?"></a>mybatis中 #{} 和${}的区别?</h2><ul><li>#{} 是已预编译的形式,将参数设置到sql语句,PreparedStatement也可以防止sql注入。(安全 )</li><li>${} 是 把 参数的值 直接拼装到sql语句中,会有安全问题。</li></ul><h2 id="mybatis-如何返回-map类型,并且-指定-key-是自定义参数?"><a href="#mybatis-如何返回-map类型,并且-指定-key-是自定义参数?" class="headerlink" title="mybatis 如何返回 map类型,并且 指定 key 是自定义参数?"></a>mybatis 如何返回 map类型,并且 指定 key 是自定义参数?</h2><p> 使用@MapKey标注在方法上即可,value的值为 map 封装 key 的字段属性</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@MapKey</span>(<span class="string">"name"</span>)</span><br><span class="line"><span class="function"><span class="keyword">public</span> Map<String,Pay> <span class="title">getPayNameLike</span><span class="params">(String name)</span></span>;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><select id="getPay" resultType="map"></span><br><span class="line">select * from t_pay where name like #{name}</span><br><span class="line"></select></span><br></pre></td></tr></table></figure><h2 id="resultMap-标签详解"><a href="#resultMap-标签详解" class="headerlink" title="resultMap 标签详解"></a>resultMap 标签详解</h2><p>如下图示例:</p><p><img src="/1.jpg" alt></p><ul><li><p>我们使用了select标签的时候,查询某个pojo对象,这个对象的某个属性不是java的基本类型,而是一个对象,那么这个时候我们就可以使用到了 这个resutMap 属性,<code>注意:在<select>标签里,要么使用resultMap要么使用resultType,只能使用一个</code>,这个时候,我们就可以配置映射集了,即resultMap就是会我们封装对象的。看上图的<code><association></code>标签,</p><ul><li><p>其中的<code>property</code>属性代表了 当前==pojo对象的某个是对象的属性==,如我的值 是xsdcode,那么就是我这个实体类的xsdcode这个对象的这个属性是个对象。</p></li><li><p><code>column</code> 属性代表 这个属性对应的数据表字段。</p></li><li><p><code>select</code>属性代表 查询这个 属性对象的对应查询语句。即就是指向了它自己mapper文件的对应查询语句。</p><p> <img src="//pengdan.raven520.top/2019/09/23/mybatis总结/2.jpg" alt></p></li></ul></li></ul><!-- rebuild by neat -->]]></content>
<summary type="html">
<!-- build time:Thu Dec 19 2019 11:44:03 GMT+0800 (GMT+08:00) --><h3 id="mybatis-config-xml-标签属性"><a href="#mybatis-config-xml-标签属性" class="
</summary>
<category term="mybatis" scheme="http://pengdan.raven520.top/categories/mybatis/"/>
<category term="mybatis" scheme="http://pengdan.raven520.top/tags/mybatis/"/>
</entry>
<entry>
<title>Hello World</title>
<link href="http://pengdan.raven520.top/2019/09/23/hello-world/"/>
<id>http://pengdan.raven520.top/2019/09/23/hello-world/</id>
<published>2019-09-23T05:17:02.135Z</published>
<updated>2019-03-15T12:19:57.599Z</updated>
<content type="html"><![CDATA[<!-- build time:Thu Dec 19 2019 11:44:03 GMT+0800 (GMT+08:00) --><p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p><!-- rebuild by neat -->]]></content>
<summary type="html">
<!-- build time:Thu Dec 19 2019 11:44:03 GMT+0800 (GMT+08:00) --><p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hex
</summary>
</entry>
<entry>
<title>docker的初体验</title>
<link href="http://pengdan.raven520.top/2019/09/23/docker%E7%9A%84%E5%88%9D%E4%BD%93%E9%AA%8C/"/>
<id>http://pengdan.raven520.top/2019/09/23/docker的初体验/</id>
<published>2019-09-23T05:17:02.133Z</published>
<updated>2019-09-23T05:23:11.301Z</updated>
<content type="html"><![CDATA[<!-- build time:Thu Dec 19 2019 11:44:03 GMT+0800 (GMT+08:00) --><h2 id="docker的初体验"><a href="#docker的初体验" class="headerlink" title="docker的初体验"></a>docker的初体验</h2><p>早都听说过docker,但是一直却不知道它是什么?今天有时间就研究了一下怎么安装并使用<br>docker,特此记录一下。</p><ul><li>首先呢,我们需要安装自己的一款虚拟机,具体教程可以百度。</li><li>第二步,就是下载一款linux系统,这里我推荐使用centos。<a href="https://www.centos.org/download/" target="_blank" rel="noopener">下载链接</a></li><li>第三步,就是安装centos了,这些都不是最重要的,而且整个过程也很简单,就不一一记录了。</li><li><p>1.安装好了centos之后,使用命令先安装 vim编译器:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install vim*</span><br></pre></td></tr></table></figure><p>2.因为<strong>docker</strong> 要求 CentOS 系统的内核版本高于 3.10,所以先通过</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uname -r</span><br></pre></td></tr></table></figure><p>查看内核版本是否满足,如果小于3.10,那么使用以下命令更新内核。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum update</span><br></pre></td></tr></table></figure><ol start="3"><li><p>运行以下命令</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">#安装一些必要的系统工具:</span><br><span class="line">sudo yum install -y yum-utils device-mapper-persistent-data lvm2</span><br><span class="line"></span><br><span class="line">添加软件源信息:</span><br><span class="line">sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class="line"></span><br><span class="line">更新 yum 缓存:</span><br><span class="line">sudo yum makecache fast</span><br><span class="line"></span><br><span class="line">安装 Docker-ce:</span><br><span class="line">sudo yum -y install docker-ce</span><br><span class="line"></span><br><span class="line">运行docker</span><br><span class="line">sudo systemctl start docker</span><br></pre></td></tr></table></figure><p>想运行一个docker 的helloworld容器,但是却找不到。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo docker run hello-world</span><br></pre></td></tr></table></figure><p>这时候 进入 /etc/docker 目录,新建一个daemon.json文件(如果该文件存在,那么在后面追加内容即可)</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"># 新建文件</span><br><span class="line">touch daemon.json</span><br><span class="line"># 编辑文件</span><br><span class="line">vim /etc/docker</span><br><span class="line"></span><br><span class="line">#增加以下内容:</span><br><span class="line"> { "storage-driver": "devicemapper"}</span><br></pre></td></tr></table></figure></li></ol></li></ul><pre><code>保存退出vim编辑器,然后就可以运行 helloworld 啦~ </code></pre><ul><li><p>最后想给docker容器安装一下 mysql,却发现查找不到。。<br>解决方案:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"># 安装dig命令</span><br><span class="line">yum install bind-utils</span><br><span class="line"></span><br><span class="line">dig @114.114.114.114 registry-1.docker.io</span><br></pre></td></tr></table></figure><p>运行完可见下图:<img src="https://img-blog.csdnimg.cn/20190315185817551.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1aWppYWFhMQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>再上面随便选择一个ip,最后呢,再修改hosts文件,</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /etc </span><br><span class="line">vim hosts</span><br></pre></td></tr></table></figure><p>添加以下dns映射即可,之后退出vim。<img src="https://img-blog.csdnimg.cn/20190315190318947.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1aWppYWFhMQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">#重启 docker容器。</span><br><span class="line">sudo service docker restart</span><br><span class="line"></span><br><span class="line">#查找musql</span><br><span class="line">docker search mysql</span><br><span class="line"></span><br><span class="line">#安装msql</span><br><span class="line">docker pull mysql</span><br><span class="line"></span><br><span class="line">#进入容器</span><br><span class="line">docker exec -it mysql bash</span><br><span class="line">#登录mysql</span><br><span class="line">mysql -u root -p</span><br><span class="line">ALTER USER 'root'@'localhost' IDENTIFIED BY '你要设置的密码';</span><br><span class="line">#添加远程登录用户</span><br><span class="line">CREATE USER '你的昵称'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';</span><br><span class="line">GRANT ALL PRIVILEGES ON *.* TO '你的昵称'@'%';</span><br></pre></td></tr></table></figure><p>接着我们root用户使用Navicat连接容器的mysql,却报错<strong>Client does not support authentication protocol requested by server; consider upgrading MySQL</strong>,<br>于是:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';</span><br><span class="line">ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';</span><br><span class="line">SELECT plugin FROM mysql.user WHERE User = 'root';</span><br></pre></td></tr></table></figure><p>即可连接成功,最后想退出docker容器,注意不是关闭docker服务 ,<br>因为我们刚才进入mysql容器,所以不用的时候可以退出docker命令。<br>使用命令 exit 即可</p></li></ul><!-- rebuild by neat -->]]></content>
<summary type="html">
<!-- build time:Thu Dec 19 2019 11:44:03 GMT+0800 (GMT+08:00) --><h2 id="docker的初体验"><a href="#docker的初体验" class="headerlink" title="docker的
</summary>
<category term="docker" scheme="http://pengdan.raven520.top/categories/docker/"/>
<category term="linux" scheme="http://pengdan.raven520.top/tags/linux/"/>
<category term="docker" scheme="http://pengdan.raven520.top/tags/docker/"/>
</entry>
</feed>