基础知识点四

四、反射

57.什么是反射?

反射机制指的是程序运行状态中,对于任意一个类,都能够知道这个类的属性和方法

58.什么是 java 序列化?什么情况下需要序列化?

序列化是把java对象字节序列,可以对对象进行读写操作;序列化作用:对象可以作为文件永久保存硬盘上;对象可以在网络上传输

59.动态代理是什么?有哪些应用?

动态代理是给实现了某个接口的类的方法,加一些额外的处理;spring的AOP,加事务,加权限,加日志。

60.怎么实现动态代理?

1、原生JDK,必须借助接口才能产生代理对象;2、CGLIB动态代理,不需要接口

五、对象拷贝

61.为什么要使用克隆?

想对一个对象进行处理,又想保留原有的数据进行接下来的操作

62.如何实现对象克隆?

两种方式:1、实现Cloneable接口并重写object类中的clone()方法;2、实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

63.深拷贝和浅拷贝区别是什么?

浅拷贝只是复制了对象的引用地址,两个对象指向同一内存地址,所以其中一个改变值,另一个也相应改变;

深拷贝是将对象及值复制过来,修改其中一个,另一个值不会变。

六、Java Web

64.jsp 和 servlet 有什么区别?

1、jsp编译后变成servlet;2、jsp更擅长于页面显示,servlet更擅长于逻辑控制;3、servlet没有内置对象,jsp内置对象都是通过HttpServletRequest和HttpServletResponse以及HttpServlet对象

65.jsp 有哪些内置对象?作用分别是什么?

request:表示HttpServletRequest对象,可以获取浏览器请求的数据

response:表示HttpServletResponse对象,可以设置浏览器响应数据

out:对象是javax.jsp.JspWriter的一个实例,用于向浏览器回送输出数据

pageContext:表示一个javax.servlet.jsp.PageContext对象。该对象提供了对JSP页面内所有的对象及名字空间(就是四大作用域空间,如page空间、request空间、session空间、application空间)的访问,也就是说他可以访问到当前请求对应session中保存的信息,也可以取当前应用所在的application的某一属性值,它相当于页面中所有功能的集大成者,包装了通用的servlet相关功能的方法。

session:表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息

applicaton:表示一个javax.servle.ServletContext对象。类似于系统的全局变量,用于实现Web应用中的资源共享。

config:表示一个javax.servlet.ServletConfig对象。用于存放JSP编译后的初始数据。

page:表示从该页面产生的一个servlet实例,JSP网页本身

exception:针对错误网页,未捕捉的例外。表示JSP页面运行时产生的异常和错误信息,该对象只有在错误页面(page指令中设定isErrorPage为true的页面)中才能够使用。

66.说一下 jsp 的 4 种作用域?

page:仅可被当前响应jsp页面访问、request:同一个请求所有的servlet和jsp页面访问、session:同一个会话所有的servlet和jsp页面访问、application:同一个web应用所有的servlet和jsp页面访问;

67.session 和 cookie 有什么区别?

session机制是一种服务器端的机制,使用类似于散列表的结构保存信息;

cookie数据存放在客户的浏览器上,不安全,别人可以分析存放在本地的cookie并进行cookie欺骗,单个cookie数据不能超过4K

68.说一下 session 的工作原理?

session内容是保存在服务器端,通常是保存在内存中,也可以保存在文件或数据库,客户端跟服务端通过sessionId关联,sessionId通常以Cookie的形式存储在客户端。每次HTTP请求,sessionId会随着Cookie传递到服务器端,服务器就可以通过sessionId取得对应信息

69.如果客户端禁止 cookie 能实现 session 还能用吗?

还能用,通常sessionId均由Cookie负责保存,HTTP交互除了cookie可以携带信息,URL也可以,或者表单隐藏字段

70.spring mvc 和 struts 的区别是什么?

1、拦截机制不同。

    struts2是类级别的拦截,每次请求就会创建一个Action,和spring整合时struts2的ActionBean注入作用域是原型模式prototype,通过setter,getter把request数据注入到属性。springMVC是方法级别的拦截,一个方法对应一个request上下文,所以方法基本上独立、独享request和response,默认是单例模型,所以线程安全

