精华内容
下载资源
问答
  • 面试问题

    2012-07-25 17:47:32
    都辞职一个月了,还没有找到工作,哎 也去过很多家面试公司,不知道怎么回事 就是不要我[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/1.gif][/img],怎么办,谁能给我分享一下你的面试...
  • spring和springMVC的面试问题总结

    万次阅读 多人点赞 2017-08-30 10:44:25
    校准、Performance optimization 性能优化、Persistence 持久化、Resource pooling 资源池、Synchronization 同步、Transactions 事务 原理:AOP是面向切面编程,是通过动态代理的方式为...,集中解决一些公共问题...

    1.Spring中AOP的应用场景、Aop原理、好处?

    答:AOP--Aspect Oriented Programming面向切面编程;用来封装横切关注点,具体可以在下面的场景中使用:

    Authentication 权限、Caching 缓存、Context passing 内容传递、Error handling 错误处理Lazy loading懒加载、Debugging调试、logging, tracing, profiling and monitoring 记录跟踪优化 校准、Performance optimization 性能优化、Persistence 持久化、Resource pooling 资源池、Synchronization 同步、Transactions 事务

    原理:AOP是面向切面编程,是通过动态代理的方式为程序添加统一功能,集中解决一些公共问题。

    优点:1.各个步骤之间的良好隔离性耦合性大大降低 
               2.源代码无关性,再扩展功能的同时不对源码进行修改操作 

    2.Spring中IOC的作用与原理?对象创建的过程。

    答:IOC--Inversion of Control控制反转。当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例对象。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 直接使用。

    3.介绍spring框架

       它是一个一站式(full-stack全栈式)框架,提供了从表现层-springMVC到业务层-spring再到持久层-springdata的一套完整的解决方案。我们在项目中可以只使用spring一个框架,它就可以提供表现层的mvc框架,持久层的Dao框架。它的两大核心IoC和AOP更是为我们程序解耦和代码简洁易维护提供了支持。

    4.Spring常见创建对象的注解?

    答:@Component@Controller@ Service@ Repository

    5.Spring中用到的设计模式

    答:简单工厂、工厂方法、单例模式、适配器、包装器、代理、观察者、策略、模板方法

    详细介绍:请参考本微博的:开发常用设计模式

    6.Spring的优点?

    答:1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 
    2.可以使用容易提供的众多服务,如事务管理,消息服务等 
    3.容器提供单例模式支持 
    4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 
    5.容器提供了众多的辅助类,能加快应用的开发 
    6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 
    7.spring属于低侵入式设计,代码的污染极低 
    8.独立于各种应用服务器 
    9.spring的DI机制降低了业务对象替换的复杂性 
    10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring 的部分或全部 

    7.Spring Bean的作用域之间有什么区别?

    Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:

    singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。

    prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。

    request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

    Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

    global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。

    全局作用域与Servlet中的session作用域效果相同。

    8.Spring管理事务有几种方式?

    答:有两种方式:

    1、编程式事务,在代码中硬编码。(不推荐使用)

    2、声明式事务,在配置文件中配置(推荐使用)

    声明式事务又分为两种:

    a、基于XML的声明式事务

    b、基于注解的声明式事务

    9.spring中自动装配的方式有哪些?

    答:1、 No:即不启用自动装配。

    2、 byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。比如说类Computer有个属性printer,指定其autowire属性为byName后,Spring IoC容器会在配置文件中查找id/name属性为printer的bean,然后使用Seter方法为其注入。

    3、 byType:通过属性的类型查找JavaBean依赖的对象并为其注入。比如类Computer有个属性printer,类型为Printer,那么,指定其autowire属性为byType后,Spring IoC容器会查找Class属性为Printer的bean,使用Seter方法为其注入。

    4、 constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Seter方法注入,而是使用构造子注入。

    5、 autodetect:在byType和constructor之间自动的选择注入方式。

    6、 default:由上级标签<beans>的default-autowire属性确定。

    10.spring中的核心类有那些,各有什么作用?

    答:BeanFactory:产生一个新的实例,可以实现单例模式

    BeanWrapper:提供统一的get及set方法

    ApplicationContext:提供框架的实现,包括BeanFactory的所有功能

    11.Bean的调用方式有哪些?

    答:有三种方式可以得到Bean并进行调用:
    1、使用BeanWrapper
    HelloWorld hw=new HelloWorld();
    BeanWrapper bw=new BeanWrapperImpl(hw);
    bw.setPropertyvalue(”msg”,”HelloWorld”);
    system.out.println(bw.getPropertyCalue(”msg”));
    2、使用BeanFactory
    InputStream is=new FileInputStream(”config.xml”);
    XmlBeanFactory factory=new XmlBeanFactory(is);
    HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);
    system.out.println(hw.getMsg());
    3、使用ApplicationConttext
    ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);
    HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
    System.out.println(hw.getMsg());

    12.什么是IOC,什么又是DI,他们有什么区别?

    答:依赖注入DI是一个程序设计模式和架构模型, 一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个 数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外 部以减少依赖

    应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所 以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。

    13.spring有两种代理方式:

    答: 若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。

          优点:因为有接口,所以使系统更加松耦合

          缺点:为每一个目标类创建接口

    若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。

          优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。

          缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。

    14.springMVC的流程?

    答:1.用户发送请求至前端控制器DispatcherServlet

    2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。

    3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

    4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

    5.执行处理器(Controller,也叫后端控制器)。

    6.Controller执行完成返回ModelAndView

    7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

    8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器

    9.ViewReslover解析后返回具体View

    10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

    11.DispatcherServlet响应用户

    15.Springmvc的优点

    答:1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成.

    2.不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)

    3. 可以任意使用各种视图技术,而不仅仅局限于JSP

    4 . 支持各种请求资源的映射策略

    5 .它应是易于扩展的

    如有披露或问题欢迎留言或者入群探讨

    展开全文
  • java面试之项目面试问题--不看面试会后悔的

    万次阅读 多人点赞 2017-06-01 22:38:24
    并说明你导出过的最大数据量 POI(合并单元格对象和背景色的应用) 最后这里还找到了百度文库当中的一些面试题:内容很多,就不一一列举出来了。 传送门:最全的ssh框架面试题 ssm框架面试题:...

    1.请描述下你做的项目:

    XXX系统是什么什么,主要目的是XXX,整个系统包含了哪些功能模块,然后说包含了哪些模块,自己做了哪些模块。
    2.结合项目谈谈你对MVC的理解

    MVC是model-view-controler的简称。也就是模型-视图-控制器。mvc是一种设计模式,他强制性的把应用程序的输入、处理和输出分开。mvc中的模型、视图、控制器分别担任着不同的任务。
    视图:视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
    模型:模型表示业务数据和业务处理。相当于javaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性。
    控制器:当用户单击web页面中的提交按钮时,控制器接收请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图来显示处理的结构。
    MVC的处理过程:首先控制器接收用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结构。并通过视图呈现给用户。如在项目中要对应MVC的话;View对应项目中的jsp,controler对应action,model对应service+dao层的业务逻辑和持久层的操作。

    3.项目中为什么要使用ssh(三大框架的优点)

    1.使用struts是因为struts是基于mvc模式的,很好的将应用程序进行了分层,使开发者更关注业务逻辑的实现;struts有着丰富的标签库,能大大的提高开发效率。
    2.使用Hibernate;是因为Hibernate为java应用提供了一个易用的、搞效率的对象关系映射框架。hibernate是个轻量级的持久层框架,功能丰富。
    3.使用spring;是因为spring基于ioc(控制反转)和aop框架多层j2ee系统的框架
    4.挑选一个你做的功能说明ssh框架的应用原理

    1.在表示层中,首先通过jsp页面实现交互界面,负责传送请求(request)和接收响应(response),然后struts根据配置文件(struts。xml)将actionServlet接收到的request委派给响应的action处理。
    2.在业务层中,管理服务组件的spring ioc容器负责向action提供业务模型(model)组件和组件的协作对象数据处理(dao)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。
    3.在持久层中,则依赖于hibernate的对象化映射和数据库交互,处理dao组件请求的数据,并返回处理结果。

    综合上面的概述;然后可以把我们做的信息发布管理模块用上述的方式实例化描述一遍。

    5.struts工作原理

    -------按照struts工作原理图说
    1.客户端发出一个指向servlet容器的请求;
    2.请求会经过strutsPrepareAndExecuteFilter过滤器;
    3.过滤器和请求将访问strut2的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。
    如:ConfigurationManager、ActionMapper和Objectfactory.ConfigurationManager存有配置文件的一些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,results,Interceptors,等)都是通过Objectfactory来创建的。过滤器会通过询问ActionMapper类来查找请求中需要用到的Action。
    4.如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。
    5.ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了Action的执行状态,或者说它控制的action的执行步骤。它持有Action实例和所有的Interceptor。
    6.ActionInvocation实例使用命名模式来调用,1.ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor.2.通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在调用action的过程前后,涉及到相关拦截器(Interceptor)的调用。
    7.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。

    --------------通俗的说------------
    发送http请求
    web服务器(tomcat、weblogic)
    执行struts核心过滤器StrutsprepareAndExecuteFilter
    加载struts配置文件中配置信息,找到对应的Action类并实例化
    执行各类拦截器和action中对应方法
    配置文件中找到返回结果
    转发到具体页面或其他操作

    6.struts有什么优缺点

    --------------优点------------
    1.实现MVC模式,结构清晰;
    2.丰富的struts的标记库,利用好能大大提高开发效率
    3.全局结果与声明式异常;
    4.可使用OGNL进行参数传递
    5.各类方便使用的拦截器

    --------------缺点-------------
    1.转到表现层时,需要配置结果页面;页面多了比较繁杂;
    2.对Servlet的依赖性过强
    3.struts标签稍微比el表达式繁重

    7.为何使用spring

    spring是一个轻量级的控制反转(ioc)、面向切面(AOp)、面向接口、事务管理、包容促进其他框架;使系统中用到的其他框架的耦合程度大大降低,扩展性强、简单易用好管理。

    8.spring在项目中如何充当粘合剂

    1.在项目中利用spring的ioc(控制反转或依赖注入),明确的定义组件接口(如UserDao),开发者可以独立开发各个组件,然后根据组件间的依赖关系组装(UserAction依赖于UserService,UserService依赖于Userdao)运行,很好的把struts(Action)和hibernate(dao的实现)结合起来;
    2.spring的事务管理把hibernate对数据库的操作进行了事务配置
    9.描述在系统中如何使用了spring的事务控制

    spring事务包括编程事务和声明式事务。在系统中使用了声明式的事务管理是用spring的AOP来实现的;配置了只读事务和回滚事务(传播行为为REQUIRED)当出现错误后进行事务回滚操作。在项目中通过aop切入事务到service层,这样做能使一次业务逻辑操作如果包括几个数据库操作都控制在一个事务中。
    10.Hibernate工作原理以及为什么要用?

    原理:
    1.读取并解析配置文件
    2.读取并解析映射信息,创建SessionFactory
    3.打开Session
    4.创建事务Transaction
    5.持久化操作
    6.提交事务
    7.关闭Session
    8关闭SessionFactory

    为什么要用:
    1.对Jdbc访问数据库代码做了封装,大大简化了数据访问层繁琐的重复性代码。
    2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度上简化DAO层的编码工作。3.Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
    4.Hibernate的性能非常好,因为他是一个轻量级框架。映射的灵活性很出色。他支持各种关系数据库,从一对一到多对对的各种复杂关系。

    11.Hibernate在系统中使用的优化策略

    Hibernate对数据的缓存包括两个级:一级缓存,在Session的级别上进行,主要是对象缓存,以其id为键保存对象,在Session的生命期间存在;二级缓存,在SessionFactory的级别上进行,有对象缓存和查询缓存,查询缓存以查询条件为键保存查询结果,在SessionFactory的生命期间存在,默认地,Hibernate只启用一级缓存

    12.列举你在开发中常用的struts标签

    property、iterator、if、date、form、a、url、textfiled、textarea、select、radio、checkboxlist、
    hidden、param

    13.Jquery异步获取数据的方式有几种?有何区别?

    1.load载入远程Html文件代码并插入至Dom中
    2.get
    3.post
    4.ajax
    5.getJSON
    6.getScript通过get方式请求载入并执行一个JavaScript脚本。

    14,简述UML并书名你是用Rose常用于什么情况,画什么图?

    UML是统一建模语言;用于在软件开发各个阶段中用图形的方式描述流程和功能需求;IBM
    Rational Rose是uml建模工具之一比较多的在需求阶段,常用于画例图,类图,时序图。

    15.请简述导入导出的工具类;并说明你导出过的最大数据量

    POI(合并单元格对象和背景色的应用)

    最后这里还找到了百度文库当中的一些面试题:内容很多,就不一一列举出来了。
    传送门:最全的ssh框架面试题

    ssm框架面试题:http://www.2cto.com/kf/201702/603919.html

    展开全文
  • 计算机网络面试问题集锦

    万次阅读 多人点赞 2018-03-26 17:16:40
    2、对称加密与非对称加密 对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以...

    转载自点击打开链接

     

    1、Http和Https的区别

      Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:

    • 端口不同:Http与Http使用不同的连接方式,用的端口也不一样,前者是80,后者是443;

    • 资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;

    • 开销:Https通信需要证书,而证书一般需要向认证机构购买; 
        
      Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。


    2、对称加密与非对称加密

      对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。

      由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。


    3、三次握手与四次挥手

     (1). 三次握手(我要和你建立链接,你真的要和我建立链接么,我真的要和你建立链接,成功):

    • 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

    • 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

    • 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

                  三次握手.png-12.4kB


     (2). 四次挥手(我要和你断开链接;好的,断吧。我也要和你断开链接;好的,断吧):

    • 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

    • 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。此时TCP链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。

    • 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

    • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

                  四次挥手.png-12.6kB


    4、为什么TCP链接需要三次握手,两次不可以么,为什么?

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

      客户端发出的连接请求报文并未丢失,而是在某个网络节点长时间滞留了,以致延误到链接释放以后的某个时间才到达Server。这是,Server误以为这是Client发出的一个新的链接请求,于是就向客户端发送确认数据包,同意建立链接。若不采用“三次握手”,那么只要Server发出确认数据包,新的链接就建立了。由于client此时并未发出建立链接的请求,所以其不会理睬Server的确认,也不与Server通信;而这时Server一直在等待Client的请求,这样Server就白白浪费了一定的资源。若采用“三次握手”,在这种情况下,由于Server端没有收到来自客户端的确认,则就会知道Client并没有要求建立请求,就不会建立链接。


    5、TCP协议如何来保证传输的可靠性

      TCP提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP链接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。

      对于可靠性,TCP通过以下方式进行保证:

    • 数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;

    • 对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;

    • 丢弃重复数据:对于重复数据,能够丢弃重复数据;

    • 应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;

    • 超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;

    • 流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。


    6、客户端不断进行请求链接会怎样?DDos(Distributed Denial of Service)攻击?

      服务器端会为每个请求创建一个链接,并向其发送确认报文,然后等待客户端进行确认


    1)、DDos 攻击

    • 客户端向服务端发送请求链接数据包
    • 服务端向客户端发送确认数据包
    • 客户端不向服务端发送确认数据包,服务器一直等待来自客户端的确认

    2)、DDos 预防 ( 没有彻底根治的办法,除非不使用TCP )

    • 限制同时打开SYN半链接的数目
    • 缩短SYN半链接的Time out 时间
    • 关闭不必要的服务

    7、Get与POST的区别

      GET与POST是我们常用的两种HTTP Method,二者之间的区别主要包括如下五个方面:

    (1). 从功能上讲,GET一般用来从服务器上获取资源,POST一般用来更新服务器上的资源;

    (2). 从REST服务角度上说,GET是幂等的,即读取同一个资源,总是得到相同的数据,而POST不是幂等的,因为每次请求对资源的改变并不是相同的;进一步地,GET不会改变服务器上的资源,而POST会对服务器资源进行改变;

    (3). 从请求参数形式上看,GET请求的数据会附在URL之后,即将请求数据放置在HTTP报文的 请求头 中,以?分割URL和传输数据,参数之间以&相连。特别地,如果数据是英文字母/数字,原样发送;否则,会将其编码为 application/x-www-form-urlencoded MIME 字符串(如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII);而POST请求会把提交的数据则放置在是HTTP请求报文的 请求体 中。

    (4). 就安全性而言,POST的安全性要比GET的安全性高,因为GET请求提交的数据将明文出现在URL上,而且POST请求参数则被包装到请求体中,相对更安全。

    (5). 从请求的大小看,GET请求的长度受限于浏览器或服务器对URL长度的限制,允许发送的数据量比较小,而POST请求则是没有大小限制的。


    1). GET请求中URL编码的意义

      我们知道,在GET请求中会对URL中非西文字符进行编码,这样做的目的就是为了 避免歧义。看下面的例子,

      针对“name1=value1&name2=value2”的例子,我们来谈一下数据从客户端到服务端的解析过程。首先,上述字符串在计算机中用ASCII吗表示为:

       6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532
       6E616D6531:name1 
       3D:= 
       76616C756531:value1 
       26:&
       6E616D6532:name2 
       3D:= 
       76616C756532:value2 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

      服务端在接收到该数据后就可以遍历该字节流,一个字节一个字节的吃,当吃到3D这字节后,服务端就知道前面吃得字节表示一个key,再往后吃,如果遇到26,说明从刚才吃的3D到26子节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。

      现在考虑这样一个问题,如果我们的参数值中就包含=或&这种特殊字符的时候该怎么办?比如,“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。这样,我们的本意是只有一个键值对,但是服务端却会解析成两个键值对,这样就产生了歧义。

      那么,如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码:例如,我们对上述会产生歧义的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。更多关于 URL编码 的内容,请参考我的博文《使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码》,此不赘述。


    8、TCP与UDP的区别

      TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议,它们之间的区别包括:

    • TCP是面向连接的,UDP是无连接的;

    • TCP是可靠的,UDP是不可靠的;

    • TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;

    • TCP是面向字节流的,UDP是面向报文的;

    • TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信;

    • TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;


    9、TCP的拥塞处理

      计算机网络中的带宽、交换结点中的缓存及处理机等都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏,这种情况就叫做拥塞。拥塞控制就是 防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。注意,拥塞控制和流量控制不同,前者是一个全局性的过程,而后者指点对点通信量的控制。拥塞控制的方法主要有以下四种:


    1). 慢启动:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小;


    2). 拥塞避免:拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按线性规律缓慢增长。

              慢开始与拥塞避免.png-90.3kB


    3). 快重传:快重传要求接收方在收到一个 失序的报文段 后就立即发出 重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

              快重传.jpg-42.3kB


    4). 快恢复:快重传配合使用的还有快恢复算法,当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半,但是接下去并不执行慢开始算法:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。

              快恢复.jpg-52.9kB


    10、从输入网址到获得页面的过程

      (1). 浏览器查询 DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;

      (2). 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;

      (3). TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;

      (4). 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;

      (5). 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;

      (6). 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。


    11、Session、Cookie 与 Application

      Cookie和Session都是客户端与服务器之间保持状态的解决方案,具体来说,cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。


    (1). Cookie及其相关API

      Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie,而客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

               Cookoe-HttpServletResponse.png-38.6kB

               HttpServletrequest-cookie.png-8.6kB


    (2). Session及其相关API

      同样地,会话状态也可以保存在服务器端。客户端请求服务器,如果服务器记录该用户状态,就获取Session来保存状态,这时,如果服务器已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用;如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,并将这个sessionid在本次响应中返回给客户端保存。保存这个sessionid的方式可以采用 cookie机制 ,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器;若浏览器禁用Cookie的话,可以通过 URL重写机制 将sessionid传回服务器。

               Session-HttpServletRequest.png-10.1kB


    (3). Session 与 Cookie 的对比

    • 实现机制:Session的实现常常依赖于Cookie机制,通过Cookie机制回传SessionID;

    • 大小限制:Cookie有大小限制并且浏览器对每个站点也有cookie的个数限制,Session没有大小限制,理论上只与服务器的内存大小有关;

    • 安全性:Cookie存在安全隐患,通过拦截或本地文件找得到cookie后可以进行攻击,而Session由于保存在服务器端,相对更加安全;

    • 服务器资源消耗:Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。

      Application(ServletContext):与一个Web应用程序相对应,为应用程序提供了一个全局的状态,所有客户都可以使用该状态。


    (4). Application

      Application(Java Web中的ServletContext):与一个Web应用程序相对应,为应用程序提供了一个全局的状态,所有客户都可以使用该状态。


    12、SQL 注入

      SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

    1). SQL注入攻击的总体思路

      (1). 寻找到SQL注入的位置 
      (2). 判断服务器类型和后台数据库类型 
      (3). 针对不通的服务器和数据库特点进行SQL注入攻击


    2). SQL注入攻击实例

      比如,在一个登录界面,要求输入用户名和密码,可以这样输入实现免帐号登录:

    用户名: ‘or 1 = 1 --
    密 码:
    • 1
    • 2

      用户一旦点击登录,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了。这是为什么呢?下面我们分析一下:从理论上说,后台认证程序中会有如下的SQL语句:String sql = “select * from user_table where username=’ “+userName+” ’ and password=’ “+password+” ‘”; 因此,当输入了上面的用户名和密码,上面的SQL语句变成:SELECT * FROM user_table WHERE username=’’or 1 = 1 – and password=’’。分析上述SQL语句我们知道, 
    username=‘ or 1=1 这个语句一定会成功;然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用。这样,上述语句永远都能正确执行,用户轻易骗过系统,获取合法身份。


    3). 应对方法

    (1). 参数绑定

      使用预编译手段,绑定参数是最好的防SQL注入的方法。目前许多的ORM框架及JDBC等都实现了SQL预编译和参数绑定功能,攻击者的恶意SQL会被当做SQL的参数而不是SQL命令被执行。在mybatis的mapper文件中,对于传递的参数我们一般是使用#和$来获取参数值。当使用#时,变量是占位符,就是一般我们使用javajdbc的PrepareStatement时的占位符,所有可以防止sql注入;当使用$时,变量就是直接追加在sql中,一般会有sql注入问题。

    (2). 使用正则表达式过滤传入的参数


    13、 XSS 攻击

      XSS是一种经常出现在web应用中的计算机安全漏洞,与SQL注入一起成为web中最主流的攻击方式。XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些脚本代码嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。


    1). XSS攻击的危害

    • 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号

    • 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

    • 盗窃企业重要的具有商业价值的资料

    • 非法转账

    • 强制发送电子邮件

    • 网站挂马

    • 控制受害者机器向其它网站发起攻击


    2). 原因解析

      主要原因:过于信任客户端提交的数据!

      解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。

      进一步分析细节:客户端提交的数据本来就是应用所需要的,但是恶意攻击者利用网站对客户端提交数据的信任,在数据中插入一些符号以及javascript代码,那么这些数据将会成为应用代码中的一部分了,那么攻击者就可以肆无忌惮地展开攻击啦,因此我们绝不可以信任任何客户端提交的数据!!!


    3). XSS 攻击分类

    (1). 反射性XSS攻击 (非持久性XSS攻击)

      漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS攻击包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击),例如,正常发送消息:

    http://www.test.com/message.php?send=Hello,World!
    • 1

    接收者将会接收信息并显示Hello,World;但是,非正常发送消息:

    http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script>!
    • 1

    接收者接收消息显示的时候将会弹出警告窗口!


    (2). 持久性XSS攻击 (留言板场景)

      XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。也就是说,每当用户使用浏览器打开指定页面时,脚本便执行。与非持久性XSS攻击相比,持久性XSS攻击危害性更大。从名字就可以了解到,持久性XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。

    例如,留言板表单中的表单域:
    
    <input type=“text” name=“content” value=“这里是用户填写的数据”>
    • 1

    正常操作流程是:用户是提交相应留言信息 —— 将数据存储到数据库 —— 其他用户访问留言板,应用去数据并显示;而非正常操作流程是攻击者在value填写:

    <script>alert(‘foolish!’);</script> <!--或者html其他标签(破坏样式。。。)、一段攻击型代码-->
    • 1

    并将数据提交、存储到数据库中;当其他用户取出数据显示的时候,将会执行这些攻击性代码。


    4). 修复漏洞方针

      漏洞产生的根本原因是 太相信用户提交的数据,对用户所提交的数据过滤不足所导致的,因此解决方案也应该从这个方面入手,具体方案包括:

    • 将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能 
      获取到cookie了(如果在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击);

    • 表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合。。。。

    • 对数据进行Html Encode 处理

    • 过滤或移除特殊的Html标签,例如: <script>, <iframe> , < for <, > for>, &quot for

    • 过滤JavaScript 事件的标签,例如 “οnclick=”, “onfocus” 等等。

        需要注意的是,在有些应用中是允许html标签出现的,甚至是javascript代码出现。因此,我们在过滤数据的时候需要仔细分析哪些数据是有特殊要求(例如输出需要html代码、javascript代码拼接、或者此表单直接允许使用等等),然后区别处理!


    14、OSI网络体系结构与TCP/IP协议模型

      为了更好地了解计算机网络体系结构,笔者以两篇博客的篇幅来介绍这个计算机网络中最为重要的知识点,具体见《计算机网络体系结构综述(上)》 和 《计算机网络体系结构综述(下)》。下面只做简要的总结。

      在《计算机网络体系结构综述(下)》一文中,我们知道TCP/IP与OSI最大的不同在于:OSI是一个理论上的网络通信模型,而TCP/IP则是实际上的网络通信标准。但是,它们的初衷是一样的,都是为了使得两台计算机能够像两个知心朋友那样能够互相准确理解对方的意思并做出优雅的回应。现在,我们对OSI七层模型的各层进行简要的介绍:

              OSI网络体系结构与TCPIP协议模型.png-51.3kB


    1). 物理层

      参考模型的最低层,也是OSI模型的第一层,实现了相邻计算机节点之间比特流的透明传送,并尽可能地屏蔽掉具体传输介质和物理设备的差异,使其上层(数据链路层)不必关心网络的具体传输介质。


    2). 数据链路层(data link layer)

      接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。


    3). 网络层

      将网络地址翻译成对应的物理地址,并通过路由选择算法为分组通过通信子网选择最适当的路径。

              数据链路层与网路层.png-58.4kB


    4). 传输层(transport layer)

      在源端与目的端之间提供可靠的透明数据传输,使上层服务用户不必关系通信子网的实现细节。在协议栈中,传输层位于网络层之上,传输层协议为不同主机上运行的进程提供逻辑通信,而网络层协议为不同主机提供逻辑通信,如下图所示。

              网路层与传输层.png-52.8kB

      实际上,网络层可以看作是传输层的一部分,其为传输层提供服务。但对于终端系统而言,网络层对它们而言是透明的,它们知道传输层的存在,也就是说,在逻辑上它们认为是传输层为它们提供了端对端的通信,这也是分层思想的妙处。


    5). 会话层(Session Layer)

      会话层是OSI模型的第五层,是用户应用程序和网络之间的接口,负责在网络中的两节点之间建立、维持和终止通信。


    6). 表示层(Presentation Layer):数据的编码,压缩和解压缩,数据的加密和解密

      表示层是OSI模型的第六层,它对来自应用层的命令和数据进行解释,以确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。


    7). 应用层(Application layer):为用户的应用进程提供网络通信服务


    15、TCP和UDP分别对应的常见应用层协议

    1). TCP对应的应用层协议

    • FTP:定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。

    • Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。如以前的BBS是-纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。

    • SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置-中常看到有这么SMTP端口设置这个栏,服务器开放的是25号端口。

    • POP3:它是和SMTP对应,POP3用于接收邮件。通常情况下,POP3协议所用的是110端口。也是说,只要你有相应的使用POP3协议的程序(例如Fo-xmail或Outlook),就可以不以Web方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是163邮箱就没有必要先进入网易网站,再进入自己的邮-箱来收信)。

    • HTTP:从Web服务器传输超文本到本地浏览器的传送协议。


    2). UDP对应的应用层协议

    • DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。

    • SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。

    • TFTP(Trival File Transfer Protocal):简单文件传输协议,该协议在熟知端口69上使用UDP服务。


    3). 图示

              TCP和UDP分别对应的常见应用层协议.png-41.5kB


    16、网络层的ARP协议工作原理

      网络层的ARP协议完成了IP地址与物理地址的映射。首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机时,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址:如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址;源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。


    17、IP地址的分类

      IP地址是指互联网协议地址,是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP地址编址方案将IP地址空间划分为A、B、C、D、E五类,其中A、B、C是基本类,D、E类作为多播和保留使用,为特殊地址。

      每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。A~E类地址的特点如下:

    • A类地址:以0开头,第一个字节范围:0~127;

    • B类地址:以10开头,第一个字节范围:128~191;

    • C类地址:以110开头,第一个字节范围:192~223;

    • D类地址:以1110开头,第一个字节范围为224~239;

    • E类地址:以1111开头,保留地址


    1). A类地址:1字节的网络地址 + 3字节主机地址,网络地址的最高位必须是“0”

      一个A类IP地址是指, 在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话,A类IP地址就由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”。A类IP地址中网络的标识长度为8位,主机标识的长度为24位,A类网络地址数量较少,有126个网络,每个网络可以容纳主机数达1600多万台。

      A类IP地址的地址范围1.0.0.0到127.255.255.255(二进制表示为:00000001 00000000 00000000 00000000 - 01111110 11111111 11111111 11111111),最后一个是广播地址。A类IP地址的子网掩码为255.0.0.0,每个网络支持的最大主机数为256的3次方-2=16777214台。


    2). B类地址: 2字节的网络地址 + 2字节主机地址,网络地址的最高位必须是“10”

      一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码。如果用二进制表示IP地址的话,B类IP地址就由2字节的网络地址和2字节主机地址组成,网络地址的最高位必须是“10”。B类IP地址中网络的标识长度为16位,主机标识的长度为16位,B类网络地址适用于中等规模的网络,有16384个网络,每个网络所能容纳的计算机数为6万多台。

      B类IP地址地址范围128.0.0.0-191.255.255.255(二进制表示为:10000000 00000000 00000000 00000000—-10111111 11111111 11111111 11111111),最后一个是广播地址。B类IP地址的子网掩码为255.255.0.0,每个网络支持的最大主机数为256的2次方-2=65534台。


    3). C类地址: 3字节的网络地址 + 1字节主机地址,网络地址的最高位必须是“110”

      一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。如果用二进制表示IP地址的话,C类IP地址就由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须是“110”。C类IP地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,有209万余个网络。适用于小规模的局域网络,每个网络最多只能包含254台计算机。

      C类IP地址范围192.0.0.0-223.255.255.255(二进制表示为: 11000000 00000000 00000000 00000000 - 11011111 11111111 11111111 11111111)。C类IP地址的子网掩码为255.255.255.0,每个网络支持的最大主机数为256-2=254台。


    4). D类地址:多播地址,用于1对多通信,最高位必须是“1110”

      D类IP地址在历史上被叫做多播地址(multicast address),即组播地址。在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点。多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255。


    5). E类地址:为保留地址,最高位必须是“1111”


    18、IP地址与物理地址

      物理地址是数据链路层和物理层使用的地址,IP地址是网络层和以上各层使用的地址,是一种逻辑地址,其中ARP协议用于IP地址与物理地址的对应。


    21、 常见状态码及原因短语

      HTTP请求结构: 请求方式 + 请求URI + 协议及其版本 
      HTTP响应结构: 状态码 + 原因短语 + 协议及其版本


    • 1×× : 请求处理中,请求已被接受,正在处理

    • 2×× : 请求成功,请求被成功处理 
      200 OK

    • 3×× : 重定向,要完成请求必须进行进一步处理 
      301 : 永久性转移 
      302 :暂时性转移 
      304 : 已缓存

    • 4×× : 客户端错误,请求不合法 
      400:Bad Request,请求有语法问题 
      403:拒绝请求 
      404:客户端所访问的页面不存在

    • 5×× : 服务器端错误,服务器不能处理合法请求 
      500 :服务器内部错误 
      503 : 服务不可用,稍等 

     

    展开全文
  • HashMap底层实现原理及面试问题

    万次阅读 多人点赞 2018-08-29 11:00:56
    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode...HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存...

    ①HashMap的工作原理

    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

    当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

    因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。

    ②HashMap和Hashtable的区别

    HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

    1. HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
    2. HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
    3. 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
    4. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
    5. HashMap不能保证随着时间的推移Map中的元素次序是不变的。

    要注意的一些重要术语:

    1) sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。

    2) Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。

    3) 结构上的更改指的是删除或者插入一个元素,这样会影响到map的结构。

    我们能否让HashMap同步?

    HashMap可以通过下面的语句进行同步:
    Map m = Collections.synchronizeMap(hashMap);

    结论

    Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。

    ashMap和HashSet的区别是Java面试中最常被问到的问题。如果没有涉及到Collection框架以及多线程的面试,可以说是不完整。而Collection框架的问题不涉及到HashSet和HashMap,也可以说是不完整。HashMap和HashSet都是collection框架的一部分,它们让我们能够使用对象的集合。collection框架有自己的接口和实现,主要分为Set接口,List接口和Queue接口。它们有各自的特点,Set的集合里不允许对象有重复的值,List允许有重复,它对集合中的对象进行索引,Queue的工作原理是FCFS算法(First Come, First Serve)。

    首先让我们来看看什么是HashMap和HashSet,然后再来比较它们之间的分别。

    ③HashMap和HashSet的区别

    HashMap和HashSet的区别是Java面试中最常被问到的问题。如果没有涉及到Collection框架以及多线程的面试,可以说是不完整。而Collection框架的问题不涉及到HashSet和HashMap,也可以说是不完整。HashMap和HashSet都是collection框架的一部分,它们让我们能够使用对象的集合。collection框架有自己的接口和实现,主要分为Set接口,List接口和Queue接口。它们有各自的特点,Set的集合里不允许对象有重复的值,List允许有重复,它对集合中的对象进行索引,Queue的工作原理是FCFS算法(First Come, First Serve)。

    首先让我们来看看什么是HashMap和HashSet,然后再来比较它们之间的分别。

    什么是HashSet

    HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。

    public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。

    什么是HashMap

    HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。

    public Object put(Object Key,Object value)方法用来将元素添加到map中。

    HashSet和HashMap的区别

    *HashMap* *HashSet*
    HashMap实现了Map接口 HashSet实现了Set接口
    HashMap储存键值对 HashSet仅仅存储对象
    使用put()方法将元素放入map中 使用add()方法将元素放入set中
    HashMap中使用键对象来计算hashcode值 HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
    HashMap比较快,因为是使用唯一的键来获取对象 HashSet较HashMap来说比较慢

     

     

    ④面试题

    HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中。投资银行更喜欢问这个问题,甚至会要求你实现HashMap来考察你的编程能力。ConcurrentHashMap和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的旅程吧!

    “你用过HashMap吗?” “什么是HashMap?你为什么用到它?”

    几乎每个人都会回答“是的”,然后回答HashMap的一些特性,譬如HashMap可以接受null键值和值,而Hashtable则不能;HashMap是非synchronized;HashMap很快;以及HashMap储存的是键值对等等。这显示出你已经用过HashMap,而且对它相当的熟悉。但是面试官来个急转直下,从此刻开始问出一些刁钻的问题,关于HashMap的更多基础的细节。面试官可能会问出下面的问题:

    “你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的工作原理吗?”

    你也许会回答“我没有详查标准的Java API,你可以看看Java源代码或者Open JDK。”“我可以用Google找到答案。”

    但一些面试者可能可以给出答案,“HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。”这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Entry。这一点有助于理解获取对象的逻辑。如果你没有意识到这一点,或者错误的认为仅仅只在bucket中存储值的话,你将不会回答如何从HashMap中获取对象的逻辑。这个答案相当的正确,也显示出面试者确实知道hashing以及HashMap的工作原理。但是这仅仅是故事的开始,当面试官加入一些Java程序员每天要碰到的实际场景的时候,错误的答案频现。下个问题可能是关于HashMap中的碰撞探测(collision detection)以及碰撞的解决方法:

    “当两个对象的hashcode相同会发生什么?” 从这里开始,真正的困惑开始了,一些面试者会回答因为hashcode相同,所以两个对象是相等的,HashMap将会抛出异常,或者不会存储它们。然后面试官可能会提醒他们有equals()和hashCode()两个方法,并告诉他们两个对象就算hashcode相同,但是它们可能并不相等。一些面试者可能就此放弃,而另外一些还能继续挺进,他们回答“因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用链表存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在链表中。”这个答案非常的合理,虽然有很多种处理碰撞的方法,这种方法是最简单的,也正是HashMap的处理方法。但故事还没有完结,面试官会继续问:

    “如果两个键的hashcode相同,你如何获取值对象?” 面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。面试官提醒他如果有两个值对象储存在同一个bucket,他给出答案:将会遍历链表直到找到值对象。面试官会问因为你并没有值对象去比较,你是如何确定确定找到值对象的?除非面试者直到HashMap在链表中存储的是键值对,否则他们不可能回答出这一题。

    其中一些记得这个重要知识点的面试者会说,找到bucket位置之后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。完美的答案!

    许多情况下,面试者会在这个环节中出错,因为他们混淆了hashCode()和equals()方法。因为在此之前hashCode()屡屡出现,而equals()方法仅仅在获取值对象的时候才出现。一些优秀的开发者会指出使用不可变的、声明作final的对象,并且采用合适的equals()和hashCode()方法的话,将会减少碰撞的发生,提高效率。不可变性使得能够缓存不同键的hashcode,这将提高整个获取对象的速度,使用String,Interger这样的wrapper类作为键是非常好的选择。

    如果你认为到这里已经完结了,那么听到下面这个问题的时候,你会大吃一惊。“如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?”除非你真正知道HashMap的工作原理,否则你将回答不出这道题。默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。

    如果你能够回答这道问题,下面的问题来了:“你了解重新调整HashMap大小存在什么问题吗?”你可能回答不上来,这时面试官会提醒你当多线程的情况下,可能产生条件竞争(race condition)。

    当重新调整HashMap大小的时候,确实存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了。这个时候,你可以质问面试官,为什么这么奇怪,要在多线程的环境下使用HashMap呢?:)

    热心的读者贡献了更多的关于HashMap的问题:

      1. 为什么String, Interger这样的wrapper类适合作为键? String, Interger这样的wrapper类作为HashMap的键是再适合不过了,而且String最为常用。因为String是不可变的,也是final的,而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。不可变性还有其他的优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变的,那么请这么做吧。因为获取对象的时候要用到equals()和hashCode()方法,那么键对象正确的重写这两个方法是非常重要的。如果两个不相等的对象返回不同的hashcode的话,那么碰撞的几率就会小些,这样就能提高HashMap的性能。
      2. 我们可以使用自定义的对象作为键吗? 这是前一个问题的延伸。当然你可能使用任何对象作为键,只要它遵守了equals()和hashCode()方法的定义规则,并且当对象插入到Map中之后将不会再改变了。如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。
      3. 我们可以使用CocurrentHashMap来代替Hashtable吗?这是另外一个很热门的面试题,因为ConcurrentHashMap越来越多人用了。我们知道Hashtable是synchronized的,但是ConcurrentHashMap同步性能更好,因为它仅仅根据同步级别对map的一部分进行上锁。ConcurrentHashMap当然可以代替HashTable,但是HashTable提供更强的线程安全性。看看这篇博客查看Hashtable和ConcurrentHashMap的区别。
    展开全文
  • Map面试问题

    万次阅读 2020-10-27 16:13:58
    Map 在面试中,占据了很大一部分的面试题目,其中以 HashMap 为主,这些面试题目有的可以说得清楚,有的很难说清楚,如果是面对面面试的话,建议画一画。 1 Map 整体数据结构类问题 1.1 说一说 HashMap 底层数据结构...
  • 面试/笔试第一弹 —— 计算机网络面试问题集锦

    万次阅读 多人点赞 2017-10-21 14:57:33
    本文对面试/笔试过程中经常会被问到的一些关于计算机网络的问题进行了梳理和总结,一方面方便自己温故知新,另一方面也希望为找工作的同学们提供一个复习参考。关于这块内容的初步了解和掌握,建议大家读一读《图解...
  • DevOps面试问题

    千次阅读 2018-09-25 19:40:41
    转载自 DevOps面试问题 DevOps是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。下面为大家分享DevOps系列的面试问题 持续整合问题 ...
  • 计算机网络面试问题

    万次阅读 多人点赞 2019-06-14 11:50:48
    计算机网络面试问题 目录 OSI七层模型与TCP/IP五层模型 三次握手 四次挥手 Http和Https的区别 对称加密与非对称加密 TCP与UDP的区别 从输入网址到获得页面的过程 常见状态码及原因短语 Get与POST的区别 DNS的寻址...
  • 面试技巧 16个经典面试问题回答思路
  • Shopee面试问题整理

    千次阅读 2020-04-12 21:44:35
    Shopee面试问题整理三握手四挥手及其状态TCP 的三次握手, 四次挥手: TCP 协议是如何建立和释放连接的?三次握手建立连接:第一次握手:A给B打电话说,你可以听到我说话吗?(...
  • 应届毕业生软件测试面试流程、面试问题总结 小伙伴们,大家好,今天主要是想和大家分享我在今年面试软件测试岗位时的面试经历,以及相应的软件测试面试问题的总结。 目录: 一、自我介绍 二、根据你的简历内容对你...
  • SQL岗位30个面试题,SQL面试问题及答案

    万次阅读 多人点赞 2019-06-19 17:42:34
    SQL岗位30个面试题,SQL面试问题及答案: 什么是SQL? SQL(结构化查询语言)是一种设计用于检索和操作数据的数据库。它属于美国国家标准协会(ANSI)的一种标准,可用于执行Select(选择)、Update(更新)、...
  • Struts2面试问题

    千次阅读 2018-09-27 19:10:52
    转载自 Struts2面试问题 1.什么是Struts2? Apache Struts2是一个用Java构建Web应用程序的开源框架。Struts2基于OpenSymphony WebWork框架。它从Struts1中得到了很大的改进,使其更加灵活,易于使用和扩展。...
  • 上一篇文章我们总结了10个大数据面试入门级问题,大家是否有收获,如果还没有看的小伙伴,可以直接跳转《干货|50个大数据面试问题及答案第一篇:10个大数据面试入门级问题》开始学习吧! 本次我们慧都网分析的是10...
  • 面试官十大常问面试问题总结

    千次阅读 2015-10-04 20:23:25
    下面就面试官十大常问面试问题作出总结: (1)为什么想进本单位?  这通常是面试官最先问到的问题。此时面试官就开始评断录用与否了,建议大家先判断自己去应徵的工作性质,是专业能力导向呢,或是需要沟通...
  • 面试/笔试第二弹 —— 操作系统面试问题集锦

    万次阅读 多人点赞 2017-10-21 16:08:50
    本文对面试/笔试过程中经常会被问到的一些关于操作系统的问题进行了梳理和总结,一方面方便自己温故知新,另一方面也希望为找工作的同学们提供一个复习参考。关于这块内容的初步了解和整体掌握,建议大家读一读...
  • [面试]HR最常用的20个面试问题及答案

    万次阅读 多人点赞 2017-03-29 20:37:34
    [面试]HR最常用的20个面试问题及答案 来自前程无忧HR网友“HR女王”的分享:   根据在咨询中针对人事主管的调查,统计出20个人事主管最常问的问题和最喜欢的答案。   我去应聘的时候,初试时我都会看...
  • JAVA社招面试问题总结(一年工作经验)

    万次阅读 多人点赞 2020-08-23 12:56:58
    以下面试问题很多是我在最近面试过程中遇到的: 一年工作经验小白,请大佬指点 1、Java常考知识点 java的基本数据类型与包装类; final修饰变量类方法; String为什么是不可变的,以及new String(“abc”)创建了几...
  • 典型销售面试问题

    千次阅读 2012-10-11 10:26:18
    典型销售人员面试问题 浏览: 16058 | 更新: 2012-02-17 15:58 | 标签: 面试  17  6 简介 典型销售人员面试问题。在销售人员面试时,面试官往往会准备一些...
  • 爱奇艺一面、二面面试问题

    万次阅读 2017-09-14 22:55:46
    爱奇艺 面试问题
  • c++实习岗面试问题集锦

    千次阅读 多人点赞 2019-07-12 11:02:59
    c++实习岗面试问题集锦 本文的定位是c++实习岗,因此难度不可能是全职岗那么深入,重点还是在对有一定c++基础的人的知识点考察.以供临阵磨枪之用. 面试技巧 回答问题的时候最最基本的两个要求: 不紧不慢,...
  • python面试问题题目

    千次阅读 2016-02-18 20:26:15
    第一次python面试问题题目面试的是爬虫类岗位,一些问题答得不好,记录下来,作为个人总结。GET和POST区别待更新答案数据库内容查找要求手写,忘记了基本的语法,没有答出。HTML中 class的含义beautifulsoup有几种...
  • (HR面试)最常见的面试问题和技巧性答复

    万次阅读 多人点赞 2017-09-20 19:44:51
    [HR面试] 65个最常见的面试问题与技巧性答复1、请你自我介绍一下你自己? 回答提示:一般人回答这个问题过于平常,只说姓名、年龄、爱好、工作经验,这些在简历上都有。其实,企业最希望知道的是求职者能否胜任工作...
  • 后台开发面试问题整理

    万次阅读 多人点赞 2016-02-27 22:07:53
    实习、校招中后台开发的面试问题
  • MES面试问题整理

    千次阅读 2017-05-24 16:32:54
    MES面试问题整理C#、Oracle、MES一、当多个Client同时发送信息时,Server怎么保证信息不出错?Socket处理信息的方式?1、进程同步和异步同步两个通信应用服务之间必须要进行同步且两个服务之间必须都是正常运行的。...
  • 2016运维面试问题总结

    万次阅读 多人点赞 2017-07-25 02:09:34
    2016运维面试问题总结 1. 基础操作:面试和笔试的时候肯定会问到,频率最高的命令有:mkdir find awk sed uniq sort tail head mkfs chmod crontab lsofnetstat route tcpdump tar等主要考察为后面参数的选择以及...
  • DevOps面试问题总结1

    千次阅读 2018-11-16 13:25:20
    下面为大家分享DevOps系列的面试问题 持续整合问题 问题一:持续集成是什么意思?    我将建议您通过给出持续集成(CI)的小定义来开始这个答案。这是一种开发实践,要求开发人员每天多次将代码集成到共享存储...
  • 这是面试官很喜欢问的一个问题,你是会刁难你的一个地方。如果你在项目中是核心解决了一些技术难题,那这个问题对你来说应该是很好回答的。你可以说出这个项目遇到的技术问题,以及你是怎么解决的。这种问题往往可以...
  • 网络工程师十个常见面试问题

    千次阅读 多人点赞 2020-04-08 10:22:24
    网络工程师十个常见面试问题 1.1 [简单说一下OSI七层] Osi模型是一个工业的标准.它为现在的互联网提供了很大的贡献。是一个逻辑上的规范和标准,很多厂商都要遵循它。他定义了七层每一层都有不同的功能和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 147,526
精华内容 59,010
关键字:

面试问题