面试题总结68-102

68. 说一下 session 的工作原理?
    一、session的概念及特点
  session概念:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。
    说白了session就是一种可以维持服务器端的数据存储技术。session主要有以下的这些特点:
    session保存的位置是在服务端
    session一般来说要配合cookie使用,如果用户浏览器禁用了cookie,那么只能使用URL重写来实现session的存储功能
    单纯的使用session来存储用户回话信息,那么当用户量较多时,session文件数量会很多,会存在session查询慢的问题
    本质上:session技术就是一种基于后端有别于数据库的临时存储技术
    二、为什么要使用session
  我们目前使用的互联网应用层协议基本上都是基于 HTTP 和 HTTPS 的,它们的本身是无状态的, 只负责请求和响应。 
    我告诉服务器我需要什么,服务器返回给我相应的资源。 如果没有额外处理的话, 服务器是不知道你是谁,
    更无法根据你是谁给你展现和你相关的内容了。HTTP 协议一开始被设计成这样还是有一些历史原因的,当时的互联网多用于学术交流,
    只用于文章信息的展现之类的事情,远没有现在这么丰富多彩。所以在当时的背景下 HTTP 协议被设计成这样其实也是很符合它的场景的。
    但随着互联网应用越来越广泛,应用的形式也变得越来越多,我们的 Web 应用不只限于提供简单的信息展现了,还需要用户能够登录,
    可以在论坛发帖子,在购物网站买东西等等。 这就需要 HTTP 协议能够记录用户的状态。也就是我们现在熟悉的 Session 由来。
    三、session的工作原理
    用户第一次请求服务器时,服务器端会生成一个sessionid
    服务器端将生成的sessionid返回给客户端,通过set-cookie
    客户端收到sessionid会将它保存在cookie中,当客户端再次访问服务端时会带上这个sessionid
    当服务端再次接收到来自客户端的请求时,会先去检查是否存在sessionid,不存在就新建一个sessionid重复1,2的流程,
    \如果存在就去遍历服务端的session文件,找到与这个sessionid相对应的文件,文件中的键值便是sessionid,值为当前用户的一些信息
    此后的请求都会交换这个 Session ID,进行有状态的会话。
    四、session的生命周期
    Session何时生效:
    Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,
    只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
    Session何时失效:
    1.服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。
    从session不活动的时候开始计算,如果session一直活动,session就总不会过期。从该Session未被访问,开始计时; 一旦Session被访问,计时清0;
    2.调用Session的invalidate方法
    HttpSession session = request.getSession();
    session.invalidate();//注销该request的所有session
    4.设置session的失效时间
    a)web.xml中
    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>
    b)在程序中手动设置
    session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期
    request.getSession().setMaxInactiveInterval(-1);//永不过期
    c)tomcat也可以修改session过期时间,在server.xml中定义context时采用如下定义:
    <Context path="/livsorder" 
    docBase="/home/httpd/html/livsorder"   defaultSessionTimeOut="3600" 
    isWARExpanded="true"   
    isWARValidated="false" isInvokerEnabled="true"   isWorkDirPersistent="false"/>
    5.关闭浏览器,session就会失效
    五、session的性能瓶颈
      另外一个要聊聊的就是 Session 数据的存储。 通常情况下,如果你不明确的设置, 大多数 Web 框架会把 Session 数据存放到内存中。
    如果你的 Web 应用用户量不大的话,这也不成问题。 但如果你的用户数比较大的话,就可能发生一个事情 — 内存不够用了。
    这很正常,内存容量是非常宝贵的,假设每个用户的 Session 数据是 100K, 1万个用户就会大概占用 1G 的存储空间,
    如果你的 Session 数据清理机制也恰巧比较慢的话,内存非常容易被占满。这就需要你在设计比较大并发量的站点时,
    要考虑 Session 的存储方式,比如把它们保存到硬盘文件系统中,或者数据库中。 所以你在开发一个 Web 应用的时候,
    如果你的用户量很大,你需要有这个意识。另外 Session 放到内存中还有一个弊端,如果你的 Web 服务器发生重启,
    那么所有的 Session 状态都会被情况,会在一定程度上影响用户体验。

