App Framework 中如何发送JSONP请求呢?
使用jsonp,详情请参考:http://json-p.org/
如何发送Ajax请求呢?
(1)登录
/*** * 会员登录 * @param username * @param password */ var user_login=function(username,password){ // alert(username+","+password); if(isHasLogin()) { alert("你已经登录过,无需再次登录"); return; } $.ui.showMask(); $.jsonP({url:'http://'+server_url+'/tv_mobile/user/login?callback=?&username='+username+"&password="+password,success:function(data){ var result=data.result; $.ui.hideMask(); switch (result) { case 1: window.user={}; window.sessionId=data.session; user.username=username; user.password=password; settings_before(document.getElementById("settings")); alert("登录成功"); $.ui.goBack(); break; case 3: alert("用户名不能为空"); break; case 4: alert("密码不能为空"); break; case 5: alert("用户名或密码错误"); break; case 2: alert("用户名不存在"); break; } }}); }
服务器代码:
/***
* 登录
* @param model
* @param status
* @param view
* @param session
* @param request
* @param callback
* @return
* @throws IOException
*/
@ResponseBody
@RequestMapping(value = "/login", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
public String login(Model model, Integer status, UserView view,
HttpSession session, HttpServletRequest request, String callback)
throws IOException {
init(request);
String content = null;
UserDao userDao = (UserDao) getDao();
User user2 = null;
Map map = new HashMap();
int login_result = 0;
if (ValueWidget.isNullOrEmpty(view.getUsername())) {
login_result = Constant2.LOGIN_RESULT_USERNAME_EMPTY;//用户名不能为空
} else if (ValueWidget.isNullOrEmpty(view.getPassword())) {
login_result = Constant2.LOGIN_RESULT_PASSWORD_EMPTY;//密码不能为空
} else if (ValueWidget.isNullOrEmpty(user2 = userDao.getByUsername(view
.getUsername()))) {
login_result = Constant2.LOGIN_RESULT_USERNAME_INVALID;//用户名不存在
} else if (!user2.getPassword().equals(view.getPassword())) {
login_result = Constant2.LOGIN_RESULT_FAILED;//登录失败(用户名和密码不匹配)
} else {
login_result = Constant2.LOGIN_RESULT_SUCCESS;
session.setAttribute("user", user2);
map.put("session", session.getId());// 下载session id到客户端
System.out.println("session id:" + session.getId());
}
// boolean isExist = userDao.isExist(view.getUsername(),
// view.getPassword());
map.put(Constant2.LOGIN_RESULT_KEY, login_result);
content = JSONPUtil.getJsonP(map, callback);
return content;
}
/***
* 用于jsonp调用
* @param map : 用于构造json数据
* @param callback : 回调的javascript方法名
* @return : js函数名(json字符串)
*/
public static String getJsonP(Map map,String callback)
{
ObjectMapper mapper = new ObjectMapper();
String content = null;
try {
content = mapper.writeValueAsString(map);
System.out.println(content);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(ValueWidget.isNullOrEmpty(callback)){
return content;
}
return callback+"("+content+")";
}
/***
*
* @param key
* @param value2
* @param callback
* @return : js函数名(json字符串)
*/
public static String getJsonP(String key ,Object value2,String callback){
Map map = new HashMap();
map.put(key, value2);
return getJsonP(map, callback);
}
若登录成功,返回的内容是:
{"result":1,"session":"C3EA8F68A1B685D3F820C4A729A9D0A7"}
注意:
(a)因为是要跨域请求,所以使用JSONP,没有直接使用ajax;
(b)实际上服务器返回的格式是:js函数名(json字符串)
(c)登录成功之后,页面要保存session,因为后续的请求(修改密码)要通过session验证权限
(2)修改密码
var modifyPassword=function($old_password,$new_password){ // alert($old_password.val()+" , "+$new_password.val()); if(!isHasLogin()) { alert("您未登录,请先登录"); $.ui.goBack(); return; } var old_password_val=$old_password.val(); if(!com.whuang.hsj.isHasValue(old_password_val)){ alert("请输入旧密码"); $old_password[0].focus(); return; } if(old_password_val!==user.password){ alert("旧密码不正确"); return; } var new_password_val=$new_password.val(); if(!com.whuang.hsj.isHasValue(new_password_val)){ alert("请输入新密码"); $new_password[0].focus(); return; } if(old_password_val===new_password_val){ alert("两次密码不能相同"); return; } $.ui.showMask(); var modi_url='http://'+server_url+'/tv_mobile/user/mod_pass?callback=?&password='+old_password_val+"&password2="+new_password_val+";jsessionid="+window.sessionId; alert(modi_url); $.jsonP({url:modi_url,success:function(data){ var result=data.result; $.ui.hideMask(); switch (result) { case 1: user.password=new_password_val; alert("修改成功"); $.ui.goBack(); break; case 23: alert("新密码不能为空"); break; case 21: alert("请先登录"); $.ui.goBack(); break; case 22: alert("两次密码不能相同"); break; case 24: alert("密码已过期,请点击右上角的刷新按钮"); break; } }}); }
注意:
(a)JSONP只能通过get方式请求,所以要在url地址后面添加session ID;
(b)不能以普通参数的方式来添加session id,应该是";jsessionid="
(3)注销
var logout= function () { if(!isHasLogin()) { alert("您未登录,请先登录"); $.ui.goBack(); return; } $.ui.showMask(); var modi_url='http://'+server_url+'/tv_mobile/user/logout?callback=?&password='+user.password+";jsessionid="+window.sessionId; alert(modi_url); $.jsonP({url:modi_url,success:function(data){ var result=data.result; $.ui.hideMask(); switch (result) { case 1: window.user=null; alert("注销成功"); $settings=$("#settings"); var $login_li=$settings.find("#settings_user"); resetSettingsUserMgmt($login_li); break; case 23: alert("新密码不能为空"); break; case 21: alert("请先登录"); window.user=null; $settings=$("#settings"); var $login_li=$settings.find("#settings_user"); resetSettingsUserMgmt($login_li); $.ui.goBack(); break; case 24: alert("密码已过期,请点击右上角的刷新按钮"); break; } }}); }
注意:注销时在请求服务器session的同时还要清除页面的登录信息(window.user=null;)
参考:
http://hw1287789687.iteye.com/blog/2188617
AJAX 跨域请求 - JSONP获取JSON数据:http://justcoding.iteye.com/blog/1366102