2、底层框架不一样

  struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC采用servlet(DispatcherServlet)实现。Filter在容器启动之后即初始化;服务停止以后销毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

3、性能方面

  struts2是类级别拦截,每次请求对应生成一个新的实例action,需要所有属性值注入。而SpringMVC实现了零配置,SpringMVC是基于方法的拦截,有加载一次单例模式bean注入,所以SpringMVC比struct2性能更佳

4、配置方面

  SpringMVC与spring是无缝的,项目的管理和安全性上也比struct2高

71.如何避免 sql 注入?

1、使用prepareStatement代替statement,2、使用正则表达式过滤传入的参数

72.什么是 XSS 攻击,如何避免?

XSS夸站脚本攻击,其恶意脚本都是来自于用户的输入,所以可以对用户的输入进行过滤。

1、获取用户文本,使用innerText不使用innerHTML。2、对特殊符号& < > " ' / 等符号进行转义成 &amp &lt &gt &quot &#x27 &#x2F;

73.什么是 CSRF 攻击,如何避免?

CsRF夸站请求伪造,攻击者通过伪造用户浏览器的请求,向访问一个用户曾经认证访问过的网站发送伪造请求,是目标网站误认为是用户的真实操作而执行命令。

如何防范:

1、验证HTTP Referer字段,HTTP头中的Referer字段记录了该 HTTP 请求的来源地址。2、请求地址中添加token并验证。3、HTTP头自定义属性并验证

七、异常

74.throw 和 throws 的区别?

throw是抛出一个具体的异常类型;throws是声明方法可能抛出所有异常信息,是将异常往上传

75.final、finally、finalize 有什么区别?

final用来修饰类、方法或变量;finally作为异常处理的一部分,只能用在try/catch语句中;finalize是Object类的一个方法,也就是每个类都有这个方法,对象被回收时调用该方法

76.try-catch-finally 中哪个部分可以省略?

finally部分可以省略

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

一定执行

78.常见的异常类有哪些?

NullPointerException、IOException、ClassNotFoundeException、ArrayIndexOutOfBoundsException、FileNotFoundeException、NoSuchMethodException

八、网络

79.http 响应码 301 和 302 代表的是什么?有什么区别?

301代表永久性转移;302代表暂时性转移;区别:

1、301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;

2、302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。

80.forward 和 redirect 的区别?

forward直接转发方式(服务器内部重定向):客户端和浏览器只发一次请求;redirect间接转发,服务器收到请求后发送一个状态头给浏览器,浏览器将再次请求一次

81.简述 tcp 和 udp的区别?

1、TCP面向连接;UDP是无连接;2、TCP提供可靠服务,无差错,不丢失,不重复,且按序到达(TCP通过校验和、重传控制、序号标识、滑动窗口、确认应答实现可靠传输);UDP尽最大努力交付,即不保证可靠交付;3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通讯或广播通讯;4、每一条TCP连接只能是点到点的,UDP支持一对一,一对多,多对一和多对多的交互通讯;5、TCP对系统资源要求较多,UDP对系统资源要求较少。

82.tcp 为什么要三次握手,两次不行吗?为什么?

为了防止已失效的连接请求报文段突然又传送到服务端,因而产生错误。

发生错误情况:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送ack包。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。

83.说一下 tcp 粘包是怎么产生的?

tcp粘包是指若干包数据粘成一包;1、发送发原因,TCP默认使用Nagle算法,Nagle算法主要做两件事:1)只有上一个分组得到确认,才会发送下一个分组;2)收集多个小分组,在一个确认到来时一起发送。所以Nagle算法有可能造成粘包现象。2、接收方原因,TCP接收到分组时,并不会立刻送至应用层处理,或者说,应用层并不一定会立即处理;实际上,TCP将收到的分组保存至接收缓存里,然后应用程序主动从缓存里读收到的分组。这样一来,如果TCP接收分组的速度大于应用程序读分组的速度,多个包就会被存至缓存,应用程序读时,就会读到多个首尾相接粘到一起的包。

