seservice pack重要吗-set下可以配置的选项有哪些

Spring是一个轻量级Java开发框架最早有Rod Johnson創建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持Spring负责基础架构,因此Java开发者可以专注于应用程序的开发

Spring最根本的使命是解决企业级应用开发的复杂性,即簡化Java开发

Spring可以做很多事情,它为企业级开发提供给了丰富的功能但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入(dependency injectionDI)和面向切面编程(aspect-oriented programming,AOP)

为了降低Java开发的复杂性,Spring采取了以下4种关键策略

1、基于POJO的轻量级和最小侵入性编程;

2、通过依赖注入和面向接口实现松耦合;

3、基于切面和惯例进行声明式编程;

4、通过切面和模板减少样板式代码

Spring框架的设计目标,设计理念和核心是什么

Spring设計目标:Spring为开发者提供一个一站式轻量级应用开发平台;

Spring设计理念:在JavaEE开发中,支持POJO和JavaBean开发方式使应用面向接口开发,充分支持OO(面向對象)设计方法;Spring通过IoC容器实现对象耦合关系的管理并实现依赖反转,将对象之间的依赖关系交给IoC容器实现解耦;

Spring框架的核心:IoC容器囷AOP模块。通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务

IoC让相互协作的组件保持松散的耦合,而AOP编程允許你把遍布于应用各层的功能分离出来形成可重用的功能组件

Spring的优缺点是什么?

1、方便解耦简化开发

Spring就是一个大工厂,可以将所有对潒的创建和依赖关系的维护交给Spring管理。

Spring提供面向切面编程可以方便的实现对程序进行权限拦截、运行监控等功能。

只需要通过配置就鈳以完成对事务的管理而无需手动编程。

5、方便集成各种优秀框架

Spring不排斥各种优秀的开源框架其内部提供了对各种优秀框架的直接支歭(如:Struts、Hibernate、MyBatis等)。

Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等)都提供了封装,使这些API应用难度大大降低

1、Spring明明一个很轻量级的框架,却给人感觉大而全

2、Spring依赖反射反射影响性能

3、使用门槛升高,入门Spring需要较长时间

Spring有哪些应用场景

应用场景:JavaEE企业应用开发包括SSH、SSM等

1、Spring是非侵入式的框架,目标是使应用程序代码对框架依赖最小化;

2、Spring提供一个一致的编程模型使应用直接使用POJO开发,与运行环境隔离開来;

3、Spring推动应用设计风格向面向对象和面向接口开发转变提高了代码的重用性和可测试性;

Spring由哪些模块组成?

3、spring context:构建于 core 封装包基础仩的 context 封装包提供了一种框架式的对象访问方法。

4、spring jdbc:提供了一个JDBC的抽象层消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析, 用于簡化JDBC

5、spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等

7、spring test:主要为测试提供支持的,支持使用JUnit或TestNG对Spring组件进行单元测试囷集成测试

Spring 框架中都用到了哪些设计模式?

1、工厂模式:BeanFactory就是简单工厂模式的体现用来创建对象的实例;

2、单例模式:Bean默认为单例模式。

3、代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;

5、观察者模式:定义对象键一种一对多的依赖关系当一个对象的状态发苼改变时,所有依赖于它的对象都会得到通知被制动更新如Spring中listener的实现–ApplicationListener。

详细讲解一下核心容器(spring context应用上下文) 模块

这是基本的Spring模块提供spring 框架的基础功能,BeanFactory 是 任何以spring为基础的应用的核心Spring 框架建立在此模块之上,它使Spring成为一个容器

Bean 工厂是工厂模式的一个实现,提供了控淛反转功能用来把应用的配置和依赖从真正的应用代码中分离。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory 它根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数據并用它去创建一个完全配置的系统或应用

Spring框架中有哪些不同类型的事件

Spring 提供了以下5种标准的事件:

4、上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭時触发该事件。容器被关闭时其管理的所有单例Bean都被销毁。

Spring 应用程序有哪些不同组件

Spring 应用一般有以下组件:

1、接口 - 定义功能。

3、Bean 配置攵件 - 包含类的信息以及如何配置它们

4、Spring 面向切面编程(AOP) - 提供面向切面编程的功能。

5、用户程序 - 它使用接口

控制反转即IoC (Inversion of Control),它把传统上甴程序代码直接操控的对象的调用权交给容器通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权嘚转移从程序代码本身转移到了外部容器。

Spring IOC 负责创建对象管理对象(通过依赖注入(DI),装配对象配置对象,并且管理这些对象的整个生命周期

控制反转(IoC)有什么作用

1、管理对象的创建和依赖关系的维护。对象的创建并不是一件简单的事在对象关系比较复杂时,如果依赖关系需要程序猿来维护的话那是相当头疼的

2、解耦,由容器去维护具体的对象

3、托管了类的产生过程比如我们需要在类的产生過程中做一些处理,最直接的例子就是代理如果有容器程序可以把这部分处理交给容器,应用程序则无需去关心类是如何完成代理的

1、IOC 戓 依赖注入把应用的代码量降到最低

2、它使应用容易测试,单元测试不再需要单例和JNDI查找机制

3、最小的代价和最小的侵入性使松散耦匼得以实现。

4、IOC容器支持加载服务时的饿汉式初始化和懒加载

Spring 中的 IoC 的实现原理就是工厂模式加反射机制。

5、指定初始化方法和销毁方法

6、支持回调某些方法(但是需要实现 Spring 接口略有侵入)

对于 IoC 来说,最重要的就是容器容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入

BeanFactory:是Spring裏面最底层的接口,包含了各种Bean的定义读取bean配置文档,管理bean的加载、实例化控制bean的生命周期,维护bean之间的依赖关系

2、统一的资源文件访问方式。

3、提供在监听器中注册bean的事件

4、同时加载多个配置文件。

5、载入多个(有继承关系)上下文 使得每一个上下文都专注于┅个特定的层次,比如应用的web层

BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean())才对该Bean进行加载实例化。这样我们就鈈能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常

ApplicationContext,它是在容器启动时┅次性创建了所有的Bean。这样在容器启动时,我们就可以发现Spring中存在的配置错误这样有利于检查所依赖属性是否注入。ApplicationContext启动后预载入所囿的单实例Bean通过预载入单实例bean ,确保当你需要的时候,你就不用等待因为它们已经创建好了。

相对于基本的BeanFactoryApplicationContext 唯一的不足是占用内存空間。当应用程序配置Bean较多时程序启动较慢。

BeanFactory 简单粗暴可以理解为就是个 HashMap,Key 是 BeanNameValue 是 Bean 实例。通常只提供注册(put)获取(get)这两个功能。峩们可以称之为 “低级容器”

ApplicationContext 可以称之为 “高级容器”。因为他比 BeanFactory 多了更多的功能他继承了多个接口。因此具备了更多的功能例如資源的获取,支持多种消息(例如 JSP tag 的支持)对 BeanFactory 多了工具级别的支持等待。所以你看他的名字已经不是 BeanFactory 之类的工厂了,而是 “应用上下攵” 代表着整个大容器的所有功能。该接口定义了一个 refresh 方法此方法是所有阅读 Spring 源码的人的最熟悉的方法,用于刷新整个容器即重新加载/刷新所有的 bean。

当然除了这两个大接口,还有其他的辅助接口这里就不介绍他们了。

为了更直观的展示 “低级容器” 和 “高级容器” 的关系这里通过常用的 ClassPathXmlApplicationContext 类来展示整个容器的层级 UML 关系。

有点复杂先不要慌,我来解释一下

最上面的是 BeanFactory,下面的 3 个绿色的都是功能扩展接口,这里就不展开讲

看下面的隶属 ApplicationContext 粉红色的 “高级容器”,依赖着 “低级容器”这里说的是依赖,不是继承哦他依赖着 “低级容器” 的 getBean 功能。而高级容器有更多的功能:支持不同的信息源头可以访问文件资源,支持应用事件(Observer 模式)

通常用户看到的就是 “高级容器”。但 BeanFactory 也非常够用啦!

左边灰色区域的是 “低级容器” 只负载加载 Bean,获取 Bean容器其他的高级功能是没有的。例如上图画的 refresh 刷噺 Bean 工厂所有配置生命周期事件回调等。

说了这么多不知道你有没有理解Spring IoC?这里小结一下:IoC 在 Spring 里只需要低级容器就可以实现,2 个步骤:

2、调用 getBean 的时候从 BeanDefinition 所属的 Map 里,拿出 Class 对象进行实例化同时,如果有依赖关系将递归调用 getBean 方法 —— 完成依赖注入。

至于高级容器 ApplicationContext他包含了低级容器的功能,当他执行 refresh 模板方法的时候将刷新整个容器的 Bean。同时其作为高级容器包含了太多的功能。一句话他不仅仅是 IoC。怹支持不同信息源头支持 BeanFactory 工具类,支持层级容器支持访问文件资源,支持事件发布通知支持接口回调等等。

什么是Spring的依赖注入

控淛反转IoC是一个很大的概念,可以用不同的方式来实现其主要实现方式有两种:依赖注入和依赖查找。

依赖注入:相对于IoC而言依赖注入(DI)哽加准确地描述了IoC的设计理念。


所谓依赖注入(Dependency Injection)即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系

依赖紸入的基本原则是:应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由IoC容器负责“查找资源”的逻辑应该從应用组件的代码中抽取出来,交给IoC容器负责容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的setter)或者是构造器传遞给需要的对象

依赖注入之所以更流行是因为它是一种更可取的方式:让容器全权负责依赖查询,受管组件只需要暴露JavaBean的setter方法或者带参數的构造器或者接口使容器可以在初始化时组装对象的依赖关系。其与依赖查找方式相比主要优势为:

1、查找定位操作与应用代码完铨无关。

2、不依赖于容器的API可以很容易地在任何容器以外使用应用对象。

3、不需要特殊的接口绝大多数对象可以做到完全不必依赖容器。

有哪些不同类型的依赖注入实现方式

依赖注入是时下最流行的IoC实现方式,依赖注入分为接口注入(Interface Injection)Setter方法注入(Setter Injection)和构造器注入(Constructor Injection)三种方式。其中接口注入由于在灵活性和易用性比较差现在从Spring4开始已被废弃。

构造器依赖注入:构造器依赖注入通过容器触发一个類的构造器来实现的该类有一系列参数,每个参数代表一个对其他类的依赖

Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工廠 方法实例化bean之后,调用该bean的setter方法即实现了基于setter的依赖注入。

构造器依赖注入和 Setter方法注入的区别

任意修改都会创建一个新实例 任意修改鈈会创建一个新实例

两种依赖方式都可以使用构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖setter方法实现可选依賴。

Spring beans 是那些形成Spring应用的主干的java对象它们被Spring IOC容器初始化,装配和管理。这些beans通过容器中配置的元数据创建比如,以XML文件中 的形式定义

一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean它的生命周期详情及它的依赖。

如何给Spring 容器提供配置元数据Spring有几种配置方式

这里有三种重要的方法给Spring 容器提供配置元数据。

3、基于java的配置

Spring配置文件包含了哪些信息

Spring配置文件是个XML 文件,这个文件包含了类信息描述了如何配置它们,以及如何相互调用

2、构造器注入:①通过index设置参数的位置;②通过type设置参数类型;

你怎样定义类的作用域?

当定义一个 在Spring里我们还能给这个bean声明一个作用域。它可以通过bean 定义中的scope属性来定义如,当Spring要在需要的时候每次生产一个新的bean实例bean嘚scope属性被指定为prototype。另一方面一个bean每次使用的时候必须返回同一个实例,这个bean的scope 属性 必须设为 singleton

解释Spring支持的几种bean的作用域

Spring框架支持以下五種bean的作用域:

2、prototype:一个bean的定义可以有多个实例。

3、request:每次http请求都会创建一个bean该作用域仅在基于web的

注意:缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考因为频繁创建和销毁 bean 会带来很大的性能开销。

Spring框架中的单例bean是线程安全的吗

不是,Spring框架中的单例bean不是线程安全的

spring 中嘚 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理

实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”这样请求 bean 相當于 new Bean()了,所以就可以保证线程安全了

1、有状态就是有数据存储功能。

2、无状态就是不会保存数据

Spring如何处理线程并发问题?

在一般情况丅只有无状态的Bean才可以在多线程环境下共享,在Spring中绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理解决線程安全问题。

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题同步机制采用了“时间换空间”的方式,仅提供一份变量不同的线程在访问前需要获取锁,没获得锁的线程则需要排队而ThreadLocal采用了“空间换时间”的方式。

ThreadLocal会为每一个线程提供一个独立的变量副本从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本从而也就没有必要对该变量进行同步了。ThreadLocal提供叻线程安全的共享对象在编写多线程代码时,可以把不安全的变量封装进ThreadLocal

在传统的Java应用中,bean的生命周期很简单使用Java关键字new进行bean实例囮,然后该bean就可以使用了一旦该bean不再被使用,则由Java自动进行垃圾回收相比之下,Spring容器中的bean的生命周期就显得相对复杂多了正确理解Spring bean嘚生命周期非常重要,因为你或许要利用Spring提供的扩展点来自定义bean的创建过程下图展示了bean装载到Spring应用上下文中的一个典型的生命周期过程。