69. 如果客户端禁止 cookie 能实现 session 还能用吗?
    一般默认情况下,在会话中,服务器存储 session 的 sessionid 是通过 cookie 存到浏览器里。
    如果浏览器禁用了 cookie,浏览器请求服务器无法携带 sessionid,服务器无法识别请求中的用户身份,session失效。
    但是可以通过其他方法在禁用 cookie 的情况下,可以继续使用session。
    通过url重写,把 sessionid 作为参数追加的原 url 中,后续的浏览器与服务器交互中携带 sessionid 参数。
    服务器的返回数据中包含 sessionid,浏览器发送请求时,携带 sessionid 参数。
    通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设置携带该 header 字段。
?
70. springMVC 和 struts 的区别是什么?
    SpringMVC:
    ???我们的springmvc是一个优秀的控制层mvc框架,它是spring的一部分,可以简化我们的web开发,其本质是一个DispatcherServlet.
    主要有五个部分组成,前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、
    视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器( Validator)、命令对象(Command 请求参数绑定到的对象就叫命令对象)、
    表单对象分工明确,而且扩展点相当灵活,可以很容易扩展,具有可适配,可定制性等特点,HandlerMapping、ViewResolver等能够非常简单的定制,
    功能强大的数据验证、格式化、绑定机制,强大的JSP标签库,使JSP编写更容易.还有比如RESTful风格的支持、简单的文件上传.
    springmvc与struts2不同
    springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
    springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),
    struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
    Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,
    并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
    springmvc与struts2有什么区别?
    1. 底层实现机制
    struts2:filter
    springmvc:servlet
    2. 运行效率
    struts2:底层是Servlet,参数基于属性封装,如果配置单例,会出现线程安全问题,所以配置多例
    springmvc:底层是Servlet,单例
    3. 参数封装
    struts2:基于属性封装
    springmvc:基于方法进行封装

71. 如何避免 SQL 注入?
    sql注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作
    1.严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害; 
    2检查输入的数据是否具有所期望的数据格式,严格限制变量的类型 ;
    3.对进入数据库的特殊字符(’”\尖括号&*;等)进行转义处理,或编码转换。

72. 什么是 XSS 攻击,如何避免?
    XSS 攻击:即跨站脚本攻击,它是 Web 程序中常见的漏洞。原理是攻击者往 Web 页面里插入恶意的脚本代码(css 代码、Javascript 代码等),
    当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的,如盗取用户 cookie、破坏页面结构、重定向到其他网站等。
    预防 XSS 的核心是必须对输入的数据做过滤处理。
    什么是XSS攻击?
    XSS攻击全称跨站脚本攻击,是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
    XSS攻击有哪几种类型?
    常见的 XSS 攻击有三种:反射型XSS攻击、DOM-based 型XXS攻击以及存储型XSS攻击。
    1.反射型XSS攻击
    反射型 XSS 一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,
    恶意代码会直接在受害者主机上的浏览器执行。反射型XSS通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
    2.存储型XSS攻击
    也叫持久型XSS,主要将XSS代码提交存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。
    当目标用户访问该页面获取数据时,XSS代码会从服务器解析之后加载出来,返回到浏览器做正常的HTML和JS解析执行,XSS攻击就发生了。
    存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。
    3.DOM-based 型XSS攻击
    基于 DOM 的 XSS 攻击是指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。DOM 型 XSS 攻击中,
    取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞。
    如何防御XSS攻击?
    1. 对输入内容的特定字符进行编码,例如表示 html标记的 < > 等符号。
    2. 对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。
    3. 将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。
    4. 不要使用 Eval来解析并运行不确定的数据或代码,对于 JSON解析请使用 JSON.parse() 方法。
    5. 后端接口也应该要做到关键字符过滤的问题。
