20170103

来源:互联网 发布:html个人简历模板源码 编辑:程序博客网 时间:2024/06/02 04:48

1、接口安全性的设计

      接口安全性主要包括身份是否合法,请求参数是否被篡改,请求的唯一性

在项目中主要是这么做的,在参数中添加 sysdate= systime & key = 32位的MD5加密码,

比如sysdate='20170103'&key=3AAD608D64D645A631AD685F5481C14D;

sysdate 是系统时间,key是 sysdate+password(约定的秘钥) 然后加密的,接口访问时服务器端首先会把 参数sysdate和约定的秘钥加密,与接口中key进行比较,如果不相等,就返回非法请求。还有sysdate与服务器时间是否超过两分钟(这个时间是自己定的),超过两分钟,就返回时间超时,这样做主要是为了防止key被破解,一直访问接口有效。这样做有一个缺点是客户端的系统时间有可能不对。

安全性只是相对的,这样做已算是相对安全的,如果涉及到金钱等重要数据,使用https是最安全的,OAuth2.0协议。

2、定时任务

     在做微信公众号,微信支付时,接口都需要access_token这个参数,微信对获取access_token 的接口有访问次数的限制,所以不能每次需要的时候都去取,还有有效期的限制,2个小时内有效,这就需要我们写一个定时任务每隔2小时内比如7000秒去取一次,放到静态变量里面,这样就不会有访问次数过多,时间超时等问题了。

java中定时任务一般有三种方法:1,java.util.Timer类,2,启动一个线程,在线程的run()方法中写一个死循环,然后使用Thread.sleep()来保证线程定时执行某项任务。3采用开源的任务调度框架quartz,Spring框架也支持quartz。

1,Timer类如下

import java.util.Timer;public class Test {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubTimer timer =new Timer();timer.schedule(new MyTask(), 1000,3000);//毫秒,1秒后启动任务,以后每隔3秒执行一次任务}}
import java.util.TimerTask;public class MyTask extends TimerTask {@Overridepublic void run() {System.out.println("1234123");}}

说明:写一个任务task,继承TimerTask,并重写run()方法,在run()方法里面编写需要执行的代码,然后new Timer()生产Timer的一个对象,通过调用Timer对象的schedule(arg1,arg2,arg3)方法启动定时任务,schedule()有四个重载方法,这里采用有三个参数的方法,arg1是任务对象,arg2是多长时间后开始执行任务,arg3多长时间重复执行上面方法的意思是1秒后启动任务,以后每隔3秒执行一次任务。

2,启动一个线程死循环

public class Test {/** * @param args */public static void main(String[] args) {    // 启动定时获取access_token的线程              new Thread(new TokenThread()).start();  }
public class TokenThread implements Runnable {      private static Logger log = LoggerFactory.getLogger(TokenThread.class);      // 第三方用户唯一凭证      public static String appid = "";      // 第三方用户唯一凭证密钥      public static String appsecret = "";      public static AccessToken accessToken = null;        public void run() {          while (true) {              try {                  accessToken = WeixinUtil.getAccessToken(appid, appsecret);                  if (null != accessToken) {                      log.info("获取access_token成功,有效时长{}秒 token:{}", accessToken.getExpiresIn(), accessToken.getToken());                      // 休眠7000秒                      Thread.sleep((accessToken.getExpiresIn() - 200) * 1000);                  } else {                      // 如果access_token为null,60秒后再获取                      Thread.sleep(60 * 1000);                  }              } catch (InterruptedException e) {                  try {                      Thread.sleep(60 * 1000);                  } catch (InterruptedException e1) {                      log.error("{}", e1);                  }                  log.error("{}", e);              }          }      }  }  

说明:通过实现Runnable创建了一个线程TokenThread,重写run()方法执行需要执行的代码,run()方法通过while(true)死循环不断的获取token,用Thread.sleep(7000)休眠,增加时间间隔。
第三种框架的不常用就不写了。

3、获取系统时间

          获取系统时间有好几种方法,在里面总结一下常用的三种

1、

                SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date =new Date();String systime=ft.format(date);System.out.println(systime);

2,
        SimpleDateFormat ft2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String systime2 =ft2.format(System.currentTimeMillis());System.out.println(systime2);

3,
                Calendar c = Calendar.getInstance();int year =c.get(Calendar.YEAR);int month =c.get(Calendar.MONTH+1);int day = c.get(Calendar.DATE);int hour = c.get(Calendar.HOUR_OF_DAY);int minute = c.get(Calendar.MINUTE);int second = c.get(Calendar.SECOND);System.out.println(year+"/"+month+"/"+day+"  "+hour+":"+minute+":"+second);



0 0
原创粉丝点击