三月份的面试题目
3月份面试题PO出
上周去面试了,本来应该上周未就应该把这些题目都研究下的,但是我落魄了
我面试的是全栈工程师,结果是扑街了。。。。。可能是因为聊天时没发挥好,下次要注意了,要有激情。。。。。
面试内容:
一,浏览器跨域问题怎么解决
先来说说,什么是跨域问题?
什么是跨域?
概念:只要协议、域名、端口有任何一个不同,都被当作是不同的域。
言简意骇吧
来看例子:
URL 说明 是否允许通信
http://www.a.com/a.js
http://www.a.com/b.js 同一域名下 允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js 同一域名下不同文件夹 允许
http://www.a.com:8000/a.js
http://www.a.com/b.js 同一域名,不同端口 不允许
http://www.a.com/a.js
https://www.a.com/b.js 同一域名,不同协议 不允许
http://www.a.com/a.js
http://70.32.92.74/b.js 域名和域名对应ip 不允许
http://www.a.com/a.js
http://script.a.com/b.js 主域相同,子域不同 不允许
http://www.a.com/a.js
http://a.com/b.js 同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js 不同域名 不允许
ps:对于端口和协议的不同,只能通过后台来解决。
为什么不同的域名下面的资源不能访问呢?
答:跨域问题是浏览器同源策略限制,当前域名的js只能读取同域下的窗口属性。
什么情况下会有跨域问题?
答:
当要在A域名的页面中使用js获取其他域名网站的数据时,就会产生跨域问题,比如在网站中使用ajax请求其他网站的天气、快递或者其他数据接口时以及hybrid app中请求数据,浏览器就会提示以下错误。这种场景下就要解决js的跨域问题。
XMLHttpRequest cannot load http://你请求的域名. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://当前页的域名' is therefore not allowed access.
一个网站的网址组成包括协议名,子域名,主域名,端口号。比如 https://github.com/ ,其中https是协议名,www是子域名,github是主域名,端口号是80,当在在页面中从一个url请求数据时,如果这个url的协议名、子域名、主域名、端口号任意一个有一个不同,就会产生跨域问题。
即使是在 http://localhost:80/ 页面请求 http://127.0.0.1:80/ 也会有跨域问题
怎么解决呢
解决跨域问题有以下四种方式
- 使用jsonp
- 服务端代理
- 服务端设置Request Header头中Access-Control-Allow-Origin为 指定可获取数据的域名
使用jsonp
现在问题来了?什么是jsonp?
json≠jsonp
维基百科的定义是:JSONP(JSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料。
JSONP也叫填充式JSON,是应用JSON的一种新方法,只不过是被包含在函数调用中的JSON,例如:
callback({"name","trigkit4"});
JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据。
在js中,我们直接用jquery 的ajax请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。 例如:
<script type="text/javascript">
function dosomething(jsondata){
//处理获得的json数据
}
</script>
<script src="http://example.com/data.html?callback=dosomething"></script>
jsonp解决跨域问题的原理是,浏览器的script标签是不受同源策略限制(你可以在你的网页中设置script的src属性访问服务器中静态文件的路径)。那么就可以使用script标签从服务器获取数据,请求时添加一个参数为callbakc=?,?号是你要执行的回调方法。
服务端返回数据处理
上面说了jsonp的原理是利用script标签来解决跨域,但是script标签是用来获取js代码的,那么我们怎么获取到请求的数据呢。
这就需要服务端做一些判断,当参数中带有callback属性时,返回的type要为application/javascript,把数据作为callback的参数执行。下面是jsonp返回的数据的格式示例:
/**/ dosometing({"code":1,"msg":"success","data":{"test":"test"}});
看看nodejs服务端的代码:
app.get('/jsonp',function (req, res) {
callback = req.query.callback;
// res.set('Content-Type', 'text/javascript');
var javascript = callback +"("+'{"code":1,"msg":"success","data":{"test":"test"}}'+")";
res.send(javascript);
//res.send会根据返回的数据,自动决定返回的type是什么,不需要特别设置,如果非要设置,就通过res.set方法设置
});
设置跨域资源共享(CORS)
CORS(Cross-Origin Resource Sharing)跨域资源共享,定义了必须在访问跨域资源时,浏览器与服务器应该如何沟通。CORS背后的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。
以下是ajax实现:
<script type="text/javascript">
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://第二域名地址/",true);
xhr.send();
</script>
那么服务器要做些什么呢?
服务器端对于CORS的支持,response的header头中设置Access-Control-Allow-Origin为制定可请求当前域名下数据的域名即可。一般情况下设为*即可(也可设置具体可访问的域名)。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。这样客户端就不需要使用jsonp来获取数据。
ps:Access-Control-Allow-Origin属性只有在支持html5规范的浏览器上才有,如果是面向移动终端,基本上所有的浏览器都支持,但是如果是pc端,就要注意,IE10以下是不支持的。
CORS和JSONP对比
CORS与JSONP相比,无疑更为先进、方便和可靠。
JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS)。
服务端代理
服务端代理比较简单,就是原来在浏览器端不支持对不同域名服务器请求获取数据的,直接在本域名所指向的服务端去处理请求不同域名的服务,获取到数据以后,在服务端返回给浏览器。
通过页面的iframe框架设置相同的domain
通过修改document.domain来跨子域
浏览器都有一个同源策略,其限制之一就是第一种方法中我们说的不能通过ajax的方法去请求不同源中的文档。 它的第二个限制是浏览器中不同域的框架之间是不能进行js的交互操作的。
不同的框架之间是可以获取window对象的,但却无法获取相应的属性和方法。比如,有一个页面,它的地址是http://www.example.com/a.html
, 在这个页面里面有一个iframe,它的src是http://example.com/b.html
, 很显然,这个页面与它里面的iframe框架是不同域的,所以我们是无法通过在页面中书写js代码来获取iframe中的东西的:
<script type="text/javascript">
function test(){
var iframe = document.getElementById('ifame');
var win = document.contentWindow;//可以获取到iframe里的window对象,但该window对象的属性和方法几乎是不可用的
var doc = win.document;//这里获取不到iframe里的document对象
var name = win.name;//这里同样获取不到window对象的name属性
}
</script>
<iframe id = "iframe" src="http://example.com/b.html" onload = "test()"></iframe>
这个时候,document.domain就可以派上用场了,我们只要把http://www.example.com/a.html 和 http://example.com/b.html这两个页面的document.domain都设成相同的域名就可以了。但要注意的是,document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。
在页面 http://www.example.com/a.html 中设置document.domain:
<iframe id = "iframe" src="http://example.com/b.html" onload = "test()"></iframe> <script type="text/javascript"> document.domain = 'example.com';//设置成主域 function test(){ alert(document.getElementById('iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象 } </script>
在页面 http://example.com/b.html 中也设置document.domain:
<script type="text/javascript"> document.domain = 'example.com';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同 </script>
修改document.domain的方法只适用于不同子域的框架间的交互。
使用window.name来进行跨域
window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,可以将跨域的数据共享在这个name属性里。但是肯定无法放入太多数据。
使用HTML5的window.postMessage方法跨域
window.postMessage(message,targetOrigin) 方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法
二,cookie和session、 local storage区别
sessionStorage 和 localStorage(又称为DOM Storage) 是HTML5 Web Storage API 提供的,可以方便的在web请求之间保存数据。
有了本地数据,就可以避免数据在浏览器和服务器间不必要地来回传递。
- 共同点:都是保存在浏览器端,且同源的。
- 区别:cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递。而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。
cookies
- 域+path+name 标识
- name+value, 有服务器产生,发回client,保存在client (http 的set-cookies 字段)
- 每次http请求都会发送 Cookies中 “域+path”相同的所有cookie
- 大多数浏览器Cookie最大问为4K
- 浏览器可能还限制了用户计算机存储的cookie数量(如允许每个站点最多存储20个cookies,超过则删除旧的;有些浏览器还对所有站点的cookie总数作出限制,如300)
Local Storage
- 域相关
- 永久保存在本地(client)
- 容量无限制
- 数据不会过期,除非由于security 原因或者用户请求删除
Session Storage
跟Local Storage类似,但Session Storage 只与当前会话相关,浏览器关闭则删除。
其特别之处有:
- top browser context,及在同一个页面内的所有frame/iframe 共享同一个session storage;
- 不同的page 有不同的session storage
- 会话结束即删除
IndexedDB
相对于Local Storage (DOM Storage)来说,IndexedDB 用于客户端的大量的结构化数据存储,Local Storage 属于小数据量存储。
特性包括:
- 一个域一个database
- key-value 方式
- 建立在关系数据模型之上,索引表、游标、事务等概念
满足一些offline web applications 需求
** 这里要强调的是 IndexedDB属于大数据量存储,而Local Storage属于小数据量存储。**
其在WebKit中的实现表现为: LocalStorage 初始化时全部数据被读入内存,其后的操作都针对内存操作,但存在后台同步线程将数据写入sqlite3数据库;因此Local Storage API是同步操作。
但对IndexedDB而言,数据量大,显然不能全部读入内存,采用标注的数据库读写方式,在window中使用的是异步操作方式;只有在worker环境下是同步。
三者的异同
特性 | Cookie | localStorage | sessionStorage |
---|---|---|---|
数据的生命期 | 可设置失效时间,默认是关闭浏览器后失效 | 除非被清除,否则永久保存 | 仅在当前会话下有效,关闭页面或浏览器后被清除 |
存放数据大小 | 4K左右 | 一般为5MB | 一般为5MB |
与服务器端通信 | 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 | 仅在客户端(即浏览器)中保存,不参与和服务器的通信 | 仅在客户端(即浏览器)中保存,不参与和服务器的通信 |
易用性 | 需要程序员自己封装,源生的Cookie接口不友好 | 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 | 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 |
SQL查询问题
姓名 | 学科 | 分数 |
---|---|---|
小明 | 语文 | 79 |
小花 | 数学 | 90 |
小黄 | 英语 | 85 |
小白 | 物理 | 53 |
小红 | 化学 | 62 |
小红 | 语文 | 80 |
小黄 | 数学 | 95 |
小花 | 历史 | 85 |
问:请按分组查询出每个人的所有成绩列表?(列出单个学生所有成绩)
select * from table group by 姓名
分布式事务有几种
什么是分布式事务?
事务
在 J2EE 应用中,事务是一个不可或缺的组件模型,它保证了用户操作的 ACID(即原子、一致、隔离、持久)属性。对于只操作单一数据源的应用,可以通过本地资源接口实现事务管理;对于跨数据源(例如多个数据库,或者数据库与 JMS)的大型应用,则必须使用全局事务 JTA (Java Transaction API)。JTA 为 J2EE 平台提供了分布式事务服务,它隔离了事务与底层的资源,实现了透明的事务管理方式。
事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。关于事务最经典的示例莫过于信用卡转账:将用户 A 账户中的 500 元人民币转移到用户 B 的账户中
分布式事务
现在分布式系统一般由多个独立的子系统组成,多个子系统通过进程间通信(RPC)互相协作配合完成各个功能。有很多用例会跨多个子系统才能完成,比较典型的是电子商务网站的下单支付流程,至少会涉及交易系统和支付系统,而且这个过程中会涉及到事务的概念,即保证交易系统和支付系统的数据一致性。通常我们谈及的事务是指单机资源的ACID属性,所以此处我们称这种跨系统的事务为分布式事务。
为什么需要分布式事务?
保证分布式系统的业务操作结果的一致性
截止到目前有几种常用的分布式事务
本地事务
紧密依赖于底层资源管理器(例如数据库连接 ),事务处理局限在当前事务资源内。此种事务处理方式不存在对应用服务器的依赖,因而部署灵活却无法支持多数据源的分布式事务。如在数据库连接中使用本地事务
分布式事务
Java 事务编程接口(JTA:Java Transaction API)和 Java 事务服务 (JTS:Java Transaction Service) 为 J2EE 平台提供了分布式事务服务接口。
分布式事务(Distributed Transaction)包括事务管理器(Transaction Manager)和一个或多个支持 XA 协议的资源管理器 ( Resource Manager )。我们可以将资源管理器看做任意类型的持久化数据存储;事务管理器承担着所有事务参与单元的协调与控制。JTA 事务有效的屏蔽了底层事务资源,使应用可以以透明的方式参入到事务处理中;但是与本地事务相比,XA 协议的系统开销大,在系统开发过程中应慎重考虑是否确实需要分布式事务。若确实需要分布式事务以协调多个事务资源,则应实现和配置所支持 XA 协议的事务资源,如 JMS、JDBC 数据库连接池等。
spring实现了JTA的事务管理,提供了两种方式去管理事务:
- 编程式事务管理
- 声明式事务管理
JVM内存管理
- GC
- 自动回收机制的工作原理
- 手动编码回收内存
多线程安全与线程问题
java中的线程安全问题
多线程的情况下,可能会导致同时操作的数据出错(简单的加减乘除)同步(synchronized)
- 代码块synchronized声明加锁
- 方法体synchronized声明加锁
单例模式
多线程的使用(两种方法)
- 继承Thread或者new
- 实现Runable
ps:
ArrayList – 线程不安全
Vector – 线程安全
**注意:
线程安全或者不安全是针对多个线程同时操作一个对象数据而产生的问题,而不是某个类本身是否线程安全
**
哪些情况会导致系统内存崩溃?怎么避免?
- 频繁读写磁盘
- 海量数据运算
- 频繁读写数据库
- 服务器访问压力
web cache,server cache,应用分布式,文件查询索引,数据库分库