Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义:

  1. proxy_set_header Host $proxy_host;
  2. proxy_set_header Connection close;

如果启用缓存,来自之前请求的头字段“If-Modified-Since”, “If-Unmodified-Since”, “If-None-Match”, “If-Match”, “Range”, 和 “If-Range” 将不会被代理服务器传递。
一个不会变化的“Host”头请求字段可通过如下方式被传递:

  1. proxy_set_header Host $http_host;

然后,当字段不在请求头中就无法传递了,在这种情况下,可通过设置Host变量,将需传递值赋给Host变量

  1. proxy_set_header Host $host;

此外,服务器名称和端口一起通过代理服务器传递

  1. proxy_set_header Host $host:$proxy_port;

如果请求头的存在空的字段将不会通过代理服务器传递出去

  1. proxy_set_header Accept-Encoding "";

简而言之,proxy_set_header 就是可设置请求头-并将头信息传递到服务器端,不属于请求头的参数中也需要传递时,重定义下即可!

================================接下来看下测试案例=========================

  1. 1)如下测试,不设置 proxy_set_header
  2.  
  3. Nginx 配置:
  4. upstream test {
  5. server 192.168.1.123:9099;
  6. server 192.168.1.123:58080;
  7. }
  8. server {
  9. listen 5800;
  10. server_name 192.168.1.123;
  11. root /usr/share/nginx/html;
  12. include /etc/nginx/default.d/*.conf;
  13. location / {
  14. proxy_pass http://test;
  15. }
  16.  
  17. 测试jsp 想获取客户端IP、客户端port、代理服务器IP、代理服务器port
  18. <%@page contentType="text/html; charset=UTF-8" trimDirectiveWhitespaces="true"%>
  19. <%
  20. String scheme = request.getScheme();
  21. String serverName = request.getServerName();
  22. String remoteName = request.getRemoteAddr();
  23. String realIP = request.getHeader("X-Forwarded-For");
  24. String realIP2 = request.getHeader("X-Real-IP");
  25. String Host = request.getHeader("Host");
  26. int port = request.getServerPort();
  27. int portR = request.getRemotePort();
  28. String requestURIC1 = scheme+"://"+realIP+":"+portR;
  29. String requestURIC2 = scheme+"://"+realIP2+":"+portR;
  30. String requestURIC3 = scheme+"://"+remoteName+":"+portR;
  31. String requestURI = scheme+"://"+serverName+":"+port;
  32. %>
  33.  
  34. 其中:
  35. 客户端地址1:<%=requestURIC1 %>
  36. 客户端地址2:<%=requestURIC2 %>
  37. 客户端地址3:<%=requestURIC3%>
  38. 服务器地址1:<%=requestURI%>
  39. 服务器地址2:<%=Host%>
  40.  
  41. 测试结果
  42. 客户端地址1:http://null:58828
  43. 客户端地址2:http://null:58828
  44. 客户端地址3:http://192.168.1.123:58828
  45. 服务器地址1:http://test:80
  46. 服务器地址2:test
  47.  
  48. Nginx日志
  49. 192.168.1.177 -20508---5800 [25/Aug/2016:16:34:13 +0800] "GET /docs/test.jsp HTTP/1.1" 200 223 "
  50.  
  51. 其中客户端IP不能获取到,而通过request.getRemoteAddr();
  52. 获取的IP是代理服务器IP,而不是客户端IP,而在nginx中$remote_addr变量的值是客户端的IP,可见remoteaddr没有传递。
  53. 而server_port值也不对,当前值为5800,当前打印出的是80。
  54. 而当前代理为http://test 所有通过host得到的是test。
  55. 客户端port也获取不到值为20508,可传给应用的是58828
  56.  
  57. ----------------------------------------------------------------------------------------------------------------
  58.  
  59. 2)如下测试,设置 proxy_set_header
  60.  
  61. Nginx 配置:
  62. upstream test {
  63. server 192.168.1.123:9099;
  64. server 192.168.1.123:58080;
  65. }
  66. server {
  67. listen 5800;
  68. server_name 192.168.1.123;
  69. root /usr/share/nginx/html;
  70. include /etc/nginx/default.d/*.conf;
  71. location / {
  72. proxy_pass http://test;
  73. proxy_set_header Host $host:$server_port;
  74. proxy_set_header X-Real-IP $remote_addr;
  75. proxy_set_header X-Real-PORT $remote_port;
  76. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  77. }
  78.  
  79. 测试页面改成:
  80. <%@page contentType="text/html; charset=UTF-8" trimDirectiveWhitespaces="true"%>
  81. <%
  82. String scheme = request.getScheme();
  83. String serverName = request.getServerName();
  84. String remoteName = request.getRemoteAddr();
  85. String realIP = request.getHeader("X-Forwarded-For");
  86. String realIP2 = request.getHeader("X-Real-IP");
  87. String Host = request.getHeader("Host");
  88. int port = request.getServerPort();
  89. int portR = request.getRemotePort();
  90. String portR2 = request.getHeader("X-Real-Port");
  91. String requestURIC1 = scheme+"://"+realIP+":"+portR;
  92. String requestURIC2 = scheme+"://"+realIP2+":"+portR;
  93. String requestURIC3 = scheme+"://"+remoteName+":"+portR;
  94. String requestURI = scheme+"://"+serverName+":"+port;
  95. %>
  96.  
  97. 其中:
  98. 客户端地址1:<%=requestURIC1 %>
  99. 客户端地址2:<%=requestURIC2 %>
  100. 客户端地址3:<%=requestURIC3%>
  101. 服务器地址1:<%=requestURI%>
  102. 服务器地址2:<%=Host%>
  103. 客户端port2:<%=portR2%>
  104.  
  105. 客户端地址1:http://192.168.1.177:21548
  106. 客户端地址2:http://192.168.1.177:21548
  107. 客户端地址3:http://192.168.1.123:21548
  108. 服务器地址1:http://192.168.1.123:5800
  109. 服务器地址2:192.168.1.123:5800
  110. 客户端port2:20604
  111.  
  112. nginx日志:
  113.  
  114. 192.168.1.177 -20604---5800 [25/Aug/2016:16:38:42 +0800] "GET /docs/test.jsp HTTP/1.1" 200 275 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36" "-"
  115.  
  116. 除request.getRemoteAddr();获取的值不对外,其他值都是对的。
  117. getRemoteAddr获取的是代理的请求地址。
  118. 因重定义了host,所以test值被改写成代理服务器IP。
  119. 因重定义了 X-Real-PORT-并传递$remote_port,客户端port也获取正确了。

======================proxy_set_header自定义header头无效的问题========================

  1. nginx反向代理中经常碰过的一个"坑"proxy_set_header自定义header头无效的问题
  2.  
  3. 解决办法:
  4. nginx underscores_in_headers默认off
  5. 可以用减号-替代下划线符号_,避免这种变态问题。nginx默认忽略掉下划线可能有些原因。
  6.  
  7. upstream os-8080 {
  8. ip_hash;
  9. server 192.168.1.20:8080 max_fails=3 fail_timeout=15s;
  10. server 192.168.1.21:8080 max_fails=3 fail_timeout=15s;
  11. }
  12.  
  13. server {
  14. listen 80;
  15. server_name bpm.wangshibo.com;
  16.  
  17. access_log /data/nginx/logs/bpm.wangshibo.com-access.log main;
  18. error_log /data/nginx/logs/bpm.wangshibo.com-error.log;
  19.  
  20. nginx underscores_in_headers on;
  21.  
  22. location / {
  23. proxy_pass http://os-8080;
  24. proxy_redirect off ;
  25. proxy_set_header Host $host;
  26. proxy_set_header X-Real-IP $remote_addr;
  27. proxy_set_header REMOTE-HOST $remote_addr;
  28. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  29. proxy_connect_timeout 300;
  30. proxy_send_timeout 300;
  31. proxy_read_timeout 600;
  32. proxy_buffer_size 512k;
  33. proxy_buffers 8 512k;
  34. proxy_busy_buffers_size 512k;
  35. proxy_temp_file_write_size 512k;
  36. proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
  37. proxy_max_temp_file_size 128m;
  38. }
  39. error_page 500 502 503 504 /50x.html;
  40. location = /50x.html {
  41. root html;
  42. }
  43. }

================proxy_set_header中$proxy_host,$host,$http_host的区别================

  1. 在使用Nginx做反向代理的时候,proxy_set_header功能可以设置反向代理后的http header中的host,$http_host,$proxy_host,那么这几个有什么区别呢?
  2.  
  3. Nginx的官网文档中说下面这两条是做反代时默认的,所以$proxy_host 自然是 proxy_pass后面跟着的host
  4. proxy_set_header Host $proxy_host;
  5. proxy_set_header Connection close;
  6.  
  7. 如果客户端发过来的请求的header中有’HOST’这个字段时,
  8. $http_host$host都是原始的’HOST’字段
  9. 比如请求的时候HOST的值是www.csdn.net 那么反代后还是www.csdn.net
  10.  
  11. 如果客户端发过来的请求的header中没有有’HOST’这个字段时,
  12. 建议使用$host,这表示请求中的server name

==================不妨看一个proxy_set_header配置实例==================

  1. windows客户端(请求web服务):192.168.1.1
  2. nginx作为反向代理服务器:192.168.1.136
  3. nginx作为后端web服务器:192.168.1.137
  4.  
  5. 前提条件:配置nginx转发到后端服务器
  6.  
  7. server {
  8. listen 8080;
  9. server_name 192.168.1.136;
  10.  
  11. location / {
  12. root "/www/html";
  13. index index.html;
  14. #auth_basic "required auth";
  15. #auth_basic_user_file "/usr/local/nginx/users/.htpasswd";
  16. error_page 404 /404.html;
  17. }
  18.  
  19. location /images/ {
  20. root "/www";
  21. rewrite ^/images/bbs/(.*\.jpeg)$ /images/$1 break;
  22. rewrite ^/images/www/(.*)$ http://192.168.1.136/$1 redirect;
  23. }
  24.  
  25. location /basic_status {
  26. stub_status;
  27. }
  28.  
  29. location ^~/proxy_path/ {
  30. root "/www/html";
  31. index index.html;
  32. proxy_pass http://192.168.1.137/;
  33. proxy_set_header Host $host;
  34. proxy_set_header X-Real-IP $remote_addr;
  35. #proxy_set_header X-Forwarded-For $remote_addr;
  36. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  37. }
  38.  
  39. location ^~/proxy_path/ {
  40. root "/www/html";
  41. index index.html;
  42. proxy_pass http://192.168.1.137/;
  43. }
  44. }
  45.  
  46. 将左侧匹配到的/proxy_path/开头的url全部转发到后端服务器192.168.223.137

下面将一一测试各个proxy_set_header设置的变量的内容:

  1. 1proxy_set_header Host $host;
  2.  
  3. 136代理服务器,137后端服务器的log_format修改为如下:
  4. log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host '
  5. '$status $body_bytes_sent "$http_referer" '
  6. '"$http_user_agent" "$http_x_forwarded_for"';
  7.  
  8. proxy_set_header Host $host; 这里的Host变量的值对应的就是日志中的$http_host 的值
  9.  
  10. windows用户访问http://192.168.1.136:8080/proxy_path/index.html时
  11. 查看代理服务器和后端服务器的地址,可以发现$http_host对应的值为192.168.1.136:8080
  12. 192.168.1.1 - - [18/Jul/2017:10:21:25 +0800] "GET /favicon.ico HTTP/1.1" 192.168.1.136:8080 404 24 "http://192.168.1.136:8080/proxy_path/index.html"
  13. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "-"

如果将后端服务器关闭了,则会出现502网管错误:

  1. 然后开启137后端nginx,查看日志:
  2. 192.168.1.136 "192.168.1.1" - - [17/Jul/2017:17:06:44 +0800] "GET /index.html HTTP/1.0" "192.168.1.136" 304 0 "-" "Mozilla/5.0
  3. (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" "192.168.1.1"
  4. 即验证了proxy_set_header Host $host; $host就是nginx代理服务器,也就是windows客户端请求的host
  1. 2proxy_set_header Host $proxy_host;
  2.  
  3. 将设置修改为上述proxy_host然后重启ngxin代理服务器136
  4. [root@wadeson nginx]# sbin/nginx -s reload
  5. 重新请求代理页面:http://192.168.1.136:8080/proxy_path/index.html,然后日志如下:
  6.  
  7. 首先查看136代理服务器的日志:
  8. 192.168.1.1 - - [18/Jul/2017:10:30:12 +0800] "GET /proxy_path/index.html HTTP/1.1" 192.168.1.136:8080 304 0 "-" "Mozilla/5.0
  9. (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "-"
  10.  
  11. 因为windows136的客户端,请求的host192.168.223.136:8080,而nginx代理服务器作为137后端服务器的客户端,将请求的报文首部重新封装,
  12. proxy_host封装为请求的host
  13.  
  14. 那么137上面日志请求的host就是其自身,proxy_host就是代理服务器请求的host也就是后端服务器137
  15. 192.168.1.136 "192.168.1.1" - - [18/Jul/2017:10:30:12 +0800] "GET /index.html HTTP/1.0" "192.168.1.137" 304 0 "-" "Mozilla/5.0
  16. (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "192.168.1.1"
  17.  
  18. 3proxy_set_header Host $host:$proxy_port;
  19. 了解了上面的知识,那么此处对应的host就知道代表的啥了,$host代表转发服务器,$proxy_port代表136转发服务器请求后端服务器的端口,也就是80
  20.  
  21. 于是观察136137的日志进行验证:
  22. 192.168.1.1 - - [18/Jul/2017:10:38:38 +0800] "GET /proxy_path/index.html HTTP/1.1" 192.168.1.136:8080 304 0 "-" "Mozilla/5.0
  23. (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "-"
  24. 192.168.1.136 "192.168.1.1" - - [18/Jul/2017:10:38:38 +0800] "GET /index.html HTTP/1.0" "192.168.1.136:80" 304 0 "-" "Mozilla/5.0
  25. (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "192.168.1.1"
  26.  
  27. 4proxy_set_header X-Real-IP $remote_addr;
  28. $remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip
  29.  
  30. nginx转发136服务器日志格式为:
  31. log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host '
  32. '$status $body_bytes_sent "$http_referer" '
  33. '"$http_user_agent" "$http_x_forwarded_for"';
  34.  
  35. nginx后端137服务器的日志格式:
  36. log_format main '$remote_addr "$http_x_real_ip" - $remote_user [$time_local] "$request" "$http_host" '
  37. '$status $body_bytes_sent "$http_referer" '
  38. '"$http_user_agent" "$http_x_forwarded_for"';
  39.  
  40. 两者区别在于"$http_x_real_ip",添加了这个变量的值
  41. 重新请求需要访问的地址http://192.168.1.136:8080/proxy_path/index.html
  42.  
  43. 136的日志:
  44. 192.168.1.1 - - [18/Jul/2017:10:45:07 +0800] "GET /proxy_path/index.html HTTP/1.1" 192.168.1.136:8080 304 0 "-" "Mozilla/5.0
  45. (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "-"
  46.  
  47. 137的日志:
  48. 192.168.1.136 "192.168.1.1" - - [18/Jul/2017:10:45:07 +0800] "GET /index.html HTTP/1.0" "192.168.1.136:80" 304 0 "-" "Mozilla/5.0
  49. (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "192.168.1.1"
  50.  
  51. 红色标记的就是"$http_x_real_ip"的值,即可以看见用户真实的ip,也就是客户端的真实ip
  52.  
  53. 5proxy_set_header X-Forwarded-For $remote_addr;
  54. 理解了上面的含义那么这个封装报文的意思也就请求了
  55.  
  56. 首先还是比对136137的日志格式:
  57.  
  58. 136代理服务器的日志格式:
  59. log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host '
  60. '$status $body_bytes_sent "$http_referer" '
  61. '"$http_user_agent" "$http_x_forwarded_for"';
  62.  
  63. 137后端服务器的日志格式:
  64. log_format main '$remote_addr "$http_x_real_ip" - $remote_user [$time_local] "$request" "$http_host" '
  65. '$status $body_bytes_sent "$http_referer" '
  66. '"$http_user_agent" "$http_x_forwarded_for"';
  67.  
  68. 重新请求需要访问的地址http://192.168.1.136:8080/proxy_path/index.html
  69.  
  70. 136的日志显示:
  71. 192.168.1.1 - - [18/Jul/2017:10:51:25 +0800] "GET /proxy_path/index.html HTTP/1.1" 192.168.1.136:8080 304 0 "-" "Mozilla/5.0
  72. (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "-",最后一个字段
  73. "$http_x_forwarded_for"对应的为空值
  74.  
  75. 137的日志显示:
  76. 192.168.1.136 "192.168.1.1" - - [18/Jul/2017:10:51:25 +0800] "GET /index.html HTTP/1.0" "192.168.1.136:80" 304 0 "-" "Mozilla/5.0
  77. (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "192.168.1.1"
  78.  
  79. 可以看出137后端服务器成功的显示了真实客户端的ip
  80.  
  81. 6proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  82.  
  83. 56两者的区别:
  84. 在只有一个代理服务器的转发的情况下,两者的效果貌似差不多,都可以真实的显示出客户端原始ip
  85.  
  86. 但是区别在于:
  87. $proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。
  88.  
  89. ##################################################################################################################
  90. 举个例子,有一个web应用,在它之前通过了两个nginx转发,www.kevin.com 即用户访问该web通过两台nginx
  91.  
  92. 在第一台nginx中,使用
  93. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  94.  
  95. 现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,
  96. X-Forwarded-For变量的值就是用户的真实的ip地址了。
  97.  
  98. 到了第二台nginx,使用
  99. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  100.  
  101. 现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip$remote_addr部分的值是上一台nginxip地址,
  102. 于是通过这个赋值以后现在的X-Forwarded-For的值就变成了"用户的真实ip,第一台nginx的ip",这样就清楚了吧。

######   Nginx反向代理Tomcat访问报错400问题   #######
线上用nginx反向代理tomcat访问,配置完成后,直接访问tomcat完全正常,但是只要在nginx添加反向代理tomcat,访问nginx就会报错400。

原因和解决办法:
1)后端服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果nginx代理层不重写请求头中的host字段,将会导致请求失败,报400错误。
解决办法:

  1. proxy_set_header Host $http_host;

2)nginx配置中header头部信息的host不能被配置重了。tomcat没有对headers中的host进行唯一校验。
解决办法(下面两个要去掉一个):

  1. proxy_set_header Host $host;
  2. proxy_set_header Host $http_host; #去掉这一行

nginx反向代理中proxy_set_header 运维笔记的更多相关文章

  1. web 部署专题(八):Nginx 反向代理中cookie相关问题

    问题3:认证问题 Domino服务器中,通过写了一些接口代码,提供RESTful的服务,来对手机端进行提供服务.但是由于原来的环境,没有SSO,而且不通过认证,没法访问到Domino里面的接口代码. ...

  2. Linux系统运维笔记(四),CentOS 6.4安装Nginx

    Linux系统运维笔记(四),CentOS 6.4安装Nginx 1,安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool op ...

  3. 使用Nginx反向代理和proxy_cache缓存搭建CDN服务器加快Web访问速度

    碰到问题:移动用户访问web服务器www.osyunwei.com很慢解决办法:1.在移动机房放置一台nginx反向代理服务器2.通过域名DNS智能解析,所有移动用户访问www.osyunwei.co ...

  4. Linux系统运维笔记(五),CentOS 6.4安装java程序

    Linux系统运维笔记(五),CentOS 6.4安装java程序 用eclipse编译通的java程序,现需要实施到服务器.实施步骤: 一,导出程序成jar包. 1,在主类编辑界面点右健,选  ru ...

  5. Linux系统运维笔记(四),CentOS 6.4安装 MongoDB

    Linux系统运维笔记(四),CentOS 6.4安装 MongoDB 1,下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6 ...

  6. Linux系统运维笔记(三),设置IP和DNS

    Linux系统运维笔记(三),设置IP和DNS 手工配置静态的IP地址 也就是手工配置IP地址.子网掩码.网关和DNS. vi /etc/sysconfig/network-scripts/ifcfg ...

  7. Linux系统运维笔记(二),Linux文件编辑命令

    Linux系统运维笔记 Linux文件编辑命令 首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式 接下来我们按i,然后键盘随便输入写内容. 然后按ESC重新进入到命令 ...

  8. Linux系统运维笔记(一),查看系统版本和设置系统时间

    Linux系统运维笔记 查看系统版本和设置系统时间 查看系统版本 lsb_release -a (适用于所有的linux,包括Redhat.SuSE.Debian等发行版,但是在debian下要安装l ...

  9. Linux系统运维笔记(6),CentOS 7.6双网卡路由配置

    Linux系统运维笔记(6),CentOS 7.6双网卡路由配置. 一,先确认系统版本: [root@localhost ~]# cat /etc/redhat-releaseCentOS Linux ...

随机推荐

  1. JS获取当前星期几的简易写法

    var str = "今天是星期" + "日一二三四五六".charAt(new Date().getDay()); mark在此,方便日后复制 原文https ...

  2. fedora添加ntfs文件系统支持

    ntfs支持(安装后不能打开,重启) 如果没有换源先看一下换源. 查找库中是否有ntfs-3g. [root@bogon zhujikuan]# yum search ntfs 上次元数据过期检查:0 ...

  3. UITableView详解

    一.建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(, , , )]; [DataTable setD ...

  4. <table>标签总结(colspan跨列 ,rowspan跨行)

    table标签有些内置属性要设置: <table cellpadding="0" cellspacing="0" border="0" ...

  5. synchronized 的局限性 与 Lock 的优点

    我们已经知道,synchronized 是Java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多局限性, ...

  6. springmvc+ajax文件上传

    环境:JDK6以上,这里我是用JDK8,mysql57,maven项目 框架环境:spring+springmvc+mybaits或spring+springmvc+mybatis plus 前端代码 ...

  7. 2018-2019-2 20175105 实验一《JAVA开发环境的熟悉》实验报告

    一.实验内容及步骤 (一)使用JDK编译.运行简单的Java程序 利用cd指令和mkdir指令创建文件夹 利用vim指令编辑源代码文件 利用javac指令编译,利用java指令运行 (二)使用IDEA ...

  8. 【Codeforces 204E】Little Elephant and Strings

    Codeforces 204 E 题意:给\(n\)个串,求对于每一个串在至少\(k\)个串中出现的它的子串\(S_{l..r}\)有多少个. 思路:后缀自动机上\(dp\)... 我们首先构造出这\ ...

  9. linux源码分析 - 进程

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 最近在回想一些知识点的时候,觉得对进程这一块有些模糊,特别写一篇随笔对进程信息进行巩固和复习. 程序和进程 以我 ...

  10. springbootAdmin+eureka集群+swagger

    请移步githubb下载源码.知识共享.(https://github.com/yivvonllh) 或者直接git下载(https://github.com/yivvonllh/spring-clo ...