73. 什么是 CSRF 攻击,如何避免?
    CSRF:Cross Site Request Forgery(跨站点请求伪造)。
    CSRF 攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。
    CSRF 攻击实例:
        CSRF 攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作。
        比如说,受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 
        可以使 Bob 把 1000000 的存款转到 bob2 的账号下。通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的 session,
        并且该 session 的用户 Bob 已经成功登陆。黑客 Mallory 自己在该银行也有账户,他知道上文中的 URL 可以把钱进行转帐操作。
        Mallory 可以自己发送一个请求给银行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。
        但是这个请求来自 Mallory 而非 Bob,他不能通过安全认证,因此该请求不会起作用。这时,Mallory 想到使用 CSRF 的攻击方式,
        他先自己做一个网站,在网站中放入如下代码: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”,
        并且通过广告等诱使 Bob 来访问他的网站。当 Bob 访问该网站时,上述 url 就会从 Bob 的浏览器发向银行,
        而这个请求会附带 Bob 浏览器中的 cookie 一起发向银行服务器。大多数情况下,该请求会失败,因为他要求 Bob 的认证信息。
        但是,如果 Bob 当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的 session 尚未过期,浏览器的 cookie 之中含有 Bob 的认证信息。
        这时,悲剧发生了,这个 url 请求就会得到响应,钱将从 Bob 的账号转移到 Mallory 的账号,而 Bob 当时毫不知情。
        等以后 Bob 发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。
        而 Mallory 则可以拿到钱后逍遥法外。
    避免方法:
    CSRF 漏洞进行检测的工具,如 CSRFTester、CSRF Request Builder...
    验证 HTTP Referer 字段
    添加并验证 token
    添加自定义 http 请求头
    敏感操作添加验证码
    使用 post 请求

异常
74. throw 和 throws 的区别?
    throw:
    表示方法内抛出某种异常对象
    如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 或者 在方法体内 try catch 处理该异常,否则编译报错
    执行到 throw 语句则后面的语句块不再执行
    throws:
    方法的定义上使用 throws 表示这个方法可能抛出某种异常
    需要由方法的调用者进行异常处理

75. final、finally、finalize 有什么区别?
    一、final :
    1、修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生新的子类,不能作为父类被继承。
    因此一个类不能及被声明为abstract,又被声明为final的。
    2、将变量或方法声明为final,可以保证他们使用中不被改变。被声明为final的变量必须在声明时给定初值,而以后的引用中只能读取,
    不可修改,被声明为final的方法也同样只能使用,不能重载。
    二、finally:
    在异常处理时提供finally块来执行清楚操作。如果抛出一个异常,那么相匹配的catch语句就会执行,然后控制就会进入finally块,如果有的话。
    三、finalize:
    是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。这个方法是在垃圾收集器在确定了,
    被清理对象没有被引用的情况下调用的。
    finalize是在Object类中定义的,因此,所有的类都继承了它。子类可以覆盖finalize()方法,来整理系统资源或者执行其他清理工作。

76. try-catch-finally 中哪个部分可以省略?
    catch 和 finally 语句块可以省略其中一个。

77. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
    会执行,在return 前执行

78. 常见的异常类有哪些?
异常非常多,Throwable 是异常的根类。
Throwable 包含子类 错误-Error 和 异常-Exception 。
Exception 又分为 一般异常和运行时异常 RuntimeException。
运行时异常不需要代码显式捕获处理。
下图是常见异常类及其父子关系:
Throwable
|  ├ Error??
|  │ ├ IOError
|  │ ├ LinkageError
|  │ ├ ReflectionError
|  │ ├?ThreadDeath
|  │?└?VirtualMachineError
|  ├ Exception??
|  │ ├?CloneNotSupportedException
|  │ ├?DataFormatException
|  │ ├?InterruptedException
|  │ ├?IOException
|  │ ├?ReflectiveOperationException
|  │ ├ RuntimeException?
|  │? ? ├?ArithmeticException
|  │? ? ├?ClassCastException
|  │? ? ├?ConcurrentModificationException
|  │? ? ├?IllegalArgumentException
|  │? ? ├?IndexOutOfBoundsException
|  │? ? ├?NoSuchElementException
|  │? ? ├?NullPointerException
|  │ └ SecurityException
|  │ └??SQLException

网络
79. http 响应码 301 和 302 代表的是什么?有什么区别?
    301 Moved Permanently
        被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。
        如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
    302 Found
        请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
        只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
        当网站迁移或url地址进行调整时,服务端需要重定向返回,保证原请求自动跳转新的地址。
        http 协议的 301 和 302 状态码都代表重定向。浏览器请求某url收到这两个状态码时,
        都会显示和跳转到 Response Headers 中的Location。即在浏览器地址输入 url A,却自动跳转到url B。

