Spring Boot 系列文章:http://www.ityouknow.com/spring-boot.html Spring Cloud 系列文章:http://www.ityouknow.com/spring-cloud.html Spring Cloud 从入门到精通:https://blog.csdn.net/valada/article/details/80892573
View DetailsSpring Cloud由众多子项目组成,如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Consul 等,提供了搭建分布式系统及微服务常用的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性token、全局锁、选主、分布式会话和集群状态等,满足了构建微服务所需的所有解决方案。 服务发现——Netflix Eureka 客服端负载均衡——Netflix Ribbon 断路器——Netflix Hystrix 服务网关——Netflix Zuul 分布式配置——Spring Cloud Config Eureka 2eur.png 一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。 Ribbon Ribbon,主要提供客户侧的软件负载均衡算法。 3ri.png Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略: 简单轮询负载均衡 加权响应时间负载均衡 区域感知轮询负载均衡 随机负载均衡 Ribbon中还包括以下功能: 易于与服务发现组件(比如Netflix的Eureka)集成 使用Archaius完成运行时配置 使用JMX暴露运维指标,使用Servo发布 多种可插拔的序列化选择 异步和批处理操作(即将推出) 自动SLA框架(即将推出) 系统管理/指标控制台(即将推出) Hystrix 41h.png 断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费 CPU 周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。欢迎大家一起学习研究相关技术愿意了解源码的朋友直接求求交流分享技术:2147775633 42h.png 断路器增加了稳定性和灵活性,以一个系统,提供稳定性,而系统从故障中恢复,并尽量减少此故障的对性能的影响。它可以帮助快速地拒绝对一个操作,即很可能失败,而不是等待操作超时(或者不返回)的请求,以保持系统的响应时间。如果断路器提高每次改变状态的时间的事件,该信息可以被用来监测由断路器保护系统的部件的健康状况,或以提醒管理员当断路器跳闸,以在打开状态。 43h.png 流程图 44h.png Zuul 51z.png 类似nginx,反向代理的功能,不过netflix自己增加了一些配合其他组件的特性。 Spring Cloud Config 52z.png 这个还是静态的,得配合Spring Cloud Bus实现动态的配置更新。 更多详细源码参考来源:http://minglisoft.cn/honghu/technology.html 作者:IT小跑兵 链接:https://www.jianshu.com/p/02f3995001d0 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
View Details1 HSqlDB简介 HSQLDB是一款Java内置的数据库,非常适合在用于快速的测试和演示的Java程序中。(无需独立安装数据库) HSQLDB有三种模式: 1. Server 就像Mysql那样 2. In-Process 又叫做 Standalone 模式,数据放在本地文件,伴随JVM一起启动,是HSQLDB的主要应用场景 3. Memory-only, 仅仅在内存中,一旦重启,数据就消失。 2 客户端 2.1 运行HSQLDB_Client类中的main方法 其主方法调用了DatabaseManagerSwing的主方法 这回导致启动一个Swing做的客户端 2.2 创建数据库,账号和密码 填写连接参数 1. Setting Name:输入test 2. Type: 选择HSQL Database Engine Standalone 3. Driver: 使用默认的org.hsqldb.jdbcDriver 4. URL: 输入 Jdbc:hsqldb:file: D:/SoftWareInstall/HSqlDB/test 5. User: root 6: Password:root 第3步: 这是Standalone方式,对于同一个数据库,只能启动一次,不支持多进程连接同一个数据库,所以后续在写JAVA代码连接的时候,必须把这个客户端关闭掉才行。 第4步: Jdbc:hsqldb:file: D:/SoftWareInstall/HSqlDB/test会导致在D:/SoftWareInstall/HSqlDB目录下创建一个test数据库 第5,6步:会导致创建账号密码,以后再连接D:/SoftWareInstall/HSqlDB下的test数据库,就必须用这个账号密码了。 2.3 创建表 CREATE TABLE category ( id int NOT NULL GENERATED BY DEFAULT AS IDENTITY, name varchar(255) DEFAULT NULL, PRIMARY KEY (id) ) ; insert into category values (null,'水果'); insert into category values (null,'衣服'); insert into […]
View Details首先我们得下载一个druid-1.0.16.jar的包 其次键入命令 java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools your_password 这时候会生成privatekey,publickey,以及password,相关的截图如下 注意1:如果使用的不是druid-1.0.16.jar可能只会生成一个password。 注意2:如果没配置好,可能会报一大推奇奇怪怪的错误,比如:org.springframework.beans.factory.BeanCreationException: Error creatingbean with name 'shiroFilter':…. 配置Druid解密数据库密码 jdbc.type=mysql jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/jesng?useUnicode=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=IVpkS/WvZQKLcm4+f7xlLFo5FzxGIj3O1br9TcvLlq2a17mmt0SWe9Qq1hyVKsnbsRdU6FKTItc6vVIF9RRpTw== jdbc.publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKYBLQ067pCDwEfysD6rAIWZD4C2K7BO09NFYMmA+VD4i+28znGk9F3w3uCFp6vYf633rPJpx+hoHU/+9gBIewUCAwEAAQ== 配置Druid解密数据库密码的主要新增的两行配置。 1、<property name="connectionProperties" value="druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=${jdbc.publickey}"/> 作用:配置ConfigFilter解密密码 ,注意出的publickey对应 2、<property name="filters" value="config" /> 作用:提示Druid数据源需要对数据库密码进行解密 from:https://www.cnblogs.com/xiaohu1218/p/7791986.html
View Details1.idea 初始配置的tomcat7,配置spring boot项目启动失败,单个controller都启动失败,原因是idea内置tomcat7,会失败 2.idea需要配置tomcat8.然后加载依赖关系 a. idea项目左上角,file-->project structure 配置依赖 b.点击libraries 右侧有一个加号点击然后添加 c.找到tomcat lib文件夹,依赖lib文件夹即可 from:https://blog.csdn.net/qq_33919114/article/details/79232774
View Details发现项目中存在 X-Frame-Options 低危漏洞: 使用 X-Frame-Options X-Frame-Options 有三个值: DENY 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。 SAMEORIGIN 表示该页面可以在相同域名页面的 frame 中展示。 ALLOW-FROM uri 表示该页面可以在指定来源的 frame 中展示。 换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。 另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。 配置 Apache 配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 'site' 的配置中:
1 |
Header always append X-Frame-Options SAMEORIGIN |
配置 nginx 配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 'http', 'server' 或者 'location' 的配置中:
1 |
add_header X-Frame-Options SAMEORIGIN; |
配置 IIS 配置 IIS 发送 X-Frame-Options 响应头,添加下面的配置到 Web.config 文件中:
1 2 3 4 5 6 7 8 9 10 11 |
<system.webServer> ... <httpProtocol> <customHeaders> <add name="X-Frame-Options" value="SAMEORIGIN" /> </customHeaders> </httpProtocol> ... </system.webServer> |
配置 TOMCAT “点击劫持:X-Frame-Options未配置” 因为项目使用的是tomcat服务器,我们不可能在每个页面去添加:
1 |
response.addHeader("x-frame-options","SAMEORIGIN"); |
因此我们使用过滤器,代码如下:
1 2 |
HttpServletResponse response = (HttpServletResponse) sResponse; response.addHeader("x-frame-options","SAMEORIGIN"); |
通过以下配置,好像就没有在扫描出来该漏洞信息。 你配不上自己的野心 也辜负了所受的苦难 from:https://www.cnblogs.com/wdnnccey/p/6476518.html
View Details背景 项目上线之后使用绿盟或Acunetix安全扫描工具扫描后发现了头攻击漏洞。截图如下: 漏洞提示 检测工具在检测出漏洞后给予的提示为: 大意为不要使用request中的serverName,也就是说host header可能会在攻击时被篡改,依赖request的方法是不可靠的,形如JSP头部中的:
1 2 |
String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; |
这样的使用方法就会被漏洞检测工具查出来,认定有头攻击漏洞。 解决办法 提示中说,如果是php的话不要用_SERVER[“HTTP_HOST”],apache和Nginx通过设置虚拟机来纪要非法header,而web开发中常见的运行容器就是tomcat,网络查找出的解决方案大多不适用,最后,我们找到了一个折中的办法。 主要解决办法,就是在请求拦截上面做host合法性校验,拦截掉非法请求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class SessionFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 头攻击检测 String requestHost = request.getHeader("host"); if (requestHost != null && !ServerWhiteListUtil.isWhite(requestHost)) { response.setStatus(403); return; } ... } } |
上述代码是常见的web系统拦截器doFilter方法,我们在方法开始的地方做host判定,如果不在白名单内,则返回403状态码。漏洞工具收到403后认为访问请求已被终止,就不会报错了。 其中,ServerWhiteListUtil.isWhite(requestHost))方法:
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 |
package ...; import java.io.InputStreamReader; import java.util.List; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; /** * 服务器白名单列表 */ public class ServerWhiteListUtil { private static List<String> whiteList = null;; static { try { // 读取白名单列表 whiteList = new Gson().fromJson( new InputStreamReader(ServerWhiteListUtil.class.getResourceAsStream("/serverWhiteList.json")), new TypeToken<List<String>>() { }.getType()); } catch (Exception e) { e.printStackTrace(); } } /** * 判断当前host是否在白名单内 * @param host 待查host * @return boolean 是否在白名单内 */ public static boolean isWhite(String host) { if (whiteList == null || whiteList.size() == 0) { return true; } for (String str : whiteList) { if (str != null && str.equals(host)) { return true; } } return false; } } |
配置项serverWhiteList.json文件(放置在src根目录或resource配置目录,根据项目框架来定):
1 2 3 4 |
[ "www.aaa.com:78", "www.bbb.com:178" ] |
from:https://blog.csdn.net/ahuyangdong/article/details/79091699
View Details公司旧的项目用play,新的项目改用springboot,前端同学问我,新的项目怎么拿baseUrl? 其实springboot+thymeleaf是可以做到的,我就贴个代码记录一下吧 后端代码如下:
1 2 3 4 5 6 7 8 9 |
@Resource private void configureThymeleafStaticVars(ThymeleafViewResolver viewResolver) { if(viewResolver != null) { Map<String, Object> vars = Maps.newHashMap(); vars.put("picUrl", env.getProperty("picUrl")); vars.put("baseUrl", env.getProperty("baseUrl")); viewResolver.setStaticVariables(vars); } } |
只要放在spring能扫描到的地方就可以了. 不过这里有个问题,一般来说,这些地址都是通过properties文件,或者yml文件,分环境配置的,要拿配置文件的值,我第一时间就想用@value,但是由于加载顺序的关系,@value加载在后面,所以这里就不能用@value了,用environment
1 2 |
@Resource private Environment env; |
然后到前端的代码: 把这段代码放到header.html,统一加载就行了
1 2 3 4 |
<script th:inline="javascript"> const baseUrl = '[(${baseUrl})]'; const picUrl = '[(${picUrl})]'; </script> |
from:https://blog.csdn.net/bear_lam/article/details/80278590
View Details
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 |
package com.example.thymeleaf.commons; import org.springframework.stereotype.Component; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * 配置静态资源映射 * * @author sunziwen * @version 1.0 * @date 2018-11-16 14:57 **/ @Component public class WebMvcConfig implements WebMvcConfigurer { /** * 添加静态资源文件,外部可以直接访问地址 * * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); } } |
from:https://blog.csdn.net/wenxingchen/article/details/84139845
View Details目录 spring boot程序的static目录默认资源路径源码 application.yml增加配置 spring boot程序的static目录默认资源路径源码
1 2 3 4 5 |
<code class="prism language-java has-numbering"><span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String<span class="token punctuation">[</span><span class="token punctuation">]</span> CLASSPATH_RESOURCE_LOCATIONS <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">"classpath:/META-INF/resources/"</span><span class="token punctuation">,</span> <span class="token string">"classpath:/resources/"</span><span class="token punctuation">,</span> <span class="token string">"classpath:/static/"</span><span class="token punctuation">,</span> <span class="token string">"classpath:/public/"</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> |
可以看到springboot默认加载资源的路径是在calsspath下,这样jar打包的web项目资源文件只能放在jar内。这样修改和维护起来非常不方便。 参考官方文档,static资源也可以放在jar包外部,只要在配置文件中增加static-locations: 就可以直接在配置文件中覆盖默认的静态资源路径的配置信息 application.yml增加配置
1 2 3 4 5 6 7 8 |
<span class="token key atrule">spring</span><span class="token punctuation">:</span> <span class="token key atrule">resources</span><span class="token punctuation">:</span> <span class="token comment">#web静态页面路径</span> <span class="token comment"># static-locations: file:///E:/workspace/demo/target/demo/static/,file:///E:/workspace/demo/target/demo/public/</span> <span class="token comment">#当前启动目录下相对路径</span> <span class="token key atrule">static-locations</span><span class="token punctuation">:</span> file<span class="token punctuation">:</span>./static/<span class="token punctuation">,</span>file<span class="token punctuation">:</span>./public/ |
from:https://blog.csdn.net/u014155356/article/details/82862683
View Details