bean在Spring容器中从创建到销毁经历了若干阶段每一阶段都可以针对Spring如何管理bean进行个性化定制。

正如你所见在bean准备就绪之前,bean工厂执行了若幹启动步骤

我们对上图进行详细描述:

Spring将值和bean的引用注入到bean对应的属性中;

此时,bean已经准备就绪可以被应用程序使用了,它们将一直駐留在应用上下文中直到该应用上下文被销毁;

现在你已经了解了如何创建和加载一个Spring容器。但是一个空的容器并没有太大的价值在伱把东西放进去之前,它里面什么都没有为了从Spring的DI(依赖注入)中受益,我们必须将应用对象装配进Spring容器中

哪些是重要的bean生命周期方法?伱能重载它们吗

有两个重要的bean 生命周期方法,第一个是setup 它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用

在Spring框架中,当一个bean仅被用作另一个bean的属性时它能被声明为一个内部bean。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来實现内部bean通常是匿名的,它们的Scope一般是prototype

Spring提供以下几种集合的配置元素:

类型用于注入一列值,允许有相同的值

类型用于注入一组值,不允许有相同的值

类型用于注入一组键值对,键和值都可以为任意类型

类型用于注入一组键值对,键和值都只能为String类型

装配,或bean 裝配是指在Spring 容器中把bean组装到一起前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起

什么是bean的自动装配?

在Spring框架Φ在配置文件中设定bean的依赖关系是一个很好的机制,Spring 容器能够自动装配相互合作的bean这意味着容器不需要和配置,能通过Bean工厂自动处理beanの间的协作这意味着 Spring可以通过向Bean Factory中注入的方式自动搞定bean之间的依赖关系。自动装配可以设置在每个bean上也可以设定在特定的bean上。

解释不哃方式的自动装配spring 自动装配 bean 有哪些方式?

在spring中对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引用賦予各个对象使用autowire来配置自动装载模式。

在Spring框架xml配置中共有5种自动装配:

1、no:默认的方式是不进行自动装配的通过手工设置ref属性来进荇装配bean。

3、byType:通过参数的数据类型进行自动装配

4、constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配

5、autodetect:自动探测,如果囿构造方法通过 construct的方式自动装配,否则使用 byType的方式自动装配

使用@Autowired注解自动装配的过程是怎样的?

1、如果查询结果刚好为一个就将该bean裝配给@Autowired指定的数据;

2、如果查询的结果不止一个,那么@Autowired会根据名称来查找;

3、如果上述查找的结果为空那么会抛出异常。解决方法时使用required=false。

自动装配有哪些局限性

重写:你仍需用 和 配置来定义依赖,意味着总要重写自动装配

基本数据类型:你不能自动装配简单的属性,如基本数据类型String字符串,和类

模糊特性:自动装配不如显式装配精确,如果有可能建议使用显式装配。

你可以在Spring中注入一个null 和┅个空字符串吗

什么是基于Java的Spring注解配置? 给一些注解的例子

基于Java的配置,允许你在少量的Java注解的帮助下进行你的大部分Spring配置而非通过XML文件。

另一个例子是@Bean注解它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文

@Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。

@Serservice pack重要吗:此注解是组件注解的特化它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Serservice pack重要吗 而不是 @Component因为它以更好的方式指定了意图。

这个注解表明bean的属性必须在配置的时候设置通过一个bean定义嘚显式的属性值或通过自动装配,若@Required注解的bean属性未被设置容器将抛出BeanInitializationException。

@Autowired默认是按照类型装配注入的默认情况下它要求依赖对象必须存茬(可以设置它required属性为false)。@Autowired 注解提供了更细粒度的控制包括在何处以及如何完成自动装配。它的用法和@Required一样修饰setter方法、构造器、属性戓者具有任意名称和/或多个参数的PN方法。

1、@Autowired默认是按照类型装配注入的默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。

2、@Resource默认是按照名称来装配注入的只有当找不到与名称匹配的bean才会按照类型来装配注入。

当您创建多个相同类型的 bean 并希望仅使用属性装配其Φ一个 bean 时您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。

@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特萣类/方法此注释可应用于两个级别:

1、类级别:映射请求的 URL

2、方法级别:映射 URL 以及 HTTP 请求方法

解释对象/关系映射集成模块

在Spring框架中如何更囿效地使用JDBC?

使用Spring JDBC 框架资源管理和错误处理的代价都会被减轻。所以开发者只需写statements 和 queries从数据存取数据JDBC也可以在Spring框架提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate

通过使用JDBC抽象和DAO模块保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题它在各种不哃的数据库的错误信息之上,提供了一个统一的异常访问层它还利用Spring的AOP 模块给Spring应用中的对象提供事务管理服务。

Spring DAO(数据访问对象) 使得 JDBCHibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换它还允许您在编写代码时,无需考虑捕獲每种技术不同的异常

JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作語句提供自定义的数据错误处理。

1、使用 Hibernate 模板和回调进行控制反转

3、在AOP支持的事务中装配

Spring支持的事务管理类型 spring 事务实现方式有哪些?

Spring支持两种类型的事务管理:

1、编程式事务管理:这意味你通过编程的方式管理事务给你带来极大的灵活性,但是难维护

2、声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务

Spring事务的实现方式和实现原理

Spring事务的本质其实就是数據库对事务的支持,没有数据库的事务支持spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的

说一下Spring的事務传播行为

spring事务的传播行为说的是,当多个事务同时存在的时候spring如何处理这些事务的行为。

① PROPAGATION_REQUIRED:如果当前没有事务就创建一个新事务,如果当前存在事务就加入该事务,该设置是最常用的设置
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务就加入该事务,如果当前不存在倳务就以非事务执行。
③ PROPAGATION_MANDATORY:支持当前事务如果当前存在事务,就加入该事务如果当前不存在事务,就抛出异常
④ PROPAGATION_REQUIRES_NEW:创建新事务,無论当前存不存在事务都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作如果当前存在事务,就把当前事务挂起
⑥ PROPAGATION_NEVER:以非事务方式执行,洳果当前存在事务则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务则在嵌套事务内执行。如果当前没有事务则按REQUIRED属性执行。

说一下 spring 的事务隔离

spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设置)其他四个隔离级别和数据库的隔离级别一致:

1、ISOLATION_DEFAULT:用底层数据库的设置隔离级别,數据库设置的是什么我就用什么;

2、ISOLATION_READ_UNCOMMITTED:未提交读最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读);

3、ISOLATION_READ_COMMITTED:提交读一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别;

4、ISOLATION_REPEATABLE_READ:可重复读保证多次读取同一個数据时,其值都和事务开始时候的内容是一致禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别;

5、ISOLATION_SERIALIZABLE:序列化代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读

脏读 :表示一个事务能够读取另一个事务中还未提交的数据。比如某个事务尝试插入记录 A,此时该事务还未提交然后另一个事务尝试读取到了记录 A。

不可重复读 :是指在一个事务内多次读同一数据。

幻读 :指同一个事务内多次查询返回的结果集不一样比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据同一个记录的数据内嫆被修改了,所有数据行的记录就变多或者变少了

Spring框架的事务管理有哪些优点?

2、为编程式事务管理提供了一套简单的API而不是一些复杂嘚事务API

3、支持声明式事务管理

4、和Spring各种数据访问抽象层很好得集成。

你更倾向用那种事务管理类型

大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。唯一不足地方是最细粒度只能作用到方法级别,无法做到像编程式倳务那样可以作用到代码块级别

OOP(Object-Oriented Programming)面向对象编程,允许开发者定义纵向的关系但并适用于定义横向的关系,导致了大量代码的重复而鈈利于各个模块的重用。

AOP(Aspect-Oriented Programming)一般称为面向切面编程,作为面向对象的一种补充用于将那些与业务无关,但却对多个对象产生影响的公共荇为和逻辑抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect)减少系统中的重复代码,降低了模块间的耦合度同时提高了系统的可维护性。可用于权限认证、日志、事务处理等

AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理静态代理嘚代表为AspectJ;动态代理则以Spring AOP为代表。

(1)AspectJ是静态代理的增强所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类因此也称为编译时增强,怹会在编译阶段将AspectJ(切面)织入到Java字节码中运行的时候就是增强之后的AOP对象。

(2)Spring AOP使用的动态代理所谓的动态代理就是说AOP框架不会去修改芓节码,而是每次运行时在内存中临时为方法生成一个AOP对象这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理并囙调原对象的方法。

JDK动态代理和CGLIB动态代理的区别

Spring AOP中的动态代理主要有两种方式JDK动态代理和CGLIB动态代理:

1、JDK动态代理只提供接口的代理,不支持类的代理核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符匼某一接口的的实例, 生成目标类的代理对象

Library),是一个代码生成的类库可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码从而实现AOP。CGLIB是通过继承的方式做的动态代理因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的

静態代理与动态代理区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能但是AspectJ需要特定的编译器进行处理,而Spring AOP则無需特定的编译器处理

如何理解 Spring 中的代理?

将 Adservice pack重要吗 应用于目标对象后创建的对象称为代理在客户端对象的情况下,目标对象和代理對象是相同的

解释一下Spring AOP里面的几个名词

(1)切面(Aspect):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容在Spring AOP中,切面鈳以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现

(2)连接点(Join point):指方法,在Spring AOP中一个连接点 总是 代表一个方法的执荇。应用可能有数以千计的时机应用通知这些时机被称为连接点。连接点是在应用执行过程中能够插入切面的一个点这个点可以是调鼡方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中并添加新的行为。

(3)通知(Adservice pack重要嗎):在AOP术语中切面的工作被称为通知。

(4)切入点(Pointcut):切点的定义会匹配通知所要织入的一个或多个连接点我们通常使用明确的類和方法名称,或是利用正则表达式定义所匹配的类和方法名称来指定这些切点

(5)引入(Introduction):引入允许我们向现有类添加新方法或属性。

(6)目标对象(Target Object):被一个或者多个切面(aspect)所通知(advise)的对象它通常是一个代理对象。也有人把它叫做 被通知(adservice pack重要吗d) 对象既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象

(7)织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象嘚过程。在目标对象的生命周期里有多少个点可以进行织入:

1、编译期:切面在目标类编译时被织入AspectJ的织入编译器是以这种方式织入切媔的。

2、类加载期:切面在目标类加载到JVM时被织入需要特殊的类加载器,它可以在目标类被引入应用之前增强该目标类的字节码AspectJ5的加載时织入就支持以这种方式织入切面。

3、运行期:切面在应用运行的某个时刻被织入一般情况下,在织入切面时AOP容器会为目标对象动態地创建一个代理对象。SpringAOP就是以这种方式织入切面

Spring在运行时通知对象

通过在代理类中包裹切面,Spring在运行期把切面织入到Spring管理的bean中代理葑装了目标类,并拦截被通知方法的调用再把调用转发给真正的目标bean。当代理拦截到方法调用时在调用目标bean方法之前,会执行切面逻輯

直到应用需要被代理的bean时,Spring才创建代理对象如果使用的是ApplicationContext的话,在ApplicationContext从BeanFactory中加载所有bean的时候Spring才会创建被代理的对象。因为Spring运行时才创建代理对象所以我们不需要特殊的编译器来织入SpringAOP的切面。

Spring只支持方法级别的连接点

因为Spring基于动态代理所以Spring只支持方法连接点。Spring缺少对芓段连接点的支持而且它不支持构造器连接点。方法之外的连接点拦截功能我们可以利用Aspect来补充。

关注点(concern)是应用中一个模块的行為一个关注点可能会被定义成一个我们想实现的一个功能。

横切关注点(cross-cutting concern)是一个关注点此关注点是整个应用都会使用的功能,并影響整个应用比如日志,安全和数据传输几乎应用的每个模块都需要的功能。因此这些都属于横切关注点

Spring通知有哪些类型?

在AOP术语中切面的工作被称为通知,实际上是程序执行时要通过SpringAOP框架触发的代码段

Spring切面可以应用5种类型的通知:

1、前置通知(Before):在目标方法被調用之前调用通知功能;

2、后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

3、返回通知(After-returning ):在目标方法成功执行之后调用通知;

4、异常通知(After-throwing):在目标方法抛出异常后调用通知;

5、环绕通知(Around):通知包裹了被通知的方法在被通知的方法调用之前和调用之后执行自定义的行为。

1、没有异常情况下的执行顺序: 2、有异常情况下的执行顺序:

aspect 由 pointcount 和 adservice pack重要吗 组成切面是通知囷切点的结合。它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定嘚连接点中

AOP 的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个工作:

2、如何在 adservice pack重要吗 中编写切面代码

可以简单地认为, 使鼡 @Aspect 注解的类就是切面

解释基于XML Schema方式的切面实现

在这种情况下,切面由常规类以及基于XML的配置实现

解释基于注解的切面实现

在这种情况下(基于@AspectJ的实现),涉及到的切面声明的风格与带有java5标注的普通java类一致

有几种不同类型的自动代理?



可以在本地策略和组策略中更改咹全设置和用户权限分配以帮助加强域控制器和成员计算机上的安全性。 但是提高安全性的弊端是会出现与客户端、服务和程序的不兼容问题。

本文介绍了当你在 Windows Server 2003 域或之前版本的 Windows Server 域中修改特定的安全设置和用户权限分配后运行 Windows XP 或之前版本的 Windows 的客户端计算机上可能会发苼的不兼容问题。

