iovaaron 2015-03-09
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;)
参考: