发表于: 2017-12-09 15:18:18
1 783
今天完成的事
【进行数据迁移】
这里要用到阿里的小程序。
这个工具张这个样子。
里面的东西都是干嘛的呢
选择一键导入。
启动之后是这个样子的。
很明显,没有任何反应,那就对了。
因为。。。。
我也没配置啊。
找到配置文件。
#是否打开增量模式,如果设为true,会每间隔incrementalModeInterval(单位秒)重新扫描一次增量数据,并将增量数据同步到oss上,incrementalModeInterval不建议配置成小于3600秒的值,会浪费很多请求次数,造成额外的开销(目前可配置的最小间隔为900秒)
isIncremental=false
incrementalModeInterval=86400
##############################################################同步源端设置##############################################################
#同步源类型,目前支持:
#1.local(本地文件,此选项只需要填写srcPrefix,不需要填写srcAccessKey,srcSecretKey,srcDomain,srcBucket)
#2.oss(从oss的一个bucket迁移到另一个bucket)
#3.qiniu(七牛)
#4.bos(百度的云存储)
#5.ks3(金山的云存储)
#6.s3(亚马逊s3)
#7.youpai(又拍云,又拍云获取文件列表的接口比较特殊,在同步时list不支持断点,因此在list没有完成时杀掉同步进程会导致下次会重新全部list文件列表)
#8.http (通过提供的http链接列表同步数据,此选项不需要填写srcAccessKey,srcSecretKey,srcDomain,srcBucket,srcPrefix)
#9.cos(腾讯云)
#10.azure(微软blob)
srcType=local
#源access key,同步本地文件以及通过http地址同步的不需要填,大部分云平台填写控制台获取的acceess key/accss key id,又拍云填写操作员账号
srcAccessKey=
#源secrect key,同步本地文件以及通过http地址同步的不需要填,大部分云平台填写控制台获取的secret key/access key secret,又拍云填写操作员密码
srcSecretKey=
#源endpoint,同步本地文件以及通过http地址同步的不需要填
#1.oss: 从控制台获取域名(非带bucket前缀的二级域名),域名列表参考https://help.aliyun.com/document_detail/31834.html; 例:"srcDomain=http://oss-cn-hangzhou-internal.aliyuncs.com"; 如果用阿里云ecs虚拟机做迁移的,请使用internal域名,不计费且不受虚拟机带宽限制(非虚拟机无法使用);例:http://oss-cn-hangzhou-internal.aliyuncs.com
#2.七牛: 从七牛控制台获取对应bucket的域名
#3.百度bos: http://bj.bcebos.com或者http://gz.bcebos.com
#4.金山ks3: http://kss.ksyun.com或者http://ks3-cn-beijing.ksyun.com或者http://ks3-us-west-1.ksyun.com
#5.亚马逊s3: 各个region的地址请参考http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
#6.又拍云: http://v0.api.upyun.com(自动判断最优线路)或者http://v1.api.upyun.com(电信线路)或者http://v2.api.upyun.com(联通网通线路)或者http://v3.api.upyun.com(移动铁通线路)
#7.腾讯云: cos v3版本不需要填写;cos v4版本需要填上bucket所在的区域,比如华南园区填写:gz,华北园区:tj,华东园区:sh
#8.微软blob: 连接字符串中的EndpointSuffix,如core.chinacloudapi.cn
srcDomain=
#源bucket名字,同步本地文件以及通过http地址同步的不需要填,不需要加上"/";微软blob填container名称
srcBucket=
#源前缀,默认为空,如果srcType=local,则此目录是本地目录,如果是其他类型,则是源Bucket里需要同步的Object的前缀,注意如果是本地目录,需要完整目录路径(以'/'进行分割并且以'/'结尾,例: c:/example/)
srcPrefix=
##############################################################同步目的端设置################################################################
#目的 access key
destAccessKey=
#目的 secret key
destSecretKey=
#目的endpoint,请根据您的实际oss区域填写,默认为杭州的域名,如果用阿里云ecs虚拟机做迁移的,请使用internal域名,不计费且不受虚拟机带宽限制(非虚拟机无法使用);例:http://oss-cn-hangzhou-internal.aliyuncs.com
#注意:域名里不要带上bucket前缀,oss域名帮助页面:https://help.aliyun.com/document_detail/31837.html
destDomain=http://oss-cn-hangzhou-internal.aliyuncs.com
#目的bucket,不需要加上"/"
destBucket=
#目标前缀,默认为空,直接放在bucket下(如果要将数据同步到oss的某个目录下,请以'/'结尾),注意:oss不支持以 '/' 作为文件的开头,所以destPrefix请不要配置以'/'做为开头
#一个本地文件路径为 srcPrefix + relativePath的文件,迁移到oss的路径为destDomain/destBucket/destPrefix + relativePath
#一个云端文件路径为 srcDomain/srcBucket/srcPrefix + relativePath的文件,迁移到oss的路径为destDomain/destBucket/destPrefix + relativePath
destPrefix=
##############################################################srcType=cos时的配置项###########################################################
#腾讯云的appId
appId=0
##############################################################srcType=http时的配置选项########################################################
#srcType="http"时,需要提供http列表文件的绝对路径,此文件中的http链接需要划分成两列,分别代表前缀以及上传到oss后的相对路径
#例,有一个完整的http链接是127.0.0.1/aa/bb.jpg,不同的切分方法最后会导致上传到oss的路径会不一样:
#c:/example/http.list文件内容:
#127.0.0.1/aa/ bb.jpg
#127.0.0.1/ aa/bb.jpg
# 第一行的文件导入到oss后的路径为 "destDomain/destBucket/destPrefix" + "bb.jpg"
# 第二行的文件导入到oss后的路径为 "destDomain/destBucket/destPrefix" + "aa/bb.jpg"
httpListFilePath=c:/example/http.list
httpPrefixColumn=1
relativePathColumn=2
##############################################################任务配置,没有特殊需求不需要修改#################################################
#job名字,每个任务唯一,单机模式下请不要修改此项
jobName=local_test
#job类型(import/audit),import为同步数据到oss,audit为校验源端数据和oss数据是否一致
jobType=import
#只导入源文件最后修改时间大于该时间的数据,默认为0,这个时间为unix时间戳(秒数)
importSince=0
#在校验时,如果文件的最后修改时间大于该值,则跳过此文件的校验,默认值0为关闭该功能,所有文件都需要校验,这个时间为unix时间戳(秒数),jobType为audit时此项不生效
lastModify=0
# 每个子任务最大的文件个数限制,这个会影响到任务执行的并行度,一般配置为总的文件数/120
taskObjectCountLimit=10000
#每个子任务下载的最大文件大小限制(bytes)
taskObjectSizeLimit=1000000000
#并行扫描文件列表的线程数,只影响扫描文件的效率,没有特殊需求不要修改
scanThreadCount=1
#最大允许并行扫描目录的深度,默认为1就是只能在顶级目录间并行扫描,没有特殊需求不要修改,随意配置的过大会导致任务无法正常运行
maxMultiThreadScanDepth=1
配置过后再执行。
控制台一顿闪。
直到
成功。好的去阿里云里面看一下是否标准的迁移了。
名字都不会变,完美迁移。
【防盗链】
在储存空间
先设置成阿里的。
再链接的时候用户头像没有请求到。
设置本地host为域名
添加白名单
就又可见了。
【将所有的keyID和keySecret放入配置文件】
新建一个app.properties
引入这个文件。
<value>classpath:api.properties</value>
作私有化和getset方法。(方便一会spring注入)
private String accessKey ;
private String secretKey ;
private String bucket ;
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public String getBucket() {
return bucket;
}
public void setBucket(String bucket) {
this.bucket = bucket;
}
spring写注入。
<bean id="qiuniu" class="com.xiuzhen.API.QiNiuUpLoad">
<property name="accessKey" value="${qiniu_accessKey}"/>
<property name="secretKey" value="${qiniu_secretKey}"/>
<property name="bucket" value="${qiniu_bucket}"/>
</bean>
<bean id="ali" class="com.xiuzhen.API.AliUpLoad">
<property name="endpoint" value="${ali_endpoint}"/>
<property name="accessKeyId" value="${ali_accessKeyId}"/>
<property name="accessKeySecret" value="${ali_accessKeySecret}"/>
</bean>
<bean id="Email" class="com.xiuzhen.API.Email">
<property name="url" value="${Email_url}"/>
<property name="apiKey" value="${Email_apiUser}"/>
<property name="apiUser" value="${Email_apiKey}"/>
</bean>
<bean id="SMS" class="com.xiuzhen.API.SMS">
<property name="serverIP" value="${SMS_server_ip}"/>
<property name="serverPort" value="${SMS_server_port}"/></bean>
这里我发现了一个更牛逼的方法。详情见今日收获。
【短信防攻击策略】
目前,防范的手段主要有以下几个方面:
1,短信发送间隔设置——设置同一号码重复发送的时间间隔,一般设置为60-120秒
- 2,IP限定——根据自己的业务特点,设置每个IP每天的最大发送量
- 3,手机号码限定——根据业务特点,设置每个手机号码每天的最大发送量
- 4,流程限定——将手机短信验证和用户名密码设置分成两个步骤,用户在设置成功用户名密码后,下一步才进行手机短信验证,并且需要在获取第一步成功的回执之后才可进行校验。
- 5, 绑定图型校验码——将图形校验码和手机验证码进行绑定,这样能比较有效的防止软件恶意注册。
以我目前的能力只能实现第一条。
对手机号在session里存一个key-value。
每次进行请求做一次判定。
int verify = (int) (Math.random() * 9000 + 1000);
//短信防攻击策略主要思想就是设置60秒只能发送一次。
if (session.getAttribute("tel")==null){
userService.checkSMS(verify, tel);
session.setAttribute("verify", verify);
session.setMaxInactiveInterval(60 * 60);
session.setAttribute("tel",tel);
}else {
System.out.println( "你发送过一次验证码了撒比");
}
每次以第一次点击。
是可以进入方法的。
第二,三,四次点击。
过30分钟之后就又可以验证了。
虽然很蠢。而且会有一些麻烦,因为限定了session的时间。
但是目前先这样。以后回来填坑。
至此任务七收工~~~~提交。
【关于任务8】
鉴于各类大佬推荐。
直接入手dubbo
Dubbo是什么?
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架
其核心部分包含:
1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Dubbo能做什么?
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
没错上面的我是百度来的,也就读了一遍感受了一下大概意思。
作用应该是透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。如果不想使用Spring配置,而希望通过API的方式进行调用(不推荐)
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
这是他的依赖。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
具体部署明天再搞。
困的一比。
遇到的问题
今天在构造注入的时候发现注入不进去。
在spring配置文件里已经声明bean。
并且也在类里面做了getset方法。
public void setAppId(String appId) {
this.appId = appId;
}
public String getAccountSid() {
return accountSid;
}
public void setAccountSid(String accountSid) {
this.accountSid = accountSid;
}
public String getAccountToken() {
return accountToken;
}
public void setAccountToken(String accountToken) {
this.accountToken = accountToken;
}
public String getServerIP() {
return serverIP;
}
public void setServerIP(String serverIP) {
this.serverIP = serverIP;
}
public String getServerPort() {
return serverPort;
}
public void setServerPort(String serverPort) {
this.serverPort = serverPort;
}
public void SMS(Integer verify ,String phone){
但是我在使用的时候怎么也不能拿到注入的值。
问了师兄。
发现自己有一个知识点理解的不对。还是很常用的一个注解。
使用@Autowired的原理是什么?
其实在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性
以上我都是知道的。主要是下面这个。
在使用@Autowired时,首先在容器中查询对应类型的bean
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名称来查找。
如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
我每次注入的时候标签是这样的,让idea自动生成的。
但是我在spring配置文件里面的bean名称是
这样我创建的对象不会是我spring工厂里面的bean。
而是spring自动建立的类。就是别名是小写开头的那个。
他会参照上面的第二条。
相当于把我扫描包的
自动生成的类小写名生成了对象,没有经过我的spring注入的bean。
自然没有值。
如果我把@autowired指定我spring里注入的bean。
那就可以取到值了。
吃了spring基础知识不扎实的亏。
收获
【设置session失效时间的三种方法】
一、 在程序中调用session的setMaxInactiveInterval方法设置
session.setMaxInactiveInterval(30 * 60);
setMaxInactiveInterval设置的是当前会话的失效时间,不是整个web的时间,单位为以秒计算。如果设置的值为零或负数,则表示会话将永远不会超时。
二、在web.xml中的session-config配置
session-timeout元素用来指定默认的会话超时时间间隔,以分钟为单位。该元素值必须为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时。如,设置session失效时间为30分钟:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
三、直接在应用服务器中设置
如果是tomcat,可以在tomcat目录下conf/web.xml中找到<session-config>元素,tomcat默认设置是30分钟。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
这个时候就面临一个问题。
这三个方法的优先级是什么。。。
问了问师兄。
这个优先级应该是哪个后运行以哪个为主。
所以进程顺序决定了哪个为主。。
应该是第一个方法大于第二个大于第三个。。
mark一下。
【关于@value的一点冷知识点】
瞎点看到的,这个标签以前没遇到过,但是很好用。
这是个啥标签呢。
首先,@value需要参数,这里参数可以是两种形式:@Value("#{configProperties['t1.msgname']}")或者@Value("${t1.msgname}");
其次,下面我们来看看如何使用这两形式,在配置上有什么区别:
1、@Value("#{configProperties['t1.msgname']}")这种形式的配置中有“configProperties”,其实它指定的是配置文件的加载对象:配置如下:
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:/config/t1.properties</value>
</list>
</property>
</bean>
这样配置就可完成对属性的具体注入了;
2、@Value("${t1.msgname}")这种形式不需要指定具体加载对象,这时候需要一个关键的对象来完成PreferencesPlaceholderConfigurer,这个对象的配置可以利用上面配置1中的配置,也可以自己直接自定配置文件路径。
如果使用配置1中的配置,可以写成如下情况:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="properties" ref="configProperties"/>
</bean>
如果直接指定配置文件的话,可以写成如下情况:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="location">
<value>config/t1.properties</value>
</property>
</bean>
这个标签又多好用呢。暴风好用。
我给你举个例子。
首先我要在spring配置文件中引入这个配置文件。
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:redis.properties</value>
<value>classpath:C3P0.properties</value>
<value>classpath:api.properties</value>
<!--要是有多个配置文件,只需在这里继续添加即可 -->
</list>
</property>
</bean>
我在我的类里面要是想引用properties配置文件的时候。
我不需要在spring配置文件里面加入构造注入。
这段都注解掉。
类里面的set方法也注解掉。
打个日志。
跑个测试方法。
可以看到拿到参数,并且上传成功。
可以让代码简单的一比。。。。
以后对于properties的文件还做什么getset依赖注入啥的啊。
【关于bean的一点冷知识】
1、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);
2、凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;
3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解;
4、把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了
我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean或者给出一个Bean。
这点很重要啊很重要啊很重要啊!!!
明天的计划
完成任务8(吹牛逼)
禅道链接
评论