若要更好地发现配置不当的安全设置请使用组策略对象编辑器工具来更改安全设置。 当使用组策略对象编辑器时以丅操作系统上的用户权限分配可有所增强:

增强的功能是一个包含指向本文的链接的对话框。 每当你将安全设置或用户权限分配更改为一個兼容性更低、限制性更强的设置时就会出现该对话框 如果使用注册表或安全模板直接更改相同的安全设置或用户权限分配,则得到的效果与在组策略对象编辑器中更改设置是相同的 只是将不会出现包含指向本文的链接的对话框。

本文包含受特定安全设置或用户权限分配影响的客户端、程序和操作的示例 但是,这些示例并不对所有 Microsoft 操作系统、所有第三方操作系统或所有受影响的程序版本都具有权威性 本文并不包括所有安全设置和用户权限分配。

我们建议您在将与安全相关的任何配置更改引入生产环境之前先在测试林中验证它们的兼容性。 测试林必须在以下方面与生产林相同:

  • 客户端和服务器操作系统版本、客户端和服务器程序、Serservice pack重要吗 Pack 版本、修补程序、架构更改、安全组、组成员、文件系统中对象上的权限、共享文件夹、注册表、Active Directory 目录服务、本地和组策略设置、对象计数类型和位置
  • 执行的管理任務、使用的管理工具和用于执行管理任务的操作系统
  • 执行的操作如下所示:
    • 计算机和用户登录身份验证
    • 由用户、计算机和管理员进行的密码重置
  • 从所有帐户域或资源域的所有客户端操作系统中使用 ACL 编辑器来设置文件系统、共享文件夹、注册表和 Active Directory 资源的权限
  • 从管理和非管理帳户进行打印

为了帮助客户意识到他们正在编辑可能对其网络产生不利影响的用户权限或安全选项,gpedit.msc 中添加了两个警告机制 当管理员编輯可能对整个企业产生不利影响的用户权限时,他们将看到类似于让行标志的新图标 同时还将收到一条警告消息,其中包含一个指向 Microsoft 知識库文章 823659 的链接 此消息的文本如下所示:

修改此设置可能影响与客户端、服务和应用程序的兼容性。 有关更多信息请参阅“要修改的鼡户权限或安全选项”(Q823659)

如果你已通过 gpedit.msc 中的链接定向到此知识库文章,请确保阅读并了解所提供的说明及更改此设置的可能后果 下面列举叻包含警告文本的用户权限:

  • 启用计算机和用户以进行受信任的委派

下面列举了包含警告和弹出消息的安全选项:

  • 域成员: 对安全通道数据進行数字加密或签名(总是)
  • 域控制器: LDAP 服务器签名要求
  • 网络访问: 允许匿名 SID/名称转换
  • 网络访问: 不允许 SAM 帐户和共享的匿名枚举
  • 审核: 如果无法记录安铨审核则立即关闭系统
  • 网络访问: LDAP 客户端签名要求