80. forward 和 redirect 的区别?
    1、请求方不同
    redirect:客户端发起的请求
    forward:服务端发起的请求
    2、浏览器地址表现不同
    redirect:浏览器地址显示被请求的
    urlforward:浏览器地址不显示被请求的url
    3、参数传递不同
    redirect:重新开始一个request,原页面的request生命周期结束。
    forward:forward另一个连接的时候。request变量是在其生命周期内的。另一个页面也可以使用,其实质是把目标地址include。 
    4、底层运作不同
    redirect:发送的请求信息又回送给客户机,让客户机再转发到另一个资源上,需要在服务器和客户机之间增加一次通信。
    forward:服务器端直接找到目标,并include过来。
    5、定义不同
    直接转发方式(Forward):客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,
    由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
    间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

81. 简述 tcp 和 udp的区别?
    UDP 是面向无连接的通讯协议,UDP 数据包括目的端口号和源端口好信息。
    优点 : udp 速度快 ,操作简单 要求系统资源较少,由于通讯不需要连接,可以实现广播发送
    缺点: udp 传送 数据前并不与对方建立连接,对接收的数据也不发送确认信号,发送端也不知道数据是否会正确接收,也不会重复发送 ,不可靠
    tcp :是面向接收的通讯协议,通过三次握手建立连接,通讯完成四次挥手
    优点; tcp 在数据传递时,有确认,窗口、重传、阻塞等控制机制, 能保证数据正确性,较为可靠
    缺点 :tcp 相对于udp 速度慢,要求系统资源较多

82. tcp 为什么要三次握手,两次不行吗?为什么?
    两次握手只能保证单向连接是畅通的。
    Step1? ? ???A -> B : 你好,B。
    Step2? ? ? ?A <- B?: 收到。你好,A。
    这样的两次握手过程,?A 向?B 打招呼得到了回应,即 A 向 B 发送数据,B 是可以收到的。
    但是 B 向 A 打招呼,A 还没有回应,B 没有收到 A 的反馈,无法确保 A 可以收到 B 发送的数据。
    只有经过第三次握手,才能确保双向都可以接收到对方的发送的 数据。
    Step3? ? ? ?A -> B : 收到,B。
    这样 B 才能确定 A 也可以收到 B 发送给 A 的数据。

83. 说一下 tcp 粘包是怎么产生的?
    1、什么是 tcp 粘包?
    发送方发送的多个数据包,到接收方缓冲区首尾相连,粘成一包,被接收。
    2、原因
    TCP 协议默认使用?Nagle 算法可能会把多个数据包一次发送到接收方。
    应用程读取缓存中的数据包的速度小于接收数据包的速度,缓存中的多个数据包会被应用程序当成一个包一次读取。
    3、处理方法
    发送方使用 TCP_NODELAY 选项来关闭 Nagle 算法
    数据包增加开始符和结束,应用程序读取、区分数据包。
    在数据包的头部定义整个数据包的长度,应用程序先读取数据包的长度,然后读取整个长度的包字节数据,保证读取的是单个包且完整。

84. OSI 的七层模型都有哪些?


85. get 和 post 请求有哪些区别?
    在浏览器进行回退操作时,get请求是无害的,而post请求则会重新请求一次
    get请求参数是连接在url后面的,而post请求参数是存放在requestbody内的
    get请求因为浏览器对url长度有限制(不同浏览器长度限制不一样)对传参数量有限制,
    而post请求因为参数存放在requestbody内所以参数数量没有限制(事实上get请求也能在requestbody内携带参数,
    只不过不符合规定,有的浏览器能够获取到数据,而有的不能)
    因为get请求参数暴露在url上,所以安全方面post比get更加安全
    get请求浏览器会主动cache,post并不会,除非主动设置
    get请求参数会保存在浏览器历史记录内,post请求并不会
    get请求只能进行url编码,而post请求可以支持多种编码方式
    get请求产生1个tcp数据包,post请求产生2个tcp数据包
    浏览器在发送get请求时会将header和data一起发送给服务器,服务器返回200状态码,而在发送post请求时,
    会先将header发送给服务器,服务器返回100,之后再将data发送给服务器,服务器返回200 OK

