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
相关推荐
首先,通过引入jqMobi和App Framework的脚本文件,然后使用它们提供的API进行DOM操作、事件绑定、数据请求等。接着,利用App Framework的路由和页面管理功能,设计应用程序的页面结构和导航流程。最后,通过插件扩展...
ASP.NET 是一种基于微软.NET Framework的服务器端网页开发技术,用于构建动态、数据驱动的Web应用程序。这篇文档介绍的是如何在ASP.NET网站中集成QQ登录功能,让网站用户可以通过自己的QQ账号进行登录。以下是实现这...
在上述代码中,我们发送一个GET请求到WCF服务的`GetData`方法,并设置`dataType`为"json"以解析返回的JSON数据。当请求成功时,我们在控制台打印出返回的字符串。 **测试与调试** 1. 在浏览器中打开你的HTML页面,...
JSONP,XML和HTML渲染器集成的CORS,安全,Favicon和静态中间件关于gear.Context的更有用的方法来操纵HTTP请求/响应在同一端口上运行HTTP和gRPC 完全支持HTTP / 2.0文献资料进口// package gearimport "github....
- 注意3:app.js 内定义了主模块名:starter (`angular.module('starter'`),构建时编译templates目录下的模板文件时,硬编码使用 starter 模块名,如果需要更改app.js内的主模块名,则需要对应到构建描述文件gulp...
- 因为是纯前端页面,需要模拟TIM的接口调用,可以使用JSONP或者Axios等库进行API请求。 - 在`src/api`目录下创建文件,封装API接口,例如`chat.js`、`users.js` 8. **样式设计**: - 使用CSS预处理器如Sass或...