发表于: 2017-12-09 15:18:18

1 780


今天完成的事


【进行数据迁移】

这里要用到阿里的小程序。

这个工具张这个样子。

里面的东西都是干嘛的呢

选择一键导入。

启动之后是这个样子的。

很明显,没有任何反应,那就对了。

因为。。。。

我也没配置啊。

找到配置文件。

#是否打开增量模式,如果设为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秒

  1. 2,IP限定——根据自己的业务特点,设置每个IP每天的最大发送量
  2. 3,手机号码限定——根据业务特点,设置每个手机号码每天的最大发送量
  3. 4,流程限定——将手机短信验证和用户名密码设置分成两个步骤,用户在设置成功用户名密码后,下一步才进行手机短信验证,并且需要在获取第一步成功的回执之后才可进行校验。
  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(吹牛逼)

禅道链接

http://task.ptteng.com/zentao/my-task-assignedTo.html


返回列表 返回列表
评论

    分享到