20170103


1、接口数据处理与安全性的设计

      在接口的开发过程中,我们经常与前端(Android,ios)打交道,更新数据等等,那么json必然是个好的数据格式,但是有了json我们要解析它,使用原生的解析也可以,但是很不高效,常用的有两种json数据解析的方式,一种是FastJSon ,这个是阿里巴巴出的,号称最快的解析速度。第二种使我们伟大的Google提供的Gson 来解析json,两个解析json都很方便,而且都很强大,下面介绍一下FastJson。

1.1首先看fastjson把实体bean解析成json格式的字符串

首先解析一个实体类为json 格式,假如有Student,Teacher两个实体类。

  1. Student student = new Student(0, "Aaron", 24);  
  2.  System.out.println(JSON.toJSONString(student));  
  1. 输出结果为:{"age":24,"id":0,"name":"Aaron"} 

更复杂一点的数据类型也可以很方便的使用JSON.toJsonString(Object o) 这个方法进行解析成json格式,比如list。

  1. List<Student> students = new ArrayList<Student>();  
  2.         for(int i=0;i<5;i++) {  
  3.             Student stu = new Student(i, "Student" + i, 18 +i);   
  4.             students.add(stu);  
  5.         }  
解析结果为:
  1. [{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"},{"age":20,"id":2,"name":"Student2"},{"age":21,"id":3,"name":"Student3"},{"age":22,"id":4,"name":"Student4"}]  
   我们来看看更复杂一点的结构。  我们将一个Teacher 列表来解析,一个Teacher对象中是包含Student 列表的这个也在我们常用的数据模型,下面看看代码:

  1. List<Teacher> teaList = new ArrayList<Teacher>();  
  2.         long time = System.currentTimeMillis();  
  3.         for(int i=0;i<10;i++) {  
  4.             Teacher teacher = new Teacher(i, "Teacher " + i);  
  5.             List<Student> stus = new ArrayList<Student>();  
  6.             for(int j = 0 ;j<4;j++) {  
  7.                 Student s = new Student(j, "Student" + j, 18 +j);   
  8.                 stus.add(s);  
  9.             }  
  10.             teacher.setStudents(stus);  
  11.             teaList.add(teacher);  
  12.         }  
  13.         String jsonTeach = JSON.toJSONString(teaList);  
  14.         System.out.println("fastjson = " + jsonTeach);  
结果为:
  1. fastjson = [{"id":0,"name":"Teacher 0","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]},{"id":1,"name":"Teacher 1","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]},{"id":2,"name":"Teacher 2","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]},{"id":3,"name":"Teacher 3","students":[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"}]}]

这个还有toJSONString 重载的方法,有很多,在给一个就是可以按照标准的json 格式输出,上面的输出都不规范,我们来看看, 

    Student student = new Student(0, "Aaron", 24);  
            System.out.println(JSON.toJSONString(student,true));  
    输出为:  
    {  
    "age":24,  
    "id":0,  
    "name":"Aaron"  
    }  
还有一种重载的方法 JSON.toJSONString(colBak, SerializerFeature.WriteMapNullValue) ,把没有值得字段也返回,这个对于前台来说非常重要。

        这一个简单的函数JSON.toJSONString()就能把实体对象,实体List等解析成String字符串,所以把实体类或者实体类List解析成json字符串 都使用JSON.toJSONString()这个方法。

2.2把JSON文本parse为JavaBean

   Student student = new Student(0, "Aaron", 24);  
    String str = JSON.toJSONString(student,true);  
    Student st =JSON.parseObject(str,Student.class); 

这样如果前端传来的参数为 {"age":24,"id":0,"name":"Aaron"}  ,通过Student st  =JSON.parseObject(str,Student.class); 就可以把各个参数注入到student这个bean中去了。
如果传过来的参数是数组比如:

[{"age":18,"id":0,"name":"Student0"},{"age":19,"id":1,"name":"Student1"},{"age":20,"id":2,"name":"Student2"},
{"age":21,"id":3,"name":"Student3"},{"age":22,"id":4,"name":"Student4"}] 
可以通过JSON.parseArray(arg0,arg1)解析,比如

List<Student> list=JSON.parseArray(date, Student.class);
3,接口安全性的设计
    主要是通过DES秘钥加密,比如前台要传参数{"mac":"28:FD:80:63:7c:06"},前台就可以根据约定的秘钥比如“tianwanggaidihu”,进行加密,
    然后通过parms参数传到后台比如http://www.remote3c.com/WeiShi/getColumnClan.action?params=3A23454BA191BA0C9DE380858566EF208A0EF81BD899D048AA66E896746FAFB7
    这样后台接收这个parms参数,再根据秘钥进行解密,然后在通过json解析,比如 Member st =JSON.parseObject(str,Member.class); 这样mac的值就传入Member中mac字段了。
    错误编号:100--缺少参数,
              101--解密失败
              102--参数转换异常
              103--缺少必要参数
              200--服务器异常

安全性只是相对的,这样做已算是相对安全的,如果涉及到金钱等重要数据,使用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 stub
		Timer timer =new Timer();
		timer.schedule(new MyTask(), 1000,3000);//毫秒,1秒后启动任务,以后每隔3秒执行一次任务
		
	}

}
import java.util.TimerTask;


public class MyTask extends TimerTask {

	@Override
	public 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、MVC和SSH的关系

MVC是一种框架模式,是一种思想,SSH是一种框架,是框架模式的实现,SSH是一种经典的MVC模式。


MVC三层架构:模型层、控制层和视图层。

模型层,用hibernate框架让javaBean在数据库生成表及关联,通过对javaBean的操作来对数据库进行操作;

视图层,用jsp模板把页面展现给用户以及提供与用户的交互;

控制层,用strust框架来连接数据层和视图层的接收、处理、发送数据并控制流程。

而spring框架粘和了hibernate和struts,透明的管理了整个架构,提供IOC容器使代码松耦合以及AOP框架的切面功能等等。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值