单位开发了一个app系统,app外包,服务由自开发的薪资查询系统提供。app与后端交互采用jsonp解决跨域问题。

JSONP的实现,需要加上一个callback,JSONP和普通JSON的区别在于普通JSON,返回时
out.write("{name:'Xie Feng'}");
而jsonp的返回则是
out.write("callback({name:'Xie Feng'}");
callback实际是一个js端的函数名称,双方可以任意约定
所以对于服务器端唯一区别在于,返回的string多一个callback(xxxx)
jsonp只能使用get请求,解决同源问题,返回javascript代码,因为请求javascript文件是没有同源问题的。
当请求数据类型为jsonp时,会将callback=jsonpCallback加在url上,http://localhost:8090/api/testcallback=jsonpCallback
前台javascript中定义jsonpCallback函数,此函数必须定义在window下,也就是全局的函数,否则找不到。
后台获取请求的callback参数值jsonpCallback,返回字符串"jsonpCallback(result)",result为返回结果。
请求返回的是script tag,首先会调用jsonpCallback函数,不管是否找到该函数,都会调用success函数。
如果没有定义jsonp和jsonpCallback,jsonp默认为"callback",jsonpCallback会是Jquery自动生成的函数名。
可以参考例子。
代码如下,struts配置:
jsonp.jsp
jsonp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String jsoncallback = request.getParameter("callback");
String jsonResult = (String)request.getAttribute("salaryResult");
out.println("callback("+jsonResult+")");
%>方法实现
public String querySalaryByKeyForApp() {
try{
SalUserEntity salUserQuery = new SalUserEntity();
if(salaryVo == null || salaryVo.getSalaryEntity() == null){
salaryResult = "{errorMsg : 错误}";
return SUCCESS;
}
String staffId = salaryVo.getSalaryEntity().getStaffId();
String year = salaryVo.getSalaryEntity().getYear();
String month = salaryVo.getSalaryEntity().getMonth();
String password = salaryVo.getSalaryEntity().getPassword();
if(StringUtils.isEmpty(staffId) || StringUtils.isEmpty(year) || StringUtils.isEmpty(month)
|| StringUtils.isEmpty(password)){
salaryResult = "{errorMsg : 错误}";
return SUCCESS;
}
salUserQuery.setStaffId(staffId);
salUserQuery.setPassword(password);
if(salUserService.valUser(salUserQuery)){
salUserService.valUser(salUserQuery);
List entities = salaryService.querySalaryList(salaryVo.getSalaryEntity());
if(entities == null || entities.size() != 1){
throw new SalaryException("您的薪资数据未录入,新联系HR!");
}
List json转换:
private JSONArray entity2ListOfMap(SalaryEntity salary) {
if(salary == null){
salary = new SalaryEntity();
return entity2ListOfMap(salary);
}
JSONArray result = new JSONArray();
JSONObject basicInfo = new JSONObject();//基本信息
JSONObject wageInfo = new JSONObject();//应发工资
JSONObject buckleInfo = new JSONObject();//实扣工资
JSONObject realInfo = new JSONObject();//实发工资
JSONObject gscdInfo = new JSONObject();//公司承担
JSONArray basicMap = new JSONArray();
JSONArray wageMap = new JSONArray();
JSONArray buckleMap = new JSONArray();
JSONArray realMap = new JSONArray();
JSONArray gscdMap = new JSONArray();
JSONObject jsonObjectgh = new JSONObject();
jsonObjectgh.put("name", "工号");
jsonObjectgh.put("value",salary.getStaffId());
basicMap.add(jsonObjectgh);
JSONObject jsonObjectxm = new JSONObject();
jsonObjectxm.put("name", "姓名");
jsonObjectxm.put("value",salary.getStaffName());
basicMap.add(jsonObjectxm);
JSONObject jsonObjectbm = new JSONObject();
jsonObjectbm.put("name", "部门");
jsonObjectbm.put("value",salary.getDept());
basicMap.add(jsonObjectbm);
JSONObject jsonObjectks = new JSONObject();
jsonObjectks.put("name", "科室");
jsonObjectks.put("value",salary.getClass_());
basicMap.add(jsonObjectks);
JSONObject jsonObjectnf = new JSONObject();
jsonObjectnf.put("name", "年份");
jsonObjectnf.put("value",salary.getYear());
basicMap.add(jsonObjectnf);
JSONObject jsonObjectyf = new JSONObject();
jsonObjectyf.put("name", "月份");
jsonObjectyf.put("value",salary.getMonth());
basicMap.add(jsonObjectyf);
basicInfo.put("category", "基本信息");
basicInfo.put("id", "info");
basicInfo.put("items", basicMap);
result.add(basicInfo);
return result;
}接口用http形式提供:

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。