谈谈jQuery和跨域访问

本文深入讲解了跨域访问的基本原理及实现方式,包括常见的三种跨域解决方案:代理、IFrame和JSONP。重点介绍了JSONP的工作机制和服务端支持方法。


随着产品的不断完善,应用需要部署到不同的服务器上,突然执行某一次请求的时候,浏览器不响应了,才意识到我们也需要跨域访问了。

上网搜索“crossdomain”能找到一大堆东西,可以水准大都很烂,东拼西凑,不知所云。有关跨域访问从原理到应用,写得最好的一篇文章是《Cross-domain communications with JSONP, Part 1: Combine JSONP andjQuery to quickly build powerful mashups》,花点时间读完它,就没什么疑惑了。

 

搬砖头翻译的事情不想干了,梳理几个我觉得重要的地方。

由于浏览器的自身策略,异步请求与页面来源不同域的站点,会引发安全性错误。 一般有三种方法突破这种限制:访问页面所在的站点进行代理;利用IFrame访问不同域的站点;剩下的就是现在主流JSONPJSON with Padding)。

JSONP绝对是个坑爹的名字,其本质就是利用了动态插入JavaScript的原理(DynamicJavaScript Insertion)。浏览器虽然阻止跨域的异步请求,但是在HTML Header中的<script><link>标签可以引用任何来源的文件,我们可以动态创建一个<script>的标签,将它的src设定为异步请求的服务器地址,这样就能跨域请求了。但是这种模式下,浏览器接管了该请求,并处理响应结果。对于浏览器而言,只是通过GET方法试图下载被请求地址的内容,并且认为这是一个js文件,使用JavaScript引擎去执行其中的代码。所以如果要获取响应的结果,那么就要在下载内容中动脑筋,首先响应结果应该被封装成为JSON形式,同时请求发起者还需要提供一个回调函数,供下载完毕后,以响应结果作为参数执行该回调函数。

结合整个过程,我对JSONP是这样理解的:使用JSON填充响应结果。jQuery中的ajax方法对JSONP有很好的支持,甚至无需特别声明,jQuery内部根据请求地址自动判断,如果是跨域的就启动JSONP,如果是本域就是常规的AJAX。但是正因为跨域请求的返回结果不是常规的JSON,所以不仅需要客户端有特殊的方法,服务端也需要对JSONP进行专门的支持:服务端需要知道下载完毕后的回调函数是什么,需要把执行回调函数的JavaScript语句写入到响应流中。

这种专门支持JSONP的服务端被称之为“JSONP Service”,网上能搜索的绝大多数文档,都是谈客户端该怎么调用,没有涉及服务端,所以费了好大的劲才找到门路。

 

下面用一个简单的例子展示跨域请求的过程。

