发表于: 2017-11-30 23:37:06

1 816



今日完成的事情:


1;完善代码,提交任务,就问题以及不足之处做出总结

 

2;第三方api异常的相关;


首先是,因为开发一个应用, 大多数都要调用其它服务接口获取相关资源,而第三方服务会有很多错误码,有相关系统异常,用户操作异常,授权异常等等。这个时候,就可以根据异常分类,根据状态码做出相应的判断,以及相应的操作;

 

这里再具体查了一下;对于自己开发的应用来说,一般把异常分为两类;


一类是系统异常; 系统异常是开发者比较关注的,因为导致这种异常发生的原因在于代码bug的出现,这种异常是用户无法操作解决的;举个代码例子,就拿荣联api接口,当调用接口方法有问题;约定好的参数类型不一致;这个时候用户即使重试一百遍,也无济于事;所有把这类用户不能操作的异常,做出相应的判断处理,上抛之类的;

 

二类是用户操作异常;简单来说就是用户非法操作异常;仍然是荣联api,假如想获取短信验证码,结果输入的手机号少一位,这个时候会出现异常;这类异常就比较直接,返回一个相应的信息,提示用户重新操作解决;

 

最后是,异常这一块做的不够深入,只是简单处理了解,真正的异常状态码,错误类型比较多;这个时候,就是通过日志来获取了;直接单独把错误信息输出到一个error.log,给错误类型编好对应的状态码;通过脚本来抓取查看做出对应的计算等等……简单的做一下,类似于这样……


logger.error("error1:OOS云储存名字错误......");

 

logger.error("error4:七牛删除错误: ........" + ex.error());

 

logger.error("error2:发送短信错误......." + result.get("statusCode") );

 

 





3;对于统计短信,邮箱这种发信数量的防攻击,这一点做的也不够好;最突出的就是表格设计不够简洁详细;师兄建议是分开,把短信这些单独列出来,比如短信模块,可以建立相应的字段手机号,验证码,发送时间;发送状态自定义等;根据手机号count出短信数等等,这里就不详细说了.


SELECT COUNT(*) FROM user WHERE phone = #{phone}


还有一点是没考虑到的,就是每个验证码的有效期;这个其实很普遍,大多数验证码都是有有效期的,思路也很简单,就是发送验证码的时候获取时间;填写好,点击提交的时候再获取一次时间,计算时差………就可以了....

 



4;接着是一键切换云储存;这个我的想法比较简单;利用switch…case来完成

 

实际上最初,我认为根本没必要……直接在controller里切换方法..……很垃圾……直接修改controller代码……..

//String profile= aliUtil.AliUpload();
//String profile= qiUtil.AliUpload();

 

然是正确的方式,通过修改配置文件;一键切换简单贴一下代码;

先是建一个工具类,来根据参数选择调用相应的云储存方法

 

switch (oosName) {
   
case "Ali":
       
return AliUtil.AliUpload();
   
case "QiNiu":
       
return QiUtil.QiUpload();
   
default:
       
logger.error("error1:OOS云储存名字错误......");
       
break;
}

 

然后是在spring里配置参数信息,方便一键切换

 

<!--切换云存储-->
<bean class="comNaNteng.util.CloudUtil">
   
<!--   QiNiu:七牛     ALi:阿里    -->
   
<property name="oosName" value="Ali"/>
</
bean>

 

最后是controller的方法调用,用工具类封装,简洁干脆

 

String profile = upLoad();

 




5;还有一个是假定上传一个图片,必须删除云储存的就图片;这个我想的也比较简单;首先要知道怎么删除?这就要看第三方的文档了;这个就不多说了,找到文档,把具体方法集成到自己代码;简单贴一个阿里的


 