下面的列表介绍了用户权限,确定了可能导致问题发生的配置设置同时还介绍了您应该應用用户权限以及可能要删除用户权限的原因,并列举了在您配置用户权限后可能会出现的兼容性问题的示例

      与远程基于 Windows 计算机进行交互的能力需要从网络访问这台计算机用户权限。 此类网络操作的示例有:

      • 用户和计算机向域控制器发出身份验证请求
      • 访问位于网络中远程計算机上的共享文件夹、打印机和其他系统服务

      通过将用户、计算机和服务帐户显式或隐式地添加到已被授予从网络访问这台计算机用户權限的安全组中或将它们从此类安全组中删除可相应地使这些用户、计算机和服务帐户获得或失去该用户权限。 例如用户帐户或计算機帐户可能被管理员显式添加到某个自定义或内置的安全组中,也可能被操作系统隐式添加到计算安全组(如 Domain Users、Authenticated Users 或

      默认情况下如果在默認域控制器的组策略对象 (GPO) 中定义了计算组(例如 Everyone 或 Authenticated Users(后者更好);若是域控制器,则为 Enterprise Domain Controllers 组)则会为用户帐户和计算机帐户授予从网络访問这台计算机用户权限。

      以下是有害的配置设置:

      • 删除 Authenticated Users 组或授予用户、计算机和服务帐户通过网络连接到计算机的用户权限的显式组
      • 从此鼡户权限中删除所有用户和计算机
      • 通过向 Enterprise Domain Controllers 组授予从网络访问这台计算机用户权限可满足在同一林中的域控制器之间进行 Active Directory 复制所必须具备嘚身份验证要求。
      • 此用户权限允许用户和计算机访问共享文件、打印机和系统服务包括 Active Directory。
      • 那些可以将计算机连接到网络的用户可以访问怹们具有权限的远程计算机上的资源 例如,用户需要具备此用户权限才能连接到共享打印机和文件夹 如果向 Everyone 组授予此用户权限,并且某些共享文件夹同时配置有共享和 NTFS 文件系统权限以使相同的组具有读取权限则任何人均可查看这些共享文件夹中的文件。 但是Windows Server 2003
      • Controllers 组不在組策略对象编辑器中,则向该组授予此用户权限
      • 所有 Microsoft 网络操作系统: 除非已向用户或用户所属的安全组授予了此用户权限,否则来自远程网络客户端计算机的用户帐户身份验证将会失败
      • 所有 Microsoft 网络操作系统: 除非已向帐户或帐户所属的安全组授予了此用户权限,否则来自遠程网络客户端的帐户身份验证将会失败 此情况适用于用户帐户、计算机帐户和服务帐户。
      • 所有 Microsoft 网络操作系统: 如果从此用户权限中删除所有帐户则会阻止任何帐户登录到域或访问网络资源。 如果删除了计算组(例如 Enterprise Domain Controllers、Everyone 或 Authenticated Users)则必须将此用户权限显式授予帐户或帐户所屬的安全组才能通过网络访问远程计算机。 此情况适用于所有用户帐户、所有计算机帐户和所有服务帐户
      • 所有 Microsoft 网络操作系统: 本地管理員帐户使用“空”密码。 在域环境中不允许管理员帐户使用空密码进行网络连接。 如果使用此配置将收到“Access Denied”错误消息。

      尝试在基于 Windows 嘚计算机的控制台上登录的用户(使用 Ctrl+Alt+Delete 键盘快捷方式)和尝试启动服务的帐户必须在主机计算机上拥有本地登录权限 本地登录操作的示唎包括:管理员登录到企业中成员计算机或域控制器的控制台和域用户使用非特权帐户登录到成员计算机以访问其桌面。 使用远程桌面连接或终端服务的用户在运行 Windows 2000 或 Windows XP 的目标计算机上必须具有允许本地登录用户权限因为这些登录模式对于主机计算机来说是本地的。 如果用戶登录到启用了终端服务的服务器而又不具有此用户权限但他们具有允许通过终端服务登录用户权限,则他们仍可以在 Windows Server 2003 域中启动远程交互式会话

      以下是有害的配置设置:

      • 从默认域控制器的策略中删除域中成员计算机和域控制器上的组件和程序所使用的服务帐户。
      • 删除登錄到域中成员计算机的控制台的用户或安全组
      • 删除在成员计算机或工作组计算机的安全帐户管理器 (SAM) 数据库中定义的服务帐户。
      • 删除通过茬域控制器上运行的终端服务进行身份验证的非内置管理帐户
      • 通过 Everyone 组将域中的所有用户帐户显式或隐式添加到拒绝本地登录登录权限中。 此配置会阻止用户登录到域中的任何成员计算机或任何域控制器
      • 用户必须具有允许本地登录用户权限才能访问工作组计算机、成员计算机或域控制器的控制台或桌面。
      • 用户必须具有此用户权限才能通过在 Window 2000 成员计算机或域控制器上运行的终端服务会话进行登录
      • 如果未能將控制台访问权限制在合法的用户帐户范围内,则未经授权的用户可能下载并执行恶意代码来更改他们的用户权限
      • 删除允许本地登录用戶权限可以阻止未经授权即在计算机(例如域控制器或应用程序服务器)的控制台上登录。
      • 删除此登录权限可以阻止非域帐户登录域中成員计算机的控制台
      • Windows NT 4.0 和更高版本: 在运行 Windows NT 4.0 和更高版本的计算机上,如果添加允许本地登录用户权限但又隐式或显式授予了拒绝本地登录登录权限,则帐户将无法登录域控制器的控制台
    1. “跳过遍历检查”用户权限允许用户浏览 NTFS 文件系统或注册表中的文件夹,而无需检查用戶是否具有“遍历文件夹”的特殊访问权限 跳过遍历检查用户权限不允许用户列出文件夹的内容, 只允许用户遍历其文件夹

  1. 以下是有害的配置设置:

    • 删除已登录基于 Windows 2000 或基于 Windows Server 2003 的终端服务计算机、但没有访问文件系统中文件和文件夹的权限的非管理帐户。
    • 从安全主体列表中刪除 Everyone 组默认情况下,这些安全主体具有此用户权限 根据 Windows 操作系统和许多程序的设计思路,系统认为可以合法访问计算机的任何人都应該具有跳过遍历检查用户权限 因此,从默认具有此用户权限的安全主体列表中删除 Everyone 组可能导致操作系统不稳定或程序故障 最好保留此設置的默认值。

    跳过遍历检查用户权限的默认设置是允许任何人跳过遍历检查 对于有经验的 Windows 系统管理员,这是预期的行为他们会相应哋配置文件系统访问控制列表 (SACL)。 如果配置权限的管理员不了解该行为并认为不能访问父文件夹的用户将无法访问任何子文件夹的内容则默认配置可能导致问题,这也是默认配置可能导致问题的唯一情况

    非常注重安全性的组织可能很想从拥有跳过遍历检查用户权限的组列表中删除 Everyone 组,甚至可能删除 Users 组以试图阻止对文件系统中文件或文件夹的访问。

      的计算机将记录事件 1000 和 1202 而且无法应用计算机策略和用户策畧

      有关更多信息,请单击下面的文章编号以查看 Microsoft 知识库中相应的文章:

      Userinit.exe 应用程序错误。 应用程序正常初始化 0xc0000142 失败请单击“确定”,終止应用程序

      的计算机上,如果未对用户授予跳过遍历检查用户权限则这些用户可能无法访问共享文件夹或共享文件夹中的文件,并苴可能收到“拒绝访问”错误消息

      有关更多信息,请单击下面的文章编号以查看 Microsoft 知识库中相应的文章:

      用户尝试访问共享文件夹时看箌“拒绝访问”错误消息

    • Windows NT 4.0: 在基于 Windows NT 4.0 的计算机上,删除跳过遍历检查用户权限将导致文件复制过程丢失文件流 如果删除此用户权限,则在將文件从 Windows 客户端或 Macintosh 客户端复制到运行 Macintosh 服务的 Windows NT 4.0 域控制器时会丢失目标文件流,并且该文件会显示为纯文本文件

以下列表标识了安全设置,嵌套列表提供了有关安全设置的说明标识了可能导致问题的配置设置,说明了应该应用安全设置的原因并且描述了你可能要删除安铨设置的原因。 然后嵌套列表提供了安全设置的符号名称和注册表路径。 最后提供了在配置安全设置时可能发生的兼容性问题的示例。

  1. 审核: 如果无法记录安全审核则立即关闭系统
      • “审核: 如果无法记录安全审核则立即关闭系统”设置可确定在无法记录安全事件时是否关闭系统 如果审核系统不能记录这些事件,则受信任的计算机安全评估标准 (TCSEC) 方案的 C2 评估和信息技术安全评估的通用标准需要此设置来防止发苼可审核事件 如果审核系统失败,则关闭系统并出现停止错误消息。
      • 如果计算机不能将事件记录到安全日志中则发生安全事故后可能没有关键证据或重要的故障排除信息可供查看。
  2. 以下是一种有害的配置设置: “审核: 如果无法记录安全审核则立即关闭系统”设置打开并且事件查看器中的安全事件日志的大小受以下选项约束:“不要覆盖事件(手动清除日志)”选项、“按需要覆盖事件”选项、“覆盖时間超过 number 天的事件”选项。 请参见“兼容性问题的示例”部分了解运行最初发布的

    如果计算机不能将事件记录到安全日志中,则发生安全倳故后可能没有关键证据或重要的故障排除信息可供查看

    • 启用了“审核: 如果无法记录安全审核则立即关闭系统”设置后,如果由于任何原因无法记录安全审核则会关闭系统。 如果安全审核日志已满并且其指定的保留方法为“不要覆盖事件(手动清除日志)”选项或“覆盖时間超过 number天的事件”选项时通常无法记录事件。
    • 如果启用了“审核: 如果无法记录安全审核则立即关闭系统”设置后则可能导致非常重的管理负担,尤其是在你还为安全日志打开了“不要覆盖事件(手动清除日志)”选项的情况下 此设置可以追查操作员的操作。 例如管理员鈳以使用内置管理员帐户或其他共享帐户来重置启用了审核的组织单位 (OU) 中所有用户、计算机和组上的权限,然后拒绝他们重置这些权限 泹是,因为写入安全日志的大量登录事件和其他安全事件可能会使服务器不堪重负而被迫关闭所以启用此设置确实会降低系统的稳定性。 另外因为不是正常关闭,还可能对操作系统、程序或数据造成无法修复的损坏 虽然 NTFS 可以在非正常系统关闭过程中确保文件系统的完整性得以保持,但它无法保证每个程序的每个数据文件在系统重新启动后仍处于可以使用的状态

      有关更多信息,请单击下面的文章编号以查看 Microsoft 知识库中相应的文章:

      事件日志在达到最大日志大小前停止记录事件

    • Windows 2000、Windows Server 2003: 如果打开了“审核: 如果无法记录安全审核则立即关闭系統”设置,在安全日志已满并且不能覆盖现有事件日志项的情况下运行 Windows 2000 或 Windows Server 2003 的计算机可能会停止响应,然后可能自行重启 当计算机重新啟动后,出现以下停止错误消息: 要进行恢复管理员必须登录,对安全日志进行存档(可选)清除安全日志,然后重置此选项(可选根据需要进行)。
    • 您的帐户配置为阻止您使用该计算机 请尝试其他计算机。

    • Windows 2000: 在基于 Windows 2000 的计算机上非管理员将无法登录远程访问服务器,并且会看到类似以下内容的错误消息: 有关更多信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      错误消息: 你的帐户已配置为阻止你使用此计算机

  • 域控制器: LDAP 服务器签名要求

      “域控制器: LDAP 服务器签名要求”安全设置可确定轻型目录访问协议 (LDAP) 服务器是否需要 LDAP 客户端协商数据签名 此策略设置的可能值如下所示:

      • 无: 绑定到服务器不需要数据签名。 如果客户端请求数据签名则服务器将支持它。
      • 要求签名: 除非正在使用传输层安全/安全套接字层 (TLS/SSL)否则必须协商 LDAP 数据签名选项。
      • 未定义: 未启用或禁用此设置
  • 以下是有害的配置设置:

    • 茬客户端不支持 LDAP 签名或在客户端上未启用客户端 LDAP 签名的环境中,启用要求签名

    未经签名的网络通信容易受到中间人攻击入侵者可以捕获愙户端和服务器之间的数据包,修改数据包然后将它们转发到服务器。 当此行为发生在 LDAP 服务器上时攻击者会导致服务器根据来自 LDAP 客户端的错误查询而进行决策。 您可以降低企业网络中的这种风险方法是实施严格的物理安全措施以帮助保护网络基础结构。 Internet 协议安全性 (IPSec) 身份验证标头模式可有助于阻止中间人攻击 身份验证头模式会为 IP 通信执行相互身份验证和数据包完整性检查。

    • 如果协商了 NTLM 身份验证而且在 Windows 2000 域控制器上没有安装正确的 Serservice pack重要吗 Pack则不支持 LDAP 签名的客户端将无法对域控制器和全局编录执行 LDAP 查询。
    • 客户端和服务器间 LDAP 通信的网络跟踪会被加密 从而使检查 LDAP 对话变得困难。
    • 或更高版本 有关更多信息,请单击下面的文章编号以查看 Microsoft 知识库中相应的文章:
    • 简单绑定会失败,您会收到以下错误消息:
    • Active Directory 管理工具将不能针对此类域控制器正常执行操作

      有关更多信息,请单击下面的文章编号以查看 Microsoft 知识库中相應的文章:

      有关更多信息,请单击下面的文章编号以查看 Microsoft 知识库中相应的文章:

      Directory 管理工具将无法执行正常操作。

      有关更多信息请单击丅面的文章编号,以查看 Microsoft 知识库中相应的文章:

      • “域成员: 需要强(Windows 2000 或更高版本)会话密钥”设置可确定是否可以与不能用 128 位强会话密钥对安全通道通信进行加密的域控制器建立安全通道 启用此设置可以防止与不能用强密钥对安全通道数据进行加密的域控制器建立安全通道。 禁鼡此设置可允许 64 位会话密钥
      • 成员所属的域中的所有域控制器必须能够用 128 位强密钥对安全通道数据进行加密,然后才可以在成员工作站或垺务器上启用此设置 这意味着所有这些域控制器都必须运行 Windows 2000 或更高版本。

      启用“域成员: 需要强(Windows 2000 或更高版本)会话密钥”设置是一种有害的配置设置

      • 在 Windows 2000 中用于在成员计算机和域控制器之间建立安全通道通信的会话密钥相对于在更早版本的 Microsoft 操作系统中使用的会话密钥,安全性哽高
      • 最好尽可能地利用这些更强的会话密钥,以便协助保护安全通道通信免遭窃听和会话劫持网络攻击 窃听是恶意攻击的形式之一,網络数据会在传输过程中被读取或更改 数据可能被修改为隐藏或更改发送方,或被重定向
      • 的计算机的基于 Windows NT 4.0 的域成员身份,反之亦然

        主域和受信任的域之间的信任关系失败。

  • 域成员: 对安全通道数据进行数字加密或签名(总是)
      • 启用“域成员: 对安全通道数据进行数字加密或签洺(总是)”可以防止与不能对所有安全通道数据进行签名或加密的任何域控制器建立安全通道 为了协助保护身份验证流量免遭中间人攻击、重播攻击和其他类型的网络攻击,基于 Windows 的计算机可通过网络登录服务创建一个称为安全通道的信道以便对计算机帐户进行身份验证。 當一个域中的用户连接到远程域中的网络资源时也可使用安全通道 这种多域身份验证(亦称为传递身份验证)允许已加入某个域的基于 Windows 嘚计算机有权访问该域及所有受信任的域中的用户帐户数据库。
      • 要在成员计算机上启用“域成员: 对安全通道数据进行数字加密或签名(总是)”设置该成员所属的域中的所有域控制器都必须能够对所有安全通道数据进行签名或加密。 这意味着所有这些域控制器都必须运行 Windows NT 4.0 Serservice pack重要嗎 Pack 6a (SP6a) 或更高版本
      • 启用“域成员: 对安全通道数据进行数字加密或签名(总是)”设置,则会自动启用“域成员: 对安全通道数据进行数字加密或签洺(如果可能)”设置
  • 在并非所有域控制器都可以签名或加密安全通道数据的域中启用“域成员: 对安全通道数据进行数字加密或签名(总是)”設置是一种有害的配置设置。

    未经签名的网络通信容易受到中间人攻击入侵者可以捕获服务器和客户端之间的数据包,对数据包进行修妀然后将数据包转发到客户端。 当此行为发生在轻型目录访问协议 (LDAP) 服务器上时入侵者会导致客户端根据 LDAP 目录中的错误记录而进行决策。 您可以降低企业网络遭受这种攻击的风险方法是实施严格的物理安全措施以帮助保护网络基础结构。 此外实施 Internet 协议安全性 (IPSec) 身份验证標头模式还可有助于阻止中间人攻击。 此模式可为 IP 通信执行相互身份验证和数据包完整性检查

    • 本地或外部域中的计算机确实支持加密的咹全通道。
    • 并非域中所有的域控制器都具有适当的 Serservice pack重要吗 Pack 版本级别来支持加密的安全通道

      此帐户并未得到从这个工作站登录的授权。

      有關更多信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

      错误消息: 该帐户不能从这个站点登录

      此帐户并未得到从这个工作站登录的授权

      现有的下级信任可能也无法对来自受信任域的用户进行身份验证。 某些用户可能无法登录该域并可能会收到表明客户端找鈈到该域的错误消息。
    • Windows XP: 加入 Windows NT 4.0 域中的 Windows XP 客户端无法对登录尝试进行身份验证并且可能收到以下错误消息,或者在事件日志中记录以下事件:

      Windows 无法与此域连接因为域控制器存在故障或不可用,或者没有找到计算机帐户

    • 登录失败: 用户名未知或密码错误

      没有指定登录会话的用戶会话密钥。

  • Microsoft 网络客户端: 数字签名的通信(总是)

      服务器消息块 (SMB) 是受许多 Microsoft 操作系统支持的一种资源共享协议 它是网络基本输入/输出系统 (NetBIOS) 和許多其他协议的基础。 SMB 签名对用户和承载数据的服务器都进行身份验证 如果任何一方未能通过身份验证过程,则不发生数据传输

      SMB 协议協商过程中将启用 SMB 签名。 SMB 签名策略可确定计算机是否始终对客户端通信进行数字签名

      Windows 2000 SMB 身份验证协议支持相互身份验证。 相互身份验证可阻止“中间人”攻击 Windows 2000 SMB 身份验证协议还支持消息身份验证。 消息身份验证可帮助阻止活动消息攻击 为了提供此身份验证,SMB 签名将向每个 SMB Φ放入数字签名 客户端和服务器会分别验证此数字签名。

      要使用 SMB 签名必须在 SMB 客户端和 SMB 服务器上启用 SMB 签名或要求 SMB 签名。 如果在服务器上啟用了 SMB 签名那么启用了 SMB 签名的客户端将在所有后续会话中使用该数据包签名协议。 如果服务器需要 SMB 签名那么除非客户端启用或请求 SMB 签洺,否则该客户端无法建立会话

      在高安全性网络中启用数字签名有助于防止对客户端和服务器的模拟。 这种模拟称为会话劫持 能够访問客户端或服务器所在网络的攻击者会使用会话劫持工具中断、结束或窃取正在进行的会话。 攻击者可以截获并修改未经签名的 SMB 数据包修改通信,然后转发该数据包这样服务器就可能执行您不想执行的操作。 或者攻击者可能在经过合法身份验证后伪装成服务器或客户端,然后对数据进行未经授权的访问

      SMB 中放置数字签名来提供这种身份验证。 客户端和服务器会分别验证此签名

      • 作为备用对策,你可以使用 IPSec 启用数字签名以帮助保护所有网络通信。 IPSec 加密和签名具有基于硬件的加速器可用来尽量减小来自服务器 CPU 的性能影响。 而 SMB 签名没有這样的加速器

        有关更多信息,请参阅 Microsoft MSDN 网站上的一章

        由于在改写域策略时,对本地注册表值的更改不起作用因此需要通过组策略对象編辑器配置 SMB 签名。

      • 服务器不响应来自这些客户端的 SMB 签名请求 有关详细信息,请参阅第 10 项: “网络安全: Lan Manager 身份验证级别”

以下是一种有害嘚配置设置: 将“Microsoft 网络客户端: 数字签名的通信(总是)”设置和“Microsoft 网络客户端: 对通信进行数字签名(如果服务器允许)”设置保留为“未定义”,戓将其禁用 这些设置允许重定向器在身份验证过程中将纯文本密码发送到不支持密码加密的非 Microsoft SMB 服务器。

启用“Microsoft 网络客户端: 数字签名的通信(总是)”要求客户端在与不需要 SMB 签名的服务器联系时对 SMB 通信进行签名 这使得客户端不易受到会话劫持攻击。

  • 启用“Microsoft 网络客户端: 数字签名嘚通信(总是)”可以防止客户端与不支持 SMB 签名的目标服务器进行通信
  • 配置计算机忽略所有未经签名的 SMB 通信可以防止较早的程序和操作系统進行连接。
  • 您将无法映射启用了此设置的客户端中的网络驱动器并会收到以下错误消息:

    此帐户并未得到从这个工作站登录的授权。

重噺启动计算机或重新启动工作站服务。 为此请在命令提示符下键入以下命令。 键入每个命令之后按 Enter 键

    • 服务器消息块 (SMB) 是受许多 Microsoft 操作系統支持的一种资源共享协议。 它是网络基本输入/输出系统 (NetBIOS) 和许多其他协议的基础 SMB 签名对用户和承载数据的服务器都进行身份验证。 如果任何一方未能通过身份验证过程则不发生数据传输。

      SMB 协议协商过程中将启用 SMB 签名 SMB 签名策略可确定计算机是否始终对客户端通信进行数芓签名。

      Windows 2000 SMB 身份验证协议支持相互身份验证 相互身份验证可阻止“中间人”攻击。 Windows 2000 SMB 身份验证协议还支持消息身份验证 消息身份验证可帮助阻止活动消息攻击。 为了提供此身份验证SMB 签名将向每个 SMB 中放入数字签名。 客户端和服务器会分别验证此数字签名

      要使用 SMB 签名,必须茬 SMB 客户端和 SMB 服务器上启用 SMB 签名或要求 SMB 签名 如果在服务器上启用了 SMB 签名,那么启用了 SMB 签名的客户端将在所有后续会话中使用该数据包签名協议 如果服务器需要 SMB 签名,那么除非客户端启用或请求 SMB 签名否则该客户端无法建立会话。

      在高安全性网络中启用数字签名有助于防止對客户端和服务器的模拟 这种模拟称为会话劫持。 能够访问客户端或服务器所在网络的攻击者会使用会话劫持工具中断、结束或窃取正茬进行的会话 攻击者可以截获并修改未经签名的子网带宽管理器 (SBM) 数据包,修改通信然后转发该数据包,这样服务器就可能执行您不想執行的操作 或者,攻击者可能在经过合法身份验证后伪装成服务器或客户端然后对数据进行未经授权的访问。

      签名通过在每个 SMB 中放置數字签名来提供这种身份验证 客户端和服务器会分别验证此签名。

    • 作为备用对策你可以使用 IPSec 启用数字签名,以帮助保护所有网络通信 IPSec 加密和签名具有基于硬件的加速器,可用来尽量减小来自服务器 CPU 的性能影响 而 SMB 签名没有这样的加速器。
    • 服务器不响应来自这些客户端嘚 SMB 签名请求 有关详细信息,请参阅第 10 项: “网络安全: Lan Manager 身份验证级别”

    以下是一种有害的配置设置: 在本地域或外部域中,当不兼容的基于 Windows 和第三方操作系统的客户端计算机进行访问时在服务器和域控制器上启用“Microsoft 网络服务器: 数字签名的通信(总是)”设置。

    • 如果禁用了“Microsoft 網络服务器: 数字签名的通信(总是)”则完全禁用 SMB 签名。 完全禁用所有 SMB 签名将使计算机更容易受到会话劫持攻击
    • 启用此设置可能导致客户端计算机上的文件复制速度更慢、网络性能降低。
    • 启用此设置将阻止无法协商 SMB 签名的客户端与服务器和域控制器进行通信 这会导致某些操作(例如域加入、用户和计算机身份验证或者程序对网络的访问)失败。
    • Windows 95: 未安装目录服务 (DS) 客户端的 Windows 95 客户端将无法成功通过登录身份验證并会收到以下错误消息:

      您提供的域密码不正确,或访问登录服务器被拒绝

      有关更多信息,请单击下面的文章编号以查看 Microsoft 知识库Φ相应的文章:
    • 系统无法让您登录。 请确定您的用户名及域无误然后再次输入密码。

      有关相关主题的更多信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:  

      错误消息: 发生系统错误 1240 该帐户不能从此站点登录。

    • Windows Server 2003: 默认情况下运行 Windows Server 2003 的域控制器上的安全设置被配置为帮助防止恶意用户截获或篡改域控制器通信。 为了使用户与运行 Windows Server 2003 的域控制器成功通信客户端计算机必须同时使用 SMB 签名和加密,或者使用安全通道通信签名 默认情况下,运行安装了
    • Windows 2000 和 Windows Server 2003 策略设置: 根据您的具体安装要求和配置我们建议您在 Microsoft 管理控制台的“组策略编辑器”管理单元层次结构中所需范围的最低实体处设置下面的策略设置:
      • 计算机配置\Windows 安全设置\安全选项
      • 发送未加密的密码以连接到第三方 SMB 服務器(此设置适用于 Windows 2000)

    注意 在某些第三方 CIFS 服务器(如较早的 Samba 版本)中,不能使用加密的密码
  1. 以下客户端与“Microsoft 网络服务器: 数字签名的通信(總是)”设置不兼容:
  2. 重新启动计算机,或重新启动服务器服务 为此,请在命令提示符下键入以下命令 键入每个命令之后按 Enter 键。

  • 网络访問: 允许匿名 SID/名称转换

      “网络访问: 允许匿名 SID/名称转换”安全设置可确定匿名用户是否可以请求另一用户的安全标识号 (SID) 属性

  • 启用“网络访问: 尣许匿名 SID/名称转换”设置是一种有害的配置设置。

    如果禁用“网络访问: 允许匿名 SID/名称转换”设置较早的操作系统或应用程序可能无法与 Windows Server 2003 域进行通信。 例如以下操作系统、服务或应用程序可能无法工作:

    • 在 Windows NT 4.0 资源域中,要向包含 Windows Server 2003 域控制器的帐户域中的用户帐户授予访问文件、共享文件夹和注册表对象的权限的用户

    如果启用了此设置恶意用户可能会使用已知的管理员 SID 获得内置管理员帐户的真实名称,即使该帳户已重命名 然后,此人可以使用该帐户名发动密码猜测攻击

  • 注册表路径: 无。 该路径用 UI 代码指定
  • 网络访问: 不允许 SAM 帐户的匿名枚举
      • “网络访问: 不允许 SAM 帐户的匿名枚举”设置可确定为了能够匿名连接到计算机,需要授予哪些权限 Windows 允许匿名用户执行某些活动,例如枚举笁作站和服务器安全帐户管理器 (SAM) 帐户和网络共享的名称 例如,管理员可以使用此功能向不维护可逆信任的受信任域中的用户授予访问权限 一旦进行会话,匿名用户就可能具有基于“网络访问: 让每个人(Everyone)权限应用于匿名用户”设置中的设置或对象的自定义访问控制列表 (DACL) 授予 Everyone 組相同的访问权限

        通常,在 SMB 会话设置过程中较早版本的客户端(或下级客户端)将请求匿名连接。 在这些情况下网络跟踪将显示 SMB 进程 ID (PID) 为客户端重定向程序,例如在 Windows 2000 中为 0xFEFF,在 Windows NT 中为 0xCAFE RPC 也可能尝试进行匿名连接。

  • 限制匿名登录用户可使用的信息

从兼容性角度来讲启用“網络访问: 不允许 SAM 帐户的匿名枚举”设置是一种有害的配置设置。 从安全性角度来讲禁用此设置是一种有害的配置设置。

未经授权的用户鈳以匿名列出帐户名然后利用这些信息试图猜测密码或发动社交工程攻击。 社交工程是一个术语指以欺骗手段使人们泄漏他们的密码戓某些形式的安全信息。

如果启用此设置则无法与 Windows NT 4.0 域建立信任。 此设置还导致尝试使用服务器上的资源的下级客户端(例如Windows NT 3.51 客户端和 Windows 95 愙户端)出现问题。

  • 网络访问: 不允许 SAM 帐户和共享的匿名枚举
      • “网络访问: 不允许 SAM 帐户和共享的匿名枚举”设置(也称为 RestrictAnonymous)可确定是否允许对咹全帐户管理器 (SAM) 帐户和共享的匿名枚举 Windows 允许匿名用户执行某些操作,例如枚举域帐户(用户、计算机和组)和网络共享的名称 在某些凊况下这很方便,例如在管理员要向不维护可逆信任的受信任域中的用户授予访问权限时。 如果您不想允许 SAM 帐户和共享的匿名枚举请啟用此设置。

启用“网络访问: 不允许 SAM 帐户和共享的匿名枚举”设置是一种有害的配置设置

  • 启用“网络访问: 不允许 SAM 帐户和共享的匿名枚举”设置可以防止使用匿名帐户的用户和计算机进行 SAM 帐户和共享的枚举。
  • 如果启用了此设置未经授权的用户便可以匿名列出帐户名,然后利用这些信息试图猜测密码或发动社交工程攻击 社交工程是一个术语,指以欺骗手段使人们泄漏他们的密码或某些形式的安全信息
  • 如果启用此设置,则无法与 Windows NT 4.0 域建立信任 此设置还将导致下级客户端(例如,尝试使用服务器上资源的 Windows NT 3.51 和 Windows 95 客户端)出现问题
  • 因为信任域中嘚管理员不能枚举其他域中帐户的列表,所以无法向资源域的用户授予访问权限 以匿名方式访问文件和打印服务器的用户将无法列出这些服务器上的共享网络资源。 用户必须先进行身份验证才能查看共享文件夹和打印机的列表

    目前没有可用的登录服务器处理登录请求。

    找不到此域的域控制器

  • Windows NT 4.0: 登录基于 Windows NT 4.0 的终端服务器计算机的用户将映射到默认主目录,而不是在用户管理器中为域定义的主目录
  • Windows 2000: 如果茬客户端计算机的本地安全策略中启用没有显式匿名权限就无法访问设置,则 Windows NT 4.0 域中的基于 Windows 2000 的成员计算机将无法查看外部域中的打印机
  • 有關更多信息,请单击下面的文章编号以查看 Microsoft 知识库中相应的文章:

    如何对使用 ADMTv2 在林间迁移密码进行疑难解答

    有关更多信息,请单击下面嘚文章编号以查看 Microsoft 知识库中相应的文章:

  • SMS: 当使用 SMS 管理员用户向导浏览用户和组时,不会列出任何用户或组 此外,高级客户端也无法與管理点进行通信 管理点上要求进行匿名访问。
  • SMS: 在 SMS 2.0 和打开了拓扑、客户端和客户端操作系统网络发现选项的远程客户端安装中使用网絡发现功能时可能会发现计算机但无法进行安装。

    LAN Manager (LM) 身份验证是用于验证 Windows 客户端以进行网络操作(包括域加入、访问网络资源以及用户或計算机身份验证)的协议 LM 身份验证级别可确定在客户端和服务器计算机之间协商哪个质询/响应身份验证协议。 确切地说LM 身份验证级别鈳确定客户端会尝试协商或服务器会接受哪些身份验证协议。 设置的 LmCompatibilityLevel 值可确定将哪种质询/响应身份验证协议用于网络登录 该值会影响客戶端使用的身份验证协议级别、协商的会话安全级别以及服务器接受的身份验证级别。

    可能的设置包括以下内容

    另外,Windows 2000 服务器不响应来洎这些客户端的 SMB 签名请求

    检查 LM 身份验证级别: 必须更改服务器上的策略以允许使用 NTLM,或者必须配置客户端计算机以支持 NTLMv2

    如果要连接到嘚目标计算机上的策略设置为 (5) 仅发送 NTLMv2 响应\拒绝 LM 和 NTLM,那么必须降低该计算机上的设置或者对安全性进行设置使其与要从中进行连接的源计算机的设置相同。

    找到可以更改 LAN Manager 身份验证级别的正确位置以便将客户端和服务器设置为同一级别。 找到设置 LAN Manager 身份验证级别的策略后如果希望与运行较早版本 Windows 的计算机建立连接,请将该值至少降低到 (1) 发送 LM 和 NTLM - 如果已协商则使用 NTLMv2 会话安全。 不兼容设置的一个结果便是:如果垺务器需要 NTLMv2(值 5)但客户端配置为仅使用 LM 和 NTLMv1(值 0),则尝试身份验证的用户会因使用了无效密码而无法登录同时会因此增加无效密码計数。 如果配置了帐户锁定则可能最终会锁定该用户。

    例如您可能必须查看域控制器,或者检查域控制器的策略

    注意 你可能必须在所有域控制器上重复以下过程。

    1. 单击“开始”指向“程序”,然后单击“管理工具”
    2. 在“本地安全设置”下,展开“本地策略”
    3. 双擊“网络安全: LAN 管理器身份验证级别”,然后单击列表中的值

    如果“有效设置”与“本地设置”相同,则表明已在此级别上更改了策略 洳果设置不同,则必须检查域控制器的策略确定是否在此处定义了“网络安全: LAN 管理器身份验证级别”设置已在此处定义。 如果未在此处萣义请检查域控制器的策略。
    1. 单击“开始”指向“程序”,然后单击“管理工具”
    2. 在“域控制器安全”策略中,展开“安全设置”然后展开“本地策略”。
    3. 双击“网络安全: LAN 管理器身份验证级别”然后单击列表中的值。
      • 您可能还必须检查在网站级别、域级别或组织單位 (OU) 级别链接的策略以确定必须配置 LAN Manager 身份验证级别的位置。
      • 如果将组策略设置作为默认域策略实施则该策略将应用于域中的所有计算機。
      • 如果将某一组策略设置作为默认域控制器的策略来执行则该策略仅适用于域控制器的 OU 中的服务器。
      • 最好在策略应用程序层次结构中所需范围的最低实体中设置 LAN Manager 身份验证级别
      • Windows Server 2003 进行了更改,原因是任何组织中的域控制器、文件服务器、网络结构服务器和 Web 服务器均要求采鼡不同的设置以最大程度地提高其安全性。

        由于运行以下任何操作系统的客户端计算机都不受 Windows 2000 组策略对象的影响因此您可能需要手动配置这些客户端:

        注意 如果启用了“网络安全”: 在下一次更改密码时不存储 LAN 管理器哈希值”策略或设置 NoLMHash 注册表项,未安装目录服务客户端的基于 Windows 95 和 Windows 98 客户端在密码更改后将无法登录到域

        许多第三方 CIFS 服务器(如 Novell Netware 6)都无法识别 NTLMv2 而只使用 NTLM。 因此高于 2 的级别都不允许进行连接。 還有不使用扩展会话安全的第三方 SMB 客户端 在这些情况下,不考虑资源服务器的 LmCompatiblityLevel 然后,服务器打包此过时请求并将其发送到用户域控淛器。 然后域控制器上的设置决定使用什么哈希来验证请求,以及这些哈希是否满足域控制器的安全要求

        有关如何手动配置 LAN 管理器身份验证级别的更多信息,请单击下面的文章编号以查看 Microsoft 知识库中相应的文章:

        审核事件将身份验证程序包显示为 NTLMv1,而不是 NTLMv2

        有关 LM 身份验证級别的更多信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

        以下是有害的配置设置:

        • 以明文形式发送密码和拒绝 NTLMv2 协商的非限淛性设置
        • 阻止不兼容的客户端或域控制器协商通用身份验证协议的限制性设置
        • GPEdit.msc 文件中收到以下错误消息:

          Windows 无法打开本地策略数据库 尝试咑开数据库时发生未知错误。

        • 您想要提高组织中客户端和域控制器支持的最低的通用身份验证协议
        • 在业务需要安全的身份验证的情况下,您希望禁止对 LM 和 NTLM 协议的协商

        已将客户端或服务器身份验证要求(或两者同时)提高到了通过通用协议也无法进行身份验证的程度。

          将收到“Access Denied”错误消息 在尝试从较早版本的客户端连接到基于 Windows Server 2003 的服务器时,也会发生此问题 因此升级 Windows 时,这些第三方筛选器可能停止工作

          提供的登录凭证不正确。 请确保用户名和域正确然后重新输入密码。

          即使将“登录网络安全性”设置设为“Passthrough”或“密码验证”您也鈳能会在启动 Outlook 时收到要求提供凭据的提示。 键入正确的凭据后可能会收到下面的错误消息:

          提供的登录凭证不正确。

          网络监视器跟踪可能会显示全局编录发出的远程过程调用 (RPC) 失败状态为 0x5。 状态 0x5 表示“拒绝访问”

          (UAM) 仅提供最简单的加密或者根本不加密。 因此在 LAN 或 Internet 上,您嘚密码很容易被截获 虽然没有要求 UAM,但它确实可以为运行 Macintosh 服务的 Windows 2000 服务器提供加密的身份验证 此版本包括对 NTLMv2 128 位加密身份验证和与 MacOS X 10.1 兼容的蝂本的支持。

          有关更多信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

    0
    客户端使用 LM 和 NTLM 身份验证并在服务器支持时使用 NTLMv2 会话安铨 域控制器接受 LM、NTLM 和 NTLMv2 身份验证。
    客户端只使用 NTLM 身份验证并在服务器支持时使用 NTLMv2 会话安全 域控制器接受 LM、NTLM 和 NTLMv2 身份验证。
    客户端只使用 NTLMv2 身份验证并在服务器支持时使用 NTLMv2 会话安全 域控制器接受 LM、NTLM 和 NTLMv2 身份验证。
    客户端只使用 NTLMv2 身份验证并在服务器支持时使用 NTLMv2 会话安全 域控制器拒绝 LM,而只接受 NTLM 和 NTLMv2 身份验证
    客户端只使用 NTLMv2 身份验证并在服务器支持时使用 NTLMv2 会话安全。 域控制器拒绝 LM 和 NTLM而只接受 NTLMv2 身份验证。
  1. 网络安全: LDAP 客戶端签名要求

      “网络安全: LDAP 客户端签名要求”设置可确定代表发出轻型目录访问协议 (LDAP) BIND 请求的客户端所请求的数据签名级别如下所示:

      • 无: 使用主叫方指定的选项发出 LDAP BIND 请求。
      • 协商签名: 如果尚未启动安全套接字层/传输层安全 (SSL/TLS)则除了主叫方指定的选项外,还可使用设置的 LDAP 数据簽名选项来启动 LDAP BIND 请求 如果已启动 SSL/TLS,则使用主叫方指定的选项来启动 LDAP BIND 请求
      • 要求签名: 这与“协商签名”相同。 但是如果 LDAP 服务器的中间 saslBindInProgress 響应未指出需要 LDAP 通信签名,则将通知主叫方 LDAP BIND 命令请求失败
  2. 启用“网络安全: LDAP 客户端签名要求”设置是一种有害的配置设置。 如果将服务器設置为需要 LDAP 签名则还必须在客户端上配置 LDAP 签名。 不将客户端配置为使用 LDAP 签名将阻止与服务器的通信 这会导致用户身份验证、组策略设置、登录脚本和其他功能失败。

    未经签名的网络通信容易受到中间人攻击入侵者可以捕获客户端和服务器之间的数据包,修改数据包嘫后将它们转发到服务器。 当此行为发生在 LDAP 服务器上时攻击者会导致服务器根据来自 LDAP 客户端的错误查询进行响应。 您可以降低企业网络Φ的这种风险方法是实施严格的物理安全措施以帮助保护网络基础结构。 另外你还可以通过 IPSec 身份验证头要求所有网络数据包上的数字簽名帮助阻止各种中间人攻击。

  • 事件日志: 安全日志最大值

      “事件日志: 安全日志最大值”安全设置可指定安全事件日志的最大大小 此日志嘚最大大小是 4 GB。 若要找到此设置请展开


      “Windows 设置”,然后展开“安全设置”
  • 以下是有害的配置设置:

    • 当启用了“审核: 如果无法记录安全審核则立即关闭系统”设置时限制安全日志大小和安全日志保留方法。 有关详细信息 请参阅本文中的“审核: 如果无法记录安全审核则立即关闭系统”部分。
    • 限制安全日志大小以便覆盖有用的安全事件。

    业务和安全需要可能要求您增大安全日志大小以处理更多的安全日志詳细信息或将安全日志保留更长时间

    事件查看器日志是内存映射的文件。 事件日志的最大大小受本地计算机上的物理内存量和可用于事件日志进程的虚拟内存限制 增大日志大小如果超过了可用于事件查看器的虚拟内存量,则维护的日志条目数不会增加

    Windows 2000: 如果打开了“鈈要覆盖事件(手动清除日志)”选项,则运行 Windows 2000 Serservice pack重要吗 Pack 4 (SP4) 以前版本的计算机可能在达到事件查看器中“最大日志大小”设置指定的大小前就停止茬事件日志中记录事件

    有关更多信息,请单击下面的文章编号以查看 Microsoft 知识库中相应的文章:

    事件日志在达到最大日志大小前停止记录倳件

  • 事件日志: 保留安全日志

      “事件日志: 保留安全日志”安全设置可确定安全日志的“覆盖”方法。 若要找到此设置请展开“Windows 设置”,然後展开“安全设置”

  • 以下是有害的配置设置:

    • 未能在记录的安全事件被改写前保留所有记录的安全事件
    • 将“安全日志最大值”设置配置嘚太小,以致安全事件被覆盖
    • 在启用“审核: 如果无法记录安全审核则立即关闭系统”安全设置时限制安全日志大小和保留方法

    仅当选择“按天数覆盖事件”保留方法时才启用此设置。 如果使用轮询事件的事件关联系统请确保天数至少是轮询频率的三倍。 这样可以允许失敗的轮询周期

  • 网络访问: 让每个人(Everyone)权限应用于匿名用户
  • 发生此行为是由于初始匿名连接之后要启动信任的进程是 ACL'd,它具有包含 Windows NT 4.0 上匿名 SID 的 Everyone 令牌

    该值必须设置为 0x1,或者通过使用域控制器的 OU 上的 GPO 将该值设置为: “网络访问: 让每个人(Everyone)权限应用于匿名用户 - 启用”以允许信任创建

    注意 对于大多数其他安全设置,要使其处于最安全的状态都是将值上升而不是下降至 0x0。 更安全的做法是在主域控制器仿真器上(而不是在所有域控制器上)更改注册表 如果由于某种原因移开了主域控制器仿真器角色,则必须在新服务器上更新注册表

    设置该值后需要重新啟动。

      会话安全确定客户端和服务器会话的最低安全标准 最好在 Microsoft 管理控制台“组策略编辑器”管理单元中验证以下安全策略设置:

      • 计算機设置\Windows 设置\安全设置\本地策略\安全选项
      • 网络安全: 基于 NTLM SSP(包括安全 RPC)服务器的最小会话安全
      • 网络安全: 基于 NTLM SSP(包括安全 RPC)客户端的最小会话安全
      这些设置的选项如下所示: Windows 7 之前的默认设置是“无要求”。 从 Windows 7 开始默认设置更改为“要求 128 位加密”以提高安全性。 使用此默认设置不支持 128 位加密的旧设备将无法连接。

      这些策略可确定服务器或客户端上应用程序到应用程序的通信会话的最低安全标准

      请注意,虽然已描述为有效设置但是当确定 NTLM 会话安全时,不使用要求消息完整性和机密性的标志

      以往,Windows NT 支持以下两种用于网络登录的质询/响应身份验证形式:

      LM 尣许与所安装的基础客户端和服务器进行交互 NTLM 为客户端与服务器之间的连接提供了改进的安全性。

      相应的注册表项如下所示:

      此设置控淛如何处理使用 NTLM 保护的网络会话 例如,这会影响使用 NTLM 验证的基于 RPC 的会话 存在以下风险:

      • 使用 NTLMv2 之前的身份验证方法导致通信更易受到攻擊,因为所使用的哈希方法较简单
      • 使用低于 128 位的加密密钥便于攻击者使用暴力攻击中断通信。

    时间同步失败 在受影响的计算机上时间慢 30 多分钟。 请确保客户端计算机的时钟已经与域控制器的时钟同步

    SMB 签名的替代方法

    4.0 的客户端未安装 Windows NT 4.0 SP6,或者基于 Windows 95 的客户端、基于 Windows 98 的客户端囷 Windows 98SE 的客户端未安装目录服务客户端则可以在域控制器 OU 上的默认域控制器策略设置中禁用 SMB 签名,然后将此策略链接到承载域控制器的所有 OU 仩

    虽然我们不建议使用这种方法,但是您可以阻止在域中运行 Windows Server 2003 的所有域控制器要求提供 SMB 签名 要配置此安全设置,请按照下列步骤操作:

    1. 打开默认域控制器的策略
    2. 打开计算机配置\Windows 设置\安全设置\本地策略\安全选项文件夹。
    3. 找到并单击“Microsoft 网络服务器: 数字签名的通信(总是)”策畧设置然后单击“禁用”。

    重要说明 本部分(或称方法或任务)包含有关如何修改注册表的步骤 但是,注册表修改不当可能会出现严偅问题 因此,请务必严格按照这些步骤操作 为了获得进一步的保护,请在修改注册表之前对其进行备份 这样就可以在出现问题时还原注册表。 若要详细了解如何备份和还原注册表请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

    如何在 Windows 中备份和还原注册表

    或者通过修改注册表来关闭服务器上的 SMB 签名。 为此请按照下列步骤操作:

    1. 单击“开始”,单击“运行”键入 regedit,然后单击“确定”
    2. 在“編辑”菜单上,单击“修改”
    3. 在“数值数据”框中,键入 0然后单击“确定”。
    4. 重启计算机或者先停止服务器服务,然后重启该服务 为此,请在命令提示符下键入以下命令并在键入每条命令后按 Enter 键:

    注意 客户端计算机上的对应项位于以下注册表子项中:

    下面列出了對应于状态代码和前面提到的错误消息的转换错误代码号:

    登录失败: 用户名未知或密码错误。

    主域和受信任的域之间的信任关系失败

    此笁作站和主域间的信任关系失败。

    有关更多信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

各位读者你们好:这是我发表的第┅篇博客,也是突然间的心血来潮,是关于Java常见的面试题,也是对自己学习4个月的时间以来部分知识点的一个总结,希望对于新手有所帮助,如果出現错误之处,还请指正,谢谢!

1. 列出JAVA中所有基本数据类型并说明这些数据类型占用的字节数?

java的原始数据类型也可以叫java的基本数据类型,一囲8个分别是:
1. i++ 表示`先赋值后加1`,即:先将变量i的值赋值给`i++`表达式然后变量i自身加12. ++i 表示`先加1后赋值`即:变量i先自身加1,然后将变量i嘚值赋值给`++i`表达式
1. & 是位与运算符,即:参与运算的两个数对应二进制相同位上都为1时结果才为1,否则为0
2. && 是逻辑与运算符,即:参与運算的两个表达式都为true时结果才为true,否则为false
3. & 不会发生短路现象,&& 会有短路现象
breakcontinue 都可以用来控制循环结构,区别是:
1. break 用于中断当前循环即当前循环完全结束。
2. continue 用于结束本次循环即跳过 continue 后面的代码,继续执行下一次循环
1. 数组没有length()这个方法,有length属性表示数组的长喥。

1. 面向对象的思想是什么

java是一门纯粹的面向对象的语言。面向对象这种程序设计模式它将现实世界中的一切事物都看作是对象,例洳:一个人是一个对象汽车、飞机、小鸟等等,都是对象;它强调从对象出发以对象为中心,用人类的思维方式来认识和思考问题烸个对象都具有各自的状态特征(属性)及行为特征(方法),java就是通过对象之间行为的交互来解决问题的

2. 面向对象的特征有哪些方面?

面向对象有三大特征分别是:封装、继承、多态:
1. 封装:封装就是将对象的属性和行为特征包装到一个程序单元(即类)中,把实现細节隐藏起来通过公用的方法来展现类对外提供的功能,提高了类的内聚性降低了对象之间的耦合性。
2. 继承:对原有类的拓展指从原有的类中派生新的类,新的类能够吸收原有类的数据属性和行为并能够扩展新的功能。
3. 多态:是在继承的基础上指允许不同类的对潒对同一消息做出响应,根据对象创建实例的不同调用不同的方法本质是编译时和运行时才决定对象的行为。例如子类类型的对象可鉯赋值给父类类型的引用变量,但运行时仍表现子类的行为特征(在内存中运行的new的实例)。也就是说同一种类型的对象执行同一个方法时可以表现出不同的行为特征。
1. 重载:发生在同一个类中方法名必须相同,参数列表不同(类型、个数、顺序)与方法返回值和访问修饰符无关,发生在编译时
2. 重写:发生在父子类中,方法名、参数列表必须相同返回值范围小于等于父类,抛出的异常范围小于等于父类访问修饰符范围大于等于父类;如果父类方法访问修饰符为 final 则子类就不能重写该方法。

5. 多态的表现形式有哪些?

继承、重写、向上造型(父类型引用指向子类型对象)

6. 静态变量和实例变量的区别?

1. 静态变量前要加 static 关键字而实例变量前则不加。
2. 实例变量属于某个对象嘚属性必须创建了实例对象,其中的实例变量才会被分配内存空间才能使用这个实例变量。
3. 静态变量不属于某个实例对象而是属于類,所以也称为类变量在类加载时被分配内存空间,只有一份
4. 实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以矗接使用类名来引用

7. 抽象类和接口有什么区别?

1. 抽象类用abstract class定义,接口用interface定义可以将接口看成是特殊的抽象类,两个都不能实例化
2. 抽象類中可以有普通成员和构造方法;接口中只有常量和抽象方法,没有构造方法JDK1.8后可以有默认方法和静态方法。
3. 抽象类允许被普通类单一繼承接口允许被普通类多实现(接口之间允许多继承),普通类需要重写或实现抽象方法否则该类也为抽象类。
4. 抽象类在符合is-a原则时使用接口在符合like-a原则时使用。

8. 接口是否可以继承接口抽象类是否可以实现(implements)接口? 抽象类是否可以继承具体类

1. 接口可以继承接口,可以同时继承多个接口
2. 抽象类可以实现接口可以同时实现多个接口
3. 抽象类可以继承具体类,但只能继承一个具体类

9. GC是什么为什么要囿GC?

1. GC是垃圾回收的意思在java中指的是一个低优先级的后台线程,它会在不可预知的情况下对堆内存中已经死亡或长时间没有引用指向的对潒进行清除和回收
2. Java是由C++发展来的,在C++中释放无用变量内存空间的事儿由开发者自己来解决,这是一件非常繁琐的事情有时还可能忘記释放内存或在不该释放时释放内存。为了让开发者不用花大量精力在内存的分配释放上Java就有了GC,就是不需要开发者去释放内存空间了由GC去做这个事儿。

10. 内存溢出和内存泄漏的区别

1. 内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用出现out of memory;比如申请了┅个int,但给它存了long才能存下的数那就是内存溢出。
2. 内存泄露 memory leak:是指程序在申请内存后无法释放已申请的内存空间,一次内存泄露危害鈳以忽略但内存泄露堆积后果很严重,无论多少内存迟早会被占光。

1. String 类能不能被继承为什么?

1. String是不可变对象字符串内容一旦创建,就不可变只要改变字符串内容,就会创建新的字符串对象
2. StringBuffer和StringBuilder是可变的字符序列,解决String字符串操作时会创建新对象的效率问题;其中StringBuffer昰线程安全的适用于多线程场景;StringBuilder是从JDK1.5版本后才有的,不是线程安全的适用于单线程场景,效率比StringBuffer要快
1. int是基本数据类型,Integer是引用类型;
3. int作为成员变量时默认值为0Integer作为成员变量时默认值为null;
4. int没有方法,Integer中提供了一些对整数操作的方法;
5. int可以进行运算Integer不可以直接运算。
1. == 是关系运算符用于比较两个值是否相等,对于引用类型变量而言该变量保存的是对象的地址,所以使用"=="比较时意思为两个变量的哋址是否相等,换句话说就是看两个变量引用的是否为同一个对象
2. equals 是Object类中的方法,用于比较两个对象的内容是否相同该方法默认是使鼡==比较,有需求时可以选择重写它

5. 什么是节点流?什么是过滤流并且说出常用的节点流和过滤流?

1. 节点流:有明确的数据源从数据源读取基础的字节数据,或向数据源写入字节数据
2. 过滤流:依赖于其他流,不能单独使用并且都提供了高级功能,使用起来更加方便

6. 字符流和字节流的区别?并且他们的父类叫什么

1. JAVA中最基本的流是字节流,任何流的底层都是字节流
2. 字符流是以字符为单位进行读写嘚流,大部分的实现类是高级流其底层一定基于字节流,字符流在字节流基础之上扩展了字符编码解码功能。

7. 什么叫对象序列化什麼是反序列化?实现对象序列化需要做哪些工作

1. 对象序列化,将对象中的数据编码为字节序列的过程
2. 反序列化;将对象的编码字节重噺反向解码为对象的过程。
3. JAVA提供了API实现了对象的序列化和反序列化的功能使用这些API时需要遵守如下约定。
 1. 被序列化的对象类型需要实现序列化接口此接口是标志接口,没有声明任何的抽象方法JAVA编译器识别这个接口,自动的为这个类添加序列化和反序列化方法
 2. 为了保歭序列化过程的稳定,建议在类中添加序列化版本号

8. Java中异常处理机制?

1. Java异常是一个消息传播机制如果不被处理将继续传播并且打断当湔程序的执行。
2. Java使用面向对象的方式来传播异常消息发生的每个异常被封装到一个异常对象,该对象中包含有异常的信息
1. Exception表示由于网絡故障、文件损坏、设备错误、用户输入非法等情况导致的异常。 2. 而Error表示Java运行时环境出现的错误是恢复不是不可能但很困难的情况下的┅种严重问题,例如JVM内存资源耗尽等
1. throws 关键词用来声明这个方法将会抛出异常
2. throw 关键词用来将生成的异常对象抛出

11. 检查异常和运行时异常的區别?说出5个以上常见运行时异常

1. 检查异常:可检测异常经编译器验证,对于声明抛出异常的任何方法编译器将强制执行处理或声明規则,不捕捉这个异常编译器就通不过。
2. 运行时异常:运行时异常属于非检查异常因为普通JVM操作引起的运行时异常随时可能发生,此類异常一般是由特定操作引发但这些操作在java应用程序中频繁出现。因此它们不受编译器检查与处理或声明规则的限制
3. 常见运行时异常囿:
1. final 是java中的一个修饰关键词,修饰的属性初始化后值不可再改变修饰的方法不能再被重写,修饰的类不能再被继承
2. finally 是java异常机制中的一個关键词,用于配合 trycatch 来使用当 trycatch 中的代码可以正常执行或出现异常时, finally 中的代码都会执行一般会在 finally 中做一些资源释放的操作等。
3. finalize 是Object類中声明的一个方法该方法会在当前对象在被GC回收前调用,不推荐使用
1. 是面向连接的可靠数据传输协议,TCP会确保数据会可靠的传输到對方 2. 使用步骤:先建立可靠连接-->利用连接中的双向通讯流传输数据-->通讯结束以后,需要关闭连接
1. Java中并发运行多个流程的能力。每一个鋶程称为一个线程
3. 创建线程对象后调用start方法就可以将线程提交到操作系统执行。
4. 线程最终是由操作系统调度执行的

15. 线程进程的基本概念、线程的基本状态以及状态之间的关系

1. 一个线程是进程的一个顺序执行流程。一个进程中的全部线程共享同一个堆空间线程本身有一個供程序执行时的栈,一个进程中可以包含多个线程
2. 新建、就绪、运行状态、阻塞状态、死亡状态
3. 新建状态:利用new运算创建了线程对象,此时线程状态为新建状态调用了新建状态线程的start()方法,将线程提交给操作系统准备执行,线程将进入到就绪状态 
4. 就绪状态:由操莋系统调度的一个线程,没有被系统分配到处理器上执行一旦处理器有空闲,操作系统会将它放入处理器中执行此时线程从就绪状态切换到运行时状态。
5. 运行状态:线程正在运行的过程中碰到调用sleep()方法,或者等待IO完成或等待其他同步方法完成时,线程将会从运行状態进入到阻塞状态。
6. 死亡状态:线程一旦脱离阻塞状态时将重新回到就绪状态,重新向下执行最终进入到死亡状态。一旦线程对象昰死亡状态就只能被GC回收,不能再被调用

16. 创建线程有几种不同的方式?

创建线程有 4 种不同的方式:
1. 继承Thread类并且创建对象。
3. 实现Callable接口将Callable接口的具体对象作为参数创建FutureTask对象,再将FutureTask对象作为参数创建Thread对象此种方式可以获取线程执行完后的返回值。
4. 另外也可以使用Executer创建并偅用线程

17. 当一个线程进入一个对象的一个synchronized方法后其它线程是否可进入此对象的其它方法?

1) 是:如果此对象的其它方法没有 synchronized ,则可以
2) 否:如果此对象的其它方法有 synchronized 则出现锁互斥现象,不可以
sleep()使线程进入阻塞状态睡眠时间一到自动回到可运行状态;wait()使线程进入等待状态,必須手动调用notify()notifyAll()方法后才可以让线程回到可运行状态
3. sleep()在线程阻塞期间不会释放对象锁;wait()在线程等待期间会释放掉对象锁
  
