在插件开发中,我们自己开发的Controller中的接口有时候需要对外提供,这时就涉及到跨域,常见的跨域有很多,本专栏只介绍JSONP与跨域资源共享(CORS)。
JSONP由于只支持GET方式,所以有一定的局限性。即使设置为POST,发送请求时也会改为POST,另外不能在header中添加自定义属性。
比如我们在插件的Controller中定义了如下方法:
@RequestMapping(
value = {"/bg/deleteUserByOrgCodeAndName2"},
method = {RequestMethod.GET}
)
@ResponseBody
public String deleteUserByNameByJSONP(HttpServletRequest req, HttpServletResponse res, @RequestParam("userName") String userName,@RequestParam("orgCode") String orgCode,@RequestParam(value = "callback",required = false,defaultValue = "callback") String callback) throws Exception {
FineLoggerFactory.getLogger().info("delete user by jsonp................");
String X_Access_Token = req.getHeader("X-Access-Token");
//获取不到,JSONP不支持在header中加入自定义属性
FineLoggerFactory.getLogger().info("X-Access-Token:"+X_Access_Token);
FineLoggerFactory.getLogger().info("==== deleteUserByName userName:"+userName);
FineLoggerFactory.getLogger().info("==== deleteUserByName orgCode:"+orgCode);
String fineUserName = orgCode + "_" +userName;
User user = UserService.getInstance().getUserByUserName(fineUserName);
if(user == null){
return (new CrossDomainResponse()).callbackFuncName(callback).parameter("status", "fail").parameter("errorCode", "0001").parameter("errorMsg", "user is not exist").createCrossDomainResponse();
}
UserUpdateBean deleteBean = new UserUpdateBean();
String[] removeIds = new String[1];
removeIds[0] = user.getId();
deleteBean.setRemoveUserIds(removeIds);//删除登录用户
UserService.getInstance().deleteUsers(deleteBean);
return CrossDomainResponse.create().callbackFuncName(callback).parameter("message", "ok").parameter("status", "success").createCrossDomainResponse();
}
前端的写法:
function deleteUserByJsonp(){
var reportUrl = "http://localhost:8075/webroot/decision/bg/deleteUserByOrgCodeAndName2?userName=demo&orgCode=1111&callback=onCallBack1"
$.ajax({
type: "GET",
url: reportUrl,
dataType: "jsonp",
jsonp: "jsonpCallback",
});
}
function onCallBack1(res){
console.log("结果:" + res);
}