86. 如何实现跨域?
    跨域:当浏览器执行脚本时会检查是否同源,只有同源的脚本才会执行,如果不同源即为跨域。
    这里的同源指访问的协议、域名、端口都相同。
    同源策略是由 Netscape 提出的著名安全策略,是浏览器最核心、基本的安全功能,它限制了一个源中加载脚本与来自其他源中资源的交互方式。
    Ajax 发起的跨域 HTTP 请求,结果被浏览器拦截,同时 Ajax 请求不能携带与本网站不同源的 Cookie。
    <script> <img> <iframe> <link> <video> <audio> 等带有 src 属性的标签可以从不同的域加载和执行资源。?
    如当使用 ajax 提交非同源的请求时,浏览器就会阻止请求。提示
    Access to XMLHttpRequest at '...' from origin '...' has been blocked by CORS policy: 
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    如何实现跨域请求呢?
    1、jsonp
    利用了 script 不受同源策略的限制
    缺点:只能 get 方式,易受到 XSS攻击
    2、CORS(Cross-Origin Resource Sharing),跨域资源共享
    当使用XMLHttpRequest发送请求时,如果浏览器发现违反了同源策略就会自动加上一个请求头 origin;
    后端在接受到请求后确定响应后会在后端在接受到请求后确定响应后会在 Response Headers 中加入一个属性 Access-Control-Allow-Origin;
    浏览器判断响应中的 Access-Control-Allow-Origin 值是否和当前的地址相同,匹配成功后才继续响应处理,否则报错
    缺点:忽略 cookie,浏览器版本有一定要求
    3、代理跨域请求
    前端向发送请求,经过代理,请求需要的服务器资源
    缺点:需要额外的代理服务器
    4、Html5 postMessage 方法
    允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本、多窗口、跨域消息传递
    缺点:浏览器版本要求,部分浏览器要配置放开跨域限制
    5、修改 document.domain 跨子域
    相同主域名下的不同子域名资源,设置 document.domain 为 相同的一级域名
    缺点:同一一级域名;相同协议;相同端口
    6、基于 Html5 websocket 协议
    websocket 是 Html5 一种新的协议,基于该协议可以做到浏览器与服务器全双工通信,允许跨域请求
    缺点:浏览器一定版本要求,服务器需要支持 websocket 协议
    7、document.xxx + iframe
    通过 iframe 是浏览器非同源标签,加载内容中转,传到当前页面的属性中
    缺点:页面的属性值有大小限制

87. 说一下 JSONP 实现原理?
    该协议的一个要点就是允许用户传递一个callback参数给服务器,然后服务器返回数据时会将这个
    callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回的数据了。
    这里针对ajax与jsonp的异同再做一些补充说明: 
    1、ajax和jsonp这两种技术在调用方式上"看起来"很像,目的也一样,都是请求一个url,
    然后把服务器返回的数据进行处理,因此jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装。 
    2、但ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,
    而jsonp的核心则是动态添加script标签来调用服务器提供的js脚本。 
    3、所以说,其实ajax与jsonp的区别不在于是否跨域,ajax通过服务端代理一样可以实现跨域,
    jsonp本身也不排斥同域的数据的获取。 
    4、还有就是,jsonp是一种方式或者说非强制性协议,如同ajax一样,它也不一定非要用json格式来传递数据,
    如果你愿意,字符串都行,只不过这样不利于用jsonp提供公开服务。 
    总而言之,jsonp不是ajax的一个特例,哪怕jquery等巨头把jsonp封装进了ajax,也不能改变这一点!

设计模式
88. 说一下你熟悉的设计模式?
    工厂模式 、 单例模式 、适配器模式 、装饰者模式(ava中的IO流) 、观察者模式 、