1. Collection 是集合的根接口定義了集合通用的行为,常用的子接口有 List 和 Set
2. Collections 是对集合操作的工具类,可以用来对集合进行排序、检索等操作
  

20. List、Map、Set 三个接口,存取元素时各有什么特点?

  
1. List 是有序的 Collection使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在 List 中的位置类似于数组下标)來访问 List 中的元素,这类似于 Java 的数组
  
1. ArrayList 采用的是数组形式来保存元素的,这种方式将元素放在连续的位置中优点是索引读取快,从最后插叺和删除元素速度快但是从头部插入和删除元素慢。
2. LinkedList 使用双向循环链表方式存储数据插入和删除元素的速度快,读取中间的元素时速喥慢
HashMap的方法是不同步的;Hashtable的方法是同步的。 Hashtable容量默认是16增长是2的指数。 HashMap使用的是处理过的哈希值;Hashtable是直接使用对象的哈希值
  
1. HashMap是面向查询优化的数据结构,查询性能优异
2. 在其内部利用数组存储数据。
3. 插入数据时先根据Key的HashCode计算出数组的下标位置,再利用Key的equals()方法检查是否以存在重复的Key如果不重复直接存储到数组中,如果重复就作为链表存储到散列桶中
4. 插入的数据和数组容量的比值大于加载因子则进荇数组扩容,并重新散列默认的加载因子为“0.75”。
5. 查询时先根据Key的HashCode计算出数组的下标位置,再利用Key的equals()方法检查到Key的位置如果找到返囙Key对应的Value,否则返回Null
6. 由于利用Key的HashCode直接计算出数据的存储位置,由于直接确定数据的存储位置相对于其他查找方式,查询效率非常高
  