服务端(ASP.NET MVC 3.0

    [HttpGet]
    public ActionResult UserPath(Guid id,String callback)
    {
        String userPath = CreateUserDir(id);
        String output = String.Format("{0}(\"{1}\");", callback, userPath);
        this.Response.Write(output);
        return new HttpStatusCodeResult(200);
    }

首先服务端应该支持HTTPGET方法访问,回调函数应该作为请求的参数之一(如上述示例中的callback),响应流就是符合JavaScript语法规范的字符串,其中必须包含对于回调函数的调用语句。这里的响应结果比较简单,就是一个字符串。

 

客户端(jQuery 1.9

    var url = "http://server2/Pronunciation/UserPath?id=" + studentID + "&callback=?";
    $.getJSON(url, null, function (result) {
        runtime.AddRecordRootPath(result);
    });

客户端可以用jQuery提供的任何AJAX相关的函数,getJSON足够简单,所以推荐一下。示例当中使用了一个匿名函数作为回调函数,所以“callback=?”,如果回调是一个定义好的函数,那么应该为“callback=<functionname>”。

 

方法有点绕,如果理解原理的,也很简单。

 

<think>好的,我现在需要帮这位往届毕业生准备考研复试中关于毕业设计的问题。他的毕设是一个基于SpringBoot的校园二手物品交易平台。首先,我应该分析面试官可能会从哪些方面提问。通常,技术类项目的面试问题会涉及技术选型、实现细节、遇到的问题及解决方案,还有项目的优化亮点。 首先,技术栈部分,他用了SpringBoot、MyBatis、MySQL,前端是Bootstrap加AjaxjQuery。面试官可能会问为什么选择这些技术,比如为什么用SpringBoot而不是SSM框架?这里需要突出SpringBoot的优点,比如简化配置、内嵌服务器、自动装配等。 然后,数据库设计方面,可能会问表结构设计,比如用户表、商品表、订单表的关系,有没有考虑过索引优化或者如何解决高并发下的数据库压力。需要提到数据库的三大范式,索引的使用,以及可能的缓存策略如Redis。 接下来是系统安全,用户密码如何处理?这里应该回答使用加密算法,比如MD5加盐或者更安全的BCrypt,以及防止SQL注入的措施,比如MyBatis的#{}防止注入。 项目亮点难点,需要具体说明,比如实现实时通信可能用WebSocket,或者如何保证事务的一致性,比如使用Spring的事务管理。难点可能包括文件上传、性能优化,或者第三方登录集成,这里要说明解决过程。 功能模块方面,可能会问如何实现商品搜索,是否用了Elasticsearch,或者如何设计商品推荐,可能基于用户浏览历史。如果没有用到高级技术,可以说明未来优化方向。 还有测试部署的问题,比如如何测试,用了什么工具,是否做了压力测试,部署在什么服务器上,如何配置。需要提到JUnit、Postman,可能用Docker或者Nginx做反向代理。 最后,项目的改进点,可以谈谈引入微服务、缓存、分布式架构,或者前端框架的升级,比如Vue或React,提升用户体验。 现在需要确保每个问题都有清晰、具体的回答,展示对技术的理解解决问题的能力。同时,注意表达项目中的个人贡献,突出技术深度自学能力。可能需要提醒用户结合实际项目经验,避免泛泛而谈,用具体例子说明。</think>以下是针对你的毕设项目在考研复试中可能遇到的面试问题及参考答案,按技术模块分类整理: --- ### **一、技术选型与框架** **问题1:为什么选择SpringBoot框架?相比传统SSM框架有哪些优势?** 答案: - SpringBoot内置Tomcat服务器,简化了部署流程,无需单独配置Web容器 - 自动装配机制通过`@SpringBootApplication`注解实现组件自动扫描与配置,减少XML配置量 - 提供Starter依赖管理,例如`spring-boot-starter-web`快速集成Web开发模块 - 与MyBatis整合时,可通过`mybatis-spring-boot-starter`实现零配置数据源绑定 --- ### **二、数据库设计** **问题2:描述核心表结构设计(如用户、商品、订单表),如何保证数据一致性?** 答案: - 用户表(`user`):主键`user_id`、用户名(唯一索引)、加密密码字段(BCrypt算法)、联系方式 - 商品表(`product`):外键`user_id`关联用户表,包含状态字段标识是否已售出 - 订单表(order):外键`product_id``buyer_id`,使用`@Transactional`注解保证下单与库存修改的事务一致性 - 通过MySQL外键约束与Spring声明式事务管理共同维护数据完整性 --- ### **三、系统安全** **问题3:如何保护用户密码安全?如何防御SQL注入?** 答案: - 密码存储:使用`BCryptPasswordEncoder`进行哈希加盐加密,避免明文存储 - SQL注入防护:MyBatis中严格使用`#{}`占位符(自动预编译),禁止`${}`拼接SQL语句 - 补充措施:XSS过滤(如Apache Commons Text的`StringEscapeUtils`处理用户输入) --- ### **四、功能实现细节** **问题4:商品图片上传如何实现?是否考虑过性能优化?** 答案: - 技术方案:通过`MultipartFile`接收文件,使用阿里云OSS或本地路径存储(需配置`application.properties`中的文件存储路径) - 优化措施: - 前端限制上传文件格式(jpg/png)大小(通过`@Size`注解校验) - 缩略图生成:使用Thumbnailator库压缩图片尺寸 - CDN加速静态资源访问(若部署在云服务器) --- ### **五、前端交互** **问题5:Ajax在项目中具体应用场景?遇到过问题吗?如何解决?** 答案: - 应用场景:商品搜索异步加载、订单状态实时更新、点赞/收藏功能的局部刷新 - 问题解决方案: - 后端添加`@CrossOrigin`注解允许特定访问 - 配置Spring Security的CORS规则(示例代码): ```java @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("http://localhost:8080"); //允许前端名 config.addAllowedMethod("*"); //允许所有HTTP方法 source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } ``` --- ### **六、项目优化与扩展** **问题6:如果用户量增加10倍,系统可能遇到哪些瓶颈?如何改进?** 答案: - 潜在瓶颈: - 数据库IO压力大:MySQL读写分离 + 分库分表(ShardingSphere) - 重复查询耗时:引入Redis缓存热点商品数据(使用`@Cacheable`注解) - 并发下单冲突:Redis分布式锁控制库存扣减 - 架构升级:微服务化拆分(商品服务、订单服务独立部署),使用SpringCloud Alibaba组件 --- ### **高频追问方向** 1. **MyBatis与Hibernate对比**:强调MyBatis的SQL灵活性与手动优化空间 2. **BootStrap响应式布局**:使用栅格系统适配移动端,媒体查询(Media Query)实现分辨率适配 3. **项目难点**:可答“交易状态并发控制”,通过数据库乐观锁(版本号机制)解决 --- **建议**:准备1-2个具体Bug解决案例(如事务失效排查、Ajax回调异常),使用STAR法则(情境-任务-行动-结果)描述,能显著提升回答可信度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值