当前位置:首页 > 开发 > 编程语言 > Json > 正文

App Framework发送JSONP请求(3)

发表于: 2015-03-09   作者:hw1287789687   来源:转载   浏览:
摘要: App Framework 中如何发送JSONP请求呢? 使用jsonp,详情请参考:http://json-p.org/ 如何发送Ajax请求呢? (1)登录 /*** * 会员登录 * @param username * @param password */ var user_login=function(username,password){ // aler

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

 

 

 

App Framework发送JSONP请求(3)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
前言   ajax,用苍白的话赞扬:很好。   我们可以使用ajax实现异步获取数据,减少服务器运算时
0 什么是跨域请求 在一个域名下请求另外一个域名下的资源,就是跨域请求。 example 1: 比如:我当前
使用 PHP + socket 模拟发送 HTTP GET 请求,过程是: ① 打开连接 ② 构造 GET 请求的数据:写入请
在iOS9 beta中,苹果将原http协议改成了https协议,使用 TLS1.2 SSL加密请求数据。 错误提示:Appli
JSONP解释 在解释JSONP之前,我们需要了解下”同源策略“这个概念,这对理解跨域有帮助。基于安全的原
前言 ajax,用苍白的话赞扬:很好。 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大
一直对jQuery 的jsonp 调用比较疑惑,今天研究了一下jsonp 做了一个简单的调用例子,我用asp做服务端
一直对jQuery 的jsonp 调用比较疑惑,今天研究了一下jsonp 做了一个简单的调用例子,我用asp做服务端
javascript 代码: $.ajax({ url: "http://10.255.32.250/recent_done_seven_days", data: '', data
需求 遇到的问题 解决办法 需求 今天项目需要访问一个外部链接获取数据,是跨域的。使用ajax 请求一
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号