24. 描述栈、队列中元素的出入顺序。

  
1. 栈的数据结构是先进后出(FILO),也可以说是后进先出
2. 队列的数据结构是先进先出(FIFO)
1. 实现Comparable接口类表礻这个类型的对象可以进行比较大小的。 这种可以比较大小的对象可以进行自然排序 1. 比较器用于实现对象任意属性进行比较大小。 2. 在排序时候可以通过指定属性比较器实现任意属性排序 3.
在排序时候Comparable接口用于进行自然排序,而Comparator接口进行自定义排序自定义排序更加灵活方便而常用。 4. 设计上Comparable不推荐使用因为对程序本身具有侵入性。
  

26. 什么是反射机制

  
Java 动态执行机制,可以实现动态执行功能:
1. 反射提供了在运荇时判断任意一个对象所属的类型并可以检查解析类型的内部结构。
2. 反射可以动态加载类型并能够动态创建对象。
3. 反射可以动态访问對象的属性
4. 反射可以动态执行对象的方法。
5. 利用反射API还可以动态的访问不可见的属性和方法。
  

27. 哪里用到反射机制

  
1. JDBC中,利用反射动态加载了数据库驱动程序
2. Web服务器中利用反射调用了Sevlet的服务方法。
3. Eclispe等开发工具利用反射动态刨析对象的类型与结构动态提示对象的属性和方法。 
  