public static void aliDelete(String keys) {
   
try {
       
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
       
ossClient.deleteObject(bucketName, keys);
       
ossClient.shutdown();
   
}catch (OSSException oe) {
  
logger.error("error3:阿里删除错误....."+oe.getErrorCode());

 


知道了方法,然后明白云储存里的形式,实际上就是key..value…形式,文件名就是key,只要 调用上面的方法,把这个key删除,图片自然也就删除了



 

 


那么问题是,因为两个云储存;而且两个方法名不一样,这个时候就要判断旧的图片再哪一个储存里;因为我是用的文件形式上传,不是以流的形式上传,而且key也就是文件名我已经自定义好了;就是当前时间



 

 

上传之后是这个样子



 

 

所以我的云储存里每一个图片的文件名就是一串数字;这个时候找出七牛云和阿里云不同的外链字段,来判断是哪一个云储存,………

 

 

这里是利用模糊查询……很简单就区分了………

 

<!--获取头像url-->
<select id="getUrl"  resultType="User">
   
SELECT profile FROM user WHERE profile LIKE concat('%',#{arg0},'%') AND phone = #{arg1}
</select>

 

然后在controller里根据……判断做出选择方法……

 

User user7 = userService.getPhone(phone);
//获取云储存的key
String[] keys = user7.getProfile().split("/");
String key = keys[3];
//判断并删除
if (userService.getUrl("aliyun", phone) != null) {
   
aliUtil.AliDelete(key);
} else {
   
qiUtil.QiDelete(key);
}
//上传新的图片
String profile = upLoad();

 

最后说一点;这里师兄给我出现了分歧;他认为我这种模糊查询有问题;因为文件名或许会存在我模糊查询的内容;实际上根据我上传的定义文件名也就是key早就定义好了,

 

String key = String.valueOf(System.currentTimeMillis());

 

 




也就是说每一个url里除了外链的前缀,根本不存在任何一个字母了……模糊查询到的内容只要能区分阿里和七牛两个前缀就可以精确的定位到信息了,我模糊的是aliyun这个字符串


根据我自己定义的文件名是当前时间;文件名也不会重复


七牛云:生成的格式,就是这样固定了;前缀固定,文件名xxxx当前时间是一串数字不会有字母的

http://p04rcp6jq.bkt.clouddn.com/XXXXXXXXXXXX

 

阿里云生成的固定格式;前缀也是固定的;文件名xxxx也是当前时间是一串数字也不会有字母的

http://ptteng.oss-cn-shanghai.aliyuncs.com/XXXXXXXXXX



 

然后把这个url利用string的方法split分成数组,取出XXXXXXX这个key也就是文件名,也就是当时的时间,直接删除就可以了;而师兄一直说有风险的原因是认为这个文件名可能还有模糊查询的字,但是根本不可能,我的文件名是一串数字,怎么会给字母重复,我又去看了他的代码,发现师兄的上传方式是以流的方式上传,并且把filename作为key,也就是文件名;要是按他的操作,确实有一定几率的风险,这个几率取决于我模糊字段的长度………就没必要说了……但是我并不是以流的方式上传,而且也没并没有以图片的名字命名……….风险不存在吧…….

 

 

然后是师兄又说,假如需求必须以上传的文件名作为云存储的文件名呢???首先我认为几乎没这种需求,上传的地方是后台,用户不会关心这个文件名吧??而且以文件名的话也不是和合理;假如一个用户上传的文件名一样怎么办?

 

再退一步来说,即使满足这个需求,即使不用模糊查询也可以;实际上不用判断,也可以删除文件;仔细看阿里云和七牛云的删除方法;都是根据key来删除的,也就是传进去的参数都一样……直接把两个方法封装到一起………congtroller里直接利用split取出云储存的url的后缀也即是key;强行执行两个删除方法;然后把没有数据的云储存空指针try…catch……不影响执行………不过不可取……毕竟是异常……


public static void QiDelete(String keys)

 

public static void AliDelete(String keys)

 



6;是防盗链,昨天只是了解了概念,没有具体操作,再师兄的要求下,还是简单做了操作,


阿里云很简单……直接根据ip操作……然后HTTP Refere自动过滤,防止盗链;简单贴个图……,结论就是没加之前,直接通过外链访问;加了之后访问不到



 

 

 


七牛云的………嗯暂时放一放…..


 

 


7;最后一个是纯概念;……什么是API?.......什么是SDK?


API: Application Programming Interface,应用程序编程接口;是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

 

SDK; 软件开发工具包Software Development Kit)一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。

 

APISDK的区别主要在一个是抽象的,一个是具体的。


SDKsoftware development kit,软件开发工具包,一个SDK是一个具体的东西,例如JavaJDK,它一定以某种形式存在,比如说是一个jar包,一个可以依赖的lib,一分可以直接引用的js代码。

 

SDKAPI的联系在于,实际上SDK包含了API的定义,API定义一种能力,一种接口的规范。而SDK可以包含这种能力,包含这种规范。我们常常说,这个SDK具有某某些API可以用。但SDK又不完完全全只包含API以及API的实现,它是一个软件工具包,它还有其他辅助性的功能。

 

例如JDK定义了JDBC API的规范,定义xml解析api的规范,但它也提供了很多工具包,例如常用数据结构Maplist等的封装,目的是方便使用者开发程序。

 

术语水了一下,实际上可以这样理解; API "软件",是一个功能的调用方式;SDK "硬件",包含 API说明文档,示例代码,API的封装库;再简单一点就是;API是接口;SDK是封装好的调用接口的方法,还有示例。

 

最后再记录一个很好的例子;


你想提取公积金,于是你公司的HR告诉你,你需要去找一个能办理公积金业务的银行。

这里的能办理公积金业务代表一种能力,一种API。如果一个银行具有办理公积金业务的能力,那么就说这个银行具有这种API


而这个银行呢,它就是一个SDK,它提供办理公积金的能力,所有细节,并且,它还可能给你提供额外的功能,例如免费复印身份证复印件的功能。


 

8;……邮箱用光……..………短信用光……..


 


 


9;学到的string字符串的拼接拆分...小demo.....split......



public class split
{
public static void main(String[] args)
{
String url = "http://ptteng.oss-cn-shanghai.aliyuncs.com/" + "32432";
       String[] a = url.split("/");
       for (String b : a) {
System.out.println(b);
       }
System.out.println(a[3]);


字符串的拼接与取出.....很方便












 

明日计划的事情:



1;任务做的不好,没时间看流的知识点………明天补一下……


2;简单了解新任务概念


3;有时间就再补一下基础吧

 









遇到的问题及解决方法:

 

 

1;几个小错误简单贴一下……静态static基础的定义以及使用方法,学习一下



 

 

 


 

2;log4j,自动导入的包……首选是工具类……而不是jar……找了半天想不通……一直爆红....这里



 

 

 

3;sql语句web项目里传参给java项目语法有点区别……



 

 

正确的是,定义好参数位置…….


SELECT profile FROM user WHERE profile LIKE concat('%',#{arg0},'%') AND phone = #{arg1}

 

 

 

收获:



1;完成任务,学习到第三方api的简单使用操作


 

2;代码整体操作感觉的顺畅度有所提升


 

3;小知识点如上几个




ps:

最后要说一下;到这里java的学习任务基本上完成90%;虽然经常吐槽师兄要求太多......把关太严........说实话是真诚感谢师兄的;自己基础差,任务的内容有时

候是只知道思路,有的是知道怎么做但是无法下手,有的时候是知道什么样是正确的但是又懒于做.....而师兄的严格要求......这些情况就避免了很多......自己理

解的不理解的,都硬着头皮做....收获很多......七个任务了....虽然在师兄的严格要求下,也算是过关,但实际上并没有达到官网的那种真正标准;我自己也明白,任

务里自己真正满意的或许只有一个半个.....因为基础差,有些功能要实现就要补很多很多东西........某些代码功能,也是偷懒没有真正实现.......不过基础是每天

都在慢慢增加,或许很少,也没什么办法了,这个只能慢慢积累,偶尔抽时间恶补一下........相信随着时间增长,情况会越来越好,不多说了...等任务结束,好好思考

总结一下...........




 

 

 



返回列表 返回列表
评论

    分享到