89. 简单工厂和抽象工厂有什么区别?
    简单工厂模式
    是由一个工厂对象创建产品实例,简单工厂模式的工厂类一般是使用静态方法,通过不同的参数的创建不同的对象实例
    可以生产结构中的任意产品,不能增加新的产品
    抽象工厂模式
    提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类,生产多个系列产品
    生产不同产品族的全部产品,不能新增产品,可以新增产品族

Spring/Spring MVC
90. 为什么要使用 spring?
    1.方便解耦,便于开发(Spring就是一个大工厂,可以将所有对象的创建和依赖关系维护都交给spring管理)
    2.spring支持aop编程(spring提供面向切面编程,可以很方便的实现对程序进行权限拦截和运行监控等功能)
    3.声明式事务的支持(通过配置就完成对事务的支持,不需要手动编程)
    4.方便程序的测试,spring 对junit4支持,可以通过注解方便的测试spring 程序
    5.方便集成各种优秀的框架()
    6.降低javaEE API的使用难度(Spring 对javaEE开发中非常难用的一些API 例如JDBC,javaMail,远程调用等,都提供了封装,是这些API应用难度大大降低)

91. 解释一下什么是 aop?
    在运行时,动态的将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。AOP即面向切面编程。
    使用切面编程,可以将一些系统性的代码提取出来,独立实现,与核心业务代码剥离,比如权限管理、事务管理、日志记录等等。
    AOP是spring提供的关键特性之一。