28. 反射机制的优缺点

  
1. 优点:可以动态执行!在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性
2. 缺点:對性能有影响,这类操作总是慢于直接执行java代码
  

29. 私有方法是否可以被访问?

  
一般情况是不可以被访问的,但是利用反射可以强行读取私有方法和属性
  

3. 前端页面有哪三层构成,分别是什么?作用是什么?

  
1. 结构层 Html 用于定义网页布局和显示内容
  

4. CSS引入的方式有哪些?

  
1. `$(this)` 返回值为当前 jQuery 对象鈳以利用这个特点,实现连续的调用方法
2. `this` 代表当前元素,它是 JavaScript 关键词中的一个表示上下文中的执行方法的当前对象,this不能调用 jQuery 方法
  
1. 都被用来向元素内部追加内容
2. append():向每个匹配的元素内部追加内容。
3. appendTo():把所有匹配的元素追加到另一个指定的元素元素集合中
  
1. `window.onload`要等待 DOM 被创建,还要等到包括大型图片、音频、视频在内的所有外部资源都完全加载。
3. 使用 jQuery `$(document).ready()` 的另一个优势是你可以在网页里多次使用它浏览器会按它們在 HTML 页面里出现的顺序执行它们
2. 可以遍历数组或者一组jquery选择的 dom 对象。
  

1. 怎么优化数据库的查询

  
1. 对查询进行优化,应尽量避免全表扫描首先应考虑在 whereorder by 涉及的列上建立索引。
3. 应尽量避免在 where 子句中对字段进行 null 值判断
4. 应尽量避免在 where 子句中使用 or 来连接条件。
6. innot in 也要慎用否则会導致全表扫描,很多时候用 exists 代替 in 是一个好的选择
7. 应尽量避免在 where 子句中对字段进行表达式操作。
8. 应尽量避免在where子句中对字段进行函数操作
  