如何解决粘包现象?1、解决发送方粘包,1)发送产生是因为Nagle算法合并小数据包,我们可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭Nagle算法。2)TCP提供了强制数据立即传送的操作指令push,当填入数据后调用操作指令就可以立即将数据发送,而不必等待发送缓冲区填充自动发送;3)数据包中加头,头部信息为整个数据的长度(最广泛最常用);2、解决接收方粘包。1)解析数据包头部信息,根据长度来接收;2)自定义数据格式:在数据中放入开始、结束标识;解析时根据格式抓取数据,缺点是数据内不能含有开始或结束标识;3)短连接传输,建立一次连接只传输一次数据就关闭;(不推荐)

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

应用层(HTTP、FTP)、表示层(数据的表示、安全、压缩)、会话层(本地主机与远程主机进行的会话)、传输层(TCP、UDP)、网络层(逻辑地址寻址,ICMP IP)、数据链路层(硬件地址寻址,MAC地址访问介质)、物理层(建立、维护、断开物理连接)

85.get 和 post 请求有哪些区别?

1、get请求的参数是放在URL里,post请求参数是放在请求body里;2、get请求URL传参有长度限制,而post请求没有长度限制;3、get请求的参数只能是ASCII码,所以中文需要URL编码,而post请求没有这个限制

86.如何实现跨域?

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。

1、JSONP:利用<script>标签没有跨域限制的“漏洞”,达到与第三方通讯目的。当需要通讯时,本地脚本动态创建一个<script>元素,地址指向第三方API网址,形如: 

<script src="http://www.example.net/api?param1=1&param2=2"></script>
并提供一个回调函数来接收数据(函数名可约定,或通过地址参数传递)。
第三方产生的响应为json数据的包装(故称之为jsonp,即json padding),形如:
callback({"name":"hax","gender":"Male"})
这样浏览器会调用callback函数,并传递解析后json对象作为参数。本站脚本可在callback函数里处理所传入的数据。

所有,通过Chrome查看所有JSONP发送的Get请求都是js类型,而非XHR。

要注意JSONP只支持GET请求,不支持POST请求。

2、apache设置反向代理(设置url映射解决跨域):

3、PHP端修改header(XHR2方式)

在php接口脚本中加入以下两句即可:

header('Access-Control-Allow-Origin:*');//允许所有来源访问

header('Access-Control-Allow-Method:POST,GET');//允许访问的方式

4.cors

​ Cross-Origin Resource Sharing(CORS)跨域资源共享是一份浏览器技术的规范,提供了 Web 服务从不同域传来沙盒脚本的方法,以避开浏览器的同源策略,确保安全的跨域数据传输。现代浏览器使用CORS在API容器如XMLHttpRequest来减少HTTP请求的风险来源。与 JSONP 不同,CORS 除了 GET 要求方法以外也支持其他的 HTTP 要求。服务器一般需要增加如下响应头的一种或几种:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400

 

跨域请求默认不会携带Cookie信息,如果需要携带,请配置下述参数:

"Access-Control-Allow-Credentials": true
// Ajax设置
"withCredentials": true

87.说一下 JSONP 实现原理?

 jsonp主要是为了解决跨域访问问题,其返回的数据格式一般就是一个js脚本,脚本特点如下:

1、返回js脚本通常是服务端动态生成。2、整个脚本通常有且仅有一条语句,且是一个函数调用。3、脚本中调用到的函数,是页面上存在的一个函数,其函数名通过get参数传递给服务端,服务端再将其回写到js脚本中。4、函数的参数,是服务端处理后的结果数据,以json格式直接写在脚本中。这也是jsonp得名的由来。

九、设计模式

88.说一下你熟悉的设计模式?

简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、原型模式、适配器模式、代理模式、迭代模式

89.简单工厂和抽象工厂有什么区别?

简单工厂,类的创建依赖工厂类,添加新的功能时需要修改工厂类;

抽象工厂是提供创建一系列服务的对象的接口,

posted @ 2019-03-25 12:01  亦真亦假,何必当真  阅读(215)  评论(0编辑  收藏  举报