92. 解释一下什么是 ioc?
    IOC,即控制反转,具体介绍如下。
    1、定义:控制反转(Inversion of Control,英文缩写为IoC)把创建对象的权利交给框架,是框架的重要特征,
    并非面向对象编程的专用术语。它包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。
    2、IOC最大zhidao的好处是:
    因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般内这样的对象都是实现于某种接口的),
    只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点像USB接口和SCSI硬盘了)。
    3、IOC最大的缺点是:
    (1)生成一个对象的步骤变复杂了(事实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。
    (2)对象生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,
    除非某对象的生成对效率要求特别高。
    (3)缺少IDE重构操作的容支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺陷所在。

93. spring 有哪些主要模块?
    Spring框架的七大模块
    1. Spring Core
    框架的最基础部分,提供 IoC 容器,对 bean 进行管理。
    2.Spring Context
    基于 bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。
    3.Spring DAO
    提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码,还提供了声明性事务管理方法。
    4.Spring ORM
    提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate、MyBatis 等。
    5.Spring AOP
    提供了符合AOP Alliance规范的面向方面的编程实现。
    6.Spring Web
    提供了基础的 Web 开发的上下文信息,可与其他 web 进行集成。
    7.Spring Web MVC
    提供了 Web 应用的 Model-View-Controller 全功能实现。

94. spring 常用的注入方式有哪些?
    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入。

95. spring 中的 bean 是线程安全的吗?
    Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,
    但是具体还是要结合具体scope的Bean去研究。
    Spring 的 bean 作用域(scope)类型
    1、singleton:单例,默认作用域。
    2、prototype:原型,每次创建一个新对象。
    3、request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。
    4、session:会话,同一个会话共享一个实例,不同会话使用不用的实例。
    5、global-session:全局会话,所有会话共享一个实例。
    线程安全这个问题,要从单例与原型Bean分别进行说明。
    原型Bean
    对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。
    单例Bean
    对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。
    如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。
    比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。
    对于有状态的bean,Spring官方提供的bean,一般提供了通过ThreadLocal去解决线程安全的方法,
    比如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等。
    注: Spring容器本身并没有提供线程安全的策略,因此是否线程安全完全取决于Bean本身的特性。
    使用ThreadLocal的好处
    使得多线程场景下,多个线程对这个单例Bean的成员变量并不存在资源的竞争,因为ThreadLocal为每个线程保存线程私有的数据。

96. spring 支持几种 bean 的作用域?
    singleton:单例模式,在整个Spring IoC容器中,使用 singleton 定义的 bean 只有一个实例
    prototype:原型模式,每次通过容器的getbean方法获取 prototype 定义的 bean 时,都产生一个新的 bean 实例
    只有在 Web 应用中使用Spring时,request、session、global-session 作用域才有效
    request:对于每次 HTTP 请求,使用 request 定义的 bean 都将产生一个新实例,即每次 HTTP 请求将会产生不同的 bean 实例。
    session:同一个 Session 共享一个 bean 实例。
    global-session:同 session 作用域不同的是,所有的Session共享一个Bean实例。

97. spring 自动装配 bean 有哪些方式?
    default - 默认的方式和 "no" 方式一样
    no - 不自动装配,需要使用 <ref />节点或参数
    byName - 根据名称进行装配
    byType - 根据类型进行装配
    constructor - 根据构造函数进行装配

98. spring 事务实现方式有哪些?
    编程式事务管理,在代码中调用 commit()、rollback()等事务管理相关的方法
    基于 TransactionProxyFactoryBean 的声明式事务管理
    基于注解 @Transactional 的声明式事务管理
    基于 Aspectj AOP 配置(注解)事务

99. 说一下 spring 的事务隔离?
    读操作未提交(Read Uncommitted):说明一个事务在提交前,其变化对于其他事务来说是可见的。
    这样脏读、不可重读和幻读都是允许的。当一个事务已经写入一行数据但未提交,其他事务都不能再写入此行数据
    ;但是,任何事务都可以读任何数据。这个隔离级别使用排写锁实现。
    读操作已提交(Read Committed):读取未提交的数据是不允许的,它使用临时的共读锁和排写锁实现。
    这种隔离级别不允许脏读,但不可重读和幻读是允许的。
    可重读(Repeatable Read):说明事务保证能够再次读取相同的数据而不会失败。此隔离级别不允许脏读和不可重读,但幻读会出现。
    可串行化(Serializable):提供最严格的事务隔离。这个隔离级别不允许事务并行执行,只允许串行执行。这样,脏读、不可重读或幻读都可发生。

100. 说一下 spring mvc 运行流程?
    第一步:发起请求到前端控制器(DispatcherServlet)
    第二步:前端控制器请求HandlerMapping查找 Handler
             可以根据xml配置、注解进行查找
    第三步:处理器映射器HandlerMapping向前端控制器返回Handler
    第四步:前端控制器调用处理器适配器去执行Handler
    第五步:处理器适配器去执行Handler
    第六步:Handler执行完成给适配器返回ModelAndView
    第七步:处理器适配器向前端控制器返回ModelAndView
             ModelAndView是springmvc框架的一个底层对象,包括Model和view
    第八步:前端控制器请求视图解析器去进行视图解析
             根据逻辑视图名解析成真正的视图(jsp)
    第九步:视图解析器向前端控制器返回View
    第十步:前端控制器进行视图渲染
             视图渲染将模型数据(在ModelAndView对象中)填充到request域
    第十一步:前端控制器向用户响应结果

101. spring mvc 有哪些组件?
    前端控制器(DispatcherServlet)?
    处理器映射器(HandlerMapping)?
    处理器适配器(HandlerAdapter)?
    拦截器(HandlerInterceptor)
    语言环境处理器(LocaleResolver)
    主题解析器(ThemeResolver)
    视图解析器(ViewResolver)?
    文件上传处理器(MultipartResolver)
    异常处理器(HandlerExceptionResolver)?
    数据转换(DataBinder)
    消息转换器(HttpMessageConverter)
    请求转视图翻译器(RequestToViewNameTranslator)
    页面跳转参数管理器(FlashMapManager)
    处理程序执行链(HandlerExecutionChain)?

102. @RequestMapping 的作用是什么?
    @RequestMapping是一个用来处理请求地址映射的注解,可用于类或者方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
    @RequestMapping注解有六个属性,下面进行详细的说明。
    1.value, method
    value:指定请求的实际地址,指定的地址可以是URI Template模式。
    method:指定请求的method类型,GET、POST、PUT、DELETE等。
    2.consumes, produces
    consumes:指定处理请求的提交内容类型(Content-Type),例如application/json,text/html。
    produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。
    3.params, headers
    params:指定request中必须包含某些参数值才让该方法处理。
    headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

103. @Autowired 的作用是什么?
    @Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。
    @Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。

上一篇:Erlang 之父 Joe Armstrong 逝世,享年 68 岁


下一篇:Jmeter系列(68)- BeanShell 内置变量 prev