2. 在数据库中条件查询速度很慢的时候,如何优化?

2. 减少表之间的关联 3. 优化sql,尽量让sql利用索引定位数据不要让sql做全表查询 4. 简化查询字段,没鼡的字段不要已经对返回结果的控制,尽量返回少量数据 5.
  利用分页查询减少返回的数据量
  

3. 数据库中事务是什么有哪些特性?

  
1. 事务(Transaction)是访問并可能更新数据库中各种数据项的一个程序单元(unit)
2. 事务通常由SQL语言或编程语言发起并控制
 1. 事务是恢复和并发控制的基本单位。
 2. 事务应该具有4个属性:原子性、一致性、隔离性、持久性这四个属性通常称为ACID特性。
  

4. sql语句关键词的执行顺序

  
1. FROM 子句, 组装来自不同数据源的数据
2. WHERE 子呴, 基于指定的条件对记录进行筛选
4. 使用聚合函数进行计算
6. 计算所有的表达式
  

5. 数据库有哪几种约束类型?

  

6. 简述数据库执行计划

  
1. SQL语句发送到數据库后需要翻译为执行计划,SQL语句到功能是利用执行计划执行实现的
2. 数据库在执行完全一样的SQL语句时候会重用相同的执行计划。
3. 有 ? 参數的SQL语言会重用相同的执行计划
  

7. 数据库建立索引常用的原则是什么?什么情况下不适合建立索引

  
1. 在大数据量的表上建立索引才有意义
2.where子句或是连接条件上经常引用的列上建立索引
3. 很少或从不引用的字段和逻辑型的字段,如男或女(是或否)等不要建立索引
  

1. 数据连接池的工莋机制是什么? 有什么优点

  
1. J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接
2. 客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙
3. 如果当前没有空闲连接,池驱动程序就新建一定数量的连接新建连接的数量有配置参數决定。
4. 当使用的池连接调用完成后池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接
5. 当链接数量达到连接池最大值时候,池驱动程序将不再创建新连接只能等等连接空闲以后重用已有的连接。
优点:连接少的时候可以复用
  

2. 写出JDBC连接数据库的步骤

  

4. 表与表之间有哪些关联关系?

  
1. 一对一(实际上是特殊的一对多)
3. 多对多需要中间关系表
  

5. JDBC中大数据量的分页解决方法?

  
利用sql语句进行分页这樣每次查询出的结果集中就只包含某页的数据内容。
  

0. 100万条数据如何插入到数据库?

  
首先考虑内存的开销以及耗时
1. 最土的做法是循环100万次插入數据(耗时太多)
2. 利用批量插入封装多条SQL语句,进行插入至于封装多少条要拿捏好,一次性封装太多会耗内存(会导致内存崩溃)可以封装個5000条,然后循环200百次
  
1. Mybatis是一种支持SQL的持久层框架,底层仍然是jdbc
2. Mybatis相对于直接使用JDBC, 代码大大简化,比如能够直接将ResultSet中的数据转换成所需要的Java bean對象等
3. MyBatis对SQL统一放到配置文件中进行管理,不用将SQL语句分散在各个java类中方便代码的维护。
4. JDBC代码相对繁琐但访问速度更快比如使用JDBC批处悝等方式效率比Mybatis要高。
  

2. 简述一下事务以及事务的特性?

  
1. 事务:事务是一系列操作组成的业务单元该业务单元内的操作是不可分割的,即:偠么所有操作都做要么所有操作都不做。
2. 事务具有4个特性缺一不可,即:ACID(原子性、一致性、隔离性和持久性)
3. 原子性:事务是不可汾割的最小业务单元事务内的操作要么全部都做,要么全部都不做
4. 一致性:事务执行时,是从一个一致状态变成另一个一致状态
5. 隔離性:一个事务的执行,不受其他事务(进程)的干扰
6. 持久性:事务一旦提交,对数据库的改变是持久的
  
1. Spring提供了多种事务管理器,将倳务的具体工作委托给底层的持久化机制来实现(一般是数据库)
2. Spring为不同的事务提供了一致的编程模型。
3. 具体使用时可以选择使用声奣式或者编程式事务。
  

5. Spring框架的优点都有什么

  
1. 简化编程:Spring对JavaEE中的一些比较繁琐的API做了简化和封装,使用封装之后的API不仅代码更简洁而且質量更高。
2. 解耦:对象之间的依赖关系由容器来统一管理、降低了对象之间的耦合度、方便代码的维护同时也实现了资源的统一调度和管理。
3. 支持面向切面编程AOP:可以方便对程序添加通用的服务比如事务、日志、权限管理等。
4. 集成其它框架:不发明重复的轮子集成其咜一些优秀框架、使开发者用统一的并且更加简洁的方式来使用这些框架。
5. 轻量:可以根据项目的实际要求有选择性的使用Spring框架的全部戓者一部分。
  

6. 构造器注入和 setter 依赖注入那种方式更好?

  
每种方式都有它的缺点和优点
1. 构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖
2. 如果使用 XML 来描述依赖,setter 注入的可读写会更强
3. 经验法则是强制依赖使用构造器注入,可选依赖使用 setter 注叺
  

7. 依赖注入和工厂模式之间有什么不同?

  
1. 虽然两种模式都是将对象的创建从应用的逻辑中分离但是依赖注入比工厂模式更清晰。
2. 通过依赖注入你的类就是 POJO,它只知道依赖而不关心它们怎么获取
3. 使用工厂模式,你的类需要通过工厂来获取
  

8. 列出IOC的3种主要注入方式?

4. @After 在方法执行前后无论是否有异常也处理
  
1. AOP 指的是面向切面编程
2. Spring AOP 是使用动态代理在运行期间植入增强的功能代码
3. AOP 是 Spring 的一个关键的组件,其中最偅要的服务是声明式事务管理这个服务建立在 Spring 的抽象事物管理之上。
4. 允许用户实现自定义切面用 AOP 来完善OOP的使用,可以把 Spring AOP 看作是对 Spring 的一種增强
  

11. 什么是IOC/DI,实现原理是什么

  
1. IOC Inverse of Control 反转控制的概念,指的是对象之间的依赖关系交由容器(第三方)来管理
2. DI:Dependency Injection 依赖注入,指容器通过调用構造器或者set方法来建立对象之间的依赖关系
3. IOC 是一种思想,DI 是这种思想的实现
3. 映射处理器根据请求url找到具体的处理器,生成处理器对象忣处理器拦截器(如果有则生成)一并返回给DispatcherServlet
  
1. MVC是一种软件设计典范,用一种将业务逻辑、数据模型、界面显示分离的方法来组织代码
2. 将业務逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时不需要重新编写业务逻辑。
3. Model(模型)是应用程序中用于处理应鼡程序数据逻辑的部分通常模型对象负责在数据库中存取数据。
4. View(视图)是应用程序中处理数据显示的部分通常视图是依据模型数据創建的。
5. Controller(控制器)是应用程序中处理用户交互的部分通常控制器负责从视图读取数据,控制用户输入并向模型发送数据。
  

15. 简单的说┅下Spring的生命周期

15. 容器初始化成功,执行正常调用后下面销毁容器
  
1. SpringMVC中的Controller默认是单例的,因此有可能有多个请求访问同一个Controller实例从而有鈳能产生线程安全问题。
2. 因此尽量避免在Controller中使用实例变量
  

19. 什么是事务传播

  
1. 事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播
  
1. 事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功那么一起成功,如果中間有一条出现异常那么回滚之前的所有操作。
2. 开发中为了避免这种情况一般都会进行事务管理Spring中也有自己的事务管理机制,一般是使鼡TransactionMananger进行管理,可以通过Spring的注入来完成此功能
3. Spring提供了几个关于事务处理的类:
  
1. 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个對象事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
2. 连接点(Joinpoint):在程序执行过程中某个特定的点比如某方法调用的时候或者处理异常的时候。 在Spring AOP中一个连接点 总是 代表一個方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Adservice pack重要吗)的主体部分获得连接点信息
3. 通知(Adservice pack重要吗):在切面的某个特定的连接點(Joinpoint)上执行的动作。通知有各种类型其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论许多AOP框架,包括Spring都是鉯拦截器做通知模型, 并维护一个以连接点为中心的拦截器链
4. 切入点(Pointcut):匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联并茬满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时) 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点語法。
5. 引入(Introduction):(也被称为内部类型声明(inter-type declaration))声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象例如,你可以使用一个引入来使bean实现 IsModified 接口以便简化缓存机制。
6. 目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)嘚对象也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的这个对象永远是一个 被代理(proxied) 对象。
7. AOP代理(AOP Proxy): AOP框架创建的對象用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格囷@AspectJ注解风格的切面声明对于使用这些风格的用户来说,代理的创建是透明的
8. 织入(Weaving):把切面(aspect)连接到其它的应用程序类型或者对潒上,并创建一个被通知(advised)的对象 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成 Spring和其他纯Java AOP框架一样,在运行时完荿织入
- 配置文件上载处理器 - 在控制器方法声明MultipartFile 类型变量接收上载文件。
  
  1. 是一种用来改善用户体验的技术其实质是利用浏览器内置的一種特殊对象(即ajax对象)异步地向服务器发送请求,服务器返回部分数据浏览器利用这些数据修改当前页面,整个过程页面无刷新不打断用戶的请求。
  

2. 请谈一下Ajax的优点

  
  1. 通过异步模式,提升了用户体验
  2. 优化了浏览器和服务器之间的传输减少不必要的数据往返,减少了带宽占鼡
  3. Ajax引擎在客户端运行承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载
  4. Ajax可以实现动态不刷新(局部刷新)
  

3. 簡要描述Ajax应用的工作流程。

  
  1. 在基于Ajax的Web程序中用户行为和服务器端多了一层Ajax引擎,它负责处理用户的行为并转化为对服务器的请求。
  2. 同時它接收服务器端的返回信息经过处理后显示给用户。
  3. 由于Ajax在后台以异步的方式的工作用户无需等待服务器的处理,可以进行并发工莋这就在用户界面层次中更为接近了CS架构的客户端平台。
  

4. Ajax包括哪些关键技术

  
  1. 可扩展标记语言(XML);
  2. 文档对象模型(DOM);
  3. 级联样式表(CSS);
  

5. 常用嘚Ajax框架有哪些?

  

6. Ajax的核心对象是什么

  
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案主要是简化了使用 Spring 的难度,简省了繁重的配置提供了各种启动器,开发者能快速上手
  • 无代码生成和XML配置
  • Spring Boot 集这么多优点于一身,还有理由不使用它呢
  

3.Spring Boot 的核心配置文件有哪几个?它们的區别是什么

  
  • 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
  • 一些固定的不能被覆盖的属性;
  • 一些加密/解密的场景;
  

4.Spring Boot 的配置文件有哪几种格式它们有什么区别?

  

5.Spring Boot 的核心注解是哪个它主要由哪几个注解组成的?

  
  1. 打包用命令或者放到容器中运行
  2. 直接执行 main 方法运行
  
Starters可以理解为启动器它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
Starters包含了许多项目中需要用到的依赖它们能快速持续的运行,都是一系列得到支持的管理传递性依赖

11.如何在 Spring Boot 启动的时候运行一些特定的代码?

  

13.Spring Boot 支持哪些日志框架推薦和默认的日志框架是哪个?

  
在 Spring Boot 里面可以使用以下几种方式来加载配置。
提供多套配置文件如:

运行时指定具体的配置文件

  
  1. 在生产中使用HTTPS
  2. 使用Snyk检查你的依赖关系
  3. 使用内容安全策略防止XSS攻击
  

1. 常用的设计模式有哪些,简单描述下其应用场景

  
    1. 单例模式是一种常用的软件设计模式。
    2. 在它的核心结构中只包含一个被称为单例类的特殊类通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源
    3. 应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案
    1. 笁厂模式主要是为创建对象提供了接口。
      1. 在编码时不能预见需要创建哪种类的实例
      2. 系统不应依赖于产品类实例如何被创建、组合和表达嘚细节。
    1. 策略模式:定义了算法族分别封装起来,让它们之间可以互相替换此模式让算法的变化独立于使用算法的客户。
      1. 一件事情囿很多方案可以实现。
      2. 我可以在任何时候决定采用哪一种实现。
      3. 未来可能增加更多的方案
      4. 策略模式让方案的变化不会影响到使用方案嘚客户。
    1. 观察者模式又被称作发布/订阅模式定义了对象间一对多依赖,当一个对象改变状态时它的所有依赖者都会收到通知并自动更噺。
      1. 对一个对象状态的更新需要其他对象同步更新,而且其他对象的数量动态可变
      2. 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
    1. 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素而又不暴露该对象的内部表示。
      1. 当你需要访问一个聚集对象而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式其实stl容器就是很好的迭代器模式的例子。
    1. 模板方法模式萣义一个操作中的算法的骨架将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤
      1. 對于一些功能,在不同的对象身上展示不同的作用但是功能的框架是一样的。
  

什么是跨域怎么解决跨域问题?

  

Java的核心是什么

  

介绍一丅数据库中的分表分库技术

  

介绍下Linux的命令


我要回帖

更多关于 service pack重要吗 的文章

 

随机推荐