第4章 并发断言:基础(序列,属性,断言)

这些是时域断言,允许使用基于时钟(采样)边缘的语义创建复杂序列。这与完全组合逻辑的立即断言相反,并且不允许时域序列。

 并发断言是SVA语言的要旨。它们被称为并发,因为它们与其余的设计逻辑并行执行。让我们从基础开始,继续讨论并发断言的复杂概念。

 让我们先学习并发断言的基本语法,然后研究它的语义。


                                                 图4.1并发断言 - 基础

 在图4.1中,我们已经声明了一个属性'pr1',并用'reqGnt'标签声明它(标签是可选的,但是强烈推荐)。该图解释了并发断言的各个部分,包括一个属性;一个序列和属性的断言。

 'assert property(pr1)'语句触发属性'pr1'。 'pr1'反过来等待先行词'cStart'在(posedge clk)处为真,并且它是真意味着将(激发)一个叫做'sr1'的序列。 'sr1'检查发现'req'在被触发时为高,而2个'时钟'后'gnt'为真。如果这个时域条件满足,那么序列'sr1'将通过,属性'pr1'和'断言属性'也将成为PASS。让我们继续这个例子并研究其他关键语义。


                                     图4.2并发断言 - 采样边沿和动作块

 如图4.2所示,以下是断言的基本和必需部分。随着文章的继续,这些功能中的每一个都将被进一步解释和研究。

(1)'断言' - 你必须断言一个属性;即调用或触发它。

(2)有一个动作块与断言的通过或失败相关联。

(3)'property pr1'是在clk的上升沿边沿触发的(更多的是你必须有一个触发采样边缘的事实将在下面进一步解释)。

(4)'属性pr1'有一个前提,它是一个叫做cStart的信号,如果在posedge clk上被采样为高电平(在预定区域内),将暗示执行结果(序列sr1)。

(5)对序列sr1采样'req'并进行序列分析,以确定它是否在其触发时恰好为高(即,当由于重叠蕴涵运算符而触发序列时,在相同的clk上升沿),然后等待2个时钟并看'gnt'信号是否为高。

(6)注意,'cStart','req','gnt'中的每一个都是在属性中'clk'的posedge指定的边缘处采样的。换句话说,即使在序列中没有指定采样边沿,边沿将从属性pr1继承。

 还要注意的是,我们正在使用在posedge clk上取样值的概念,这意味着'posedge clk'是'采样边缘'。换句话说,采样边缘可以是任何东西(只要它是边缘而不是电平敏感的),这意味着它不一定必须是诸如时钟的同步边缘。它也可以是异步边缘。但是,要非常小心地使用异步边缘,除非您确定要实现的目标。我已经用了一个完整的例子来说明使用异步边沿作为采样边沿的缺陷。现在进入还为时尚早。这是并行断言中一个非常重要的概念,应该很好理解。但是,不要担心,随着我们的进一步发展,您将获得更多的洞察力。

 现在,让我们略微修改序列'sr1'以突出显示序列或属性中的布尔表达式,并研究并发断言的更多关键元素。


                                      图4.3并发断言 - 蕴含,前因和后果

 如图4.3所示,表达式的三个主要部分决定了断言何时触发,触发事件和触发事件与执行事件之间的持续时间。

 断言将被触发的条件称为“前因”,这是蕴涵算子的LHS。

一旦前面的匹配,断言的RHS被执行,称为“后果”。

'蕴涵'操作符决定了先行词和后续词之间的时间间隔。换句话说,蕴涵运算符以两种方式之一将先行词和后续词联系起来。它将它们与'重叠'蕴涵算子或'非重叠'蕴涵算子联系起来。 “理解”蕴含运算符的方式是“如果先行词匹配,结果将被执行。如果没有匹配,结果将不会触发,并且断言将继续等待先行词的匹配。


                                                 图4.4 带嵌入序列的属性

 图4.4进一步解释了先行词和结果。如图所示,您不必为了建模属性而创建序列。如果后续执行的逻辑足够简单,那么它可以直接在所示的结果中声明。但请注意,最好将属性分解成更小的序列以建模复杂的属性/序列。因此,考虑这个例子只是描述语言的语义。实践应该是分而治之。你会看到很多例子,这些例子看起来非常复杂,但是一旦你把它们分解成更小的逻辑块并且用更小的序列对它们进行建模,那么将所有这些结合在一起编写一个长的复杂断言序列会更容易。

 4.1 蕴涵运算符,前提和结果


                                            图4.5蕴涵运算符重叠和不重叠

 蕴涵运算符将先行词和后续词联系起来。如果先行词成立,则意味着结果应该成立。

 有两种类型的蕴涵算子,如图4.5所示。

 (1)重叠蕴涵运算符:参考图4.5,最上面的属性显示使用重叠运算符。 注意它的符号(|->),它不同于非重叠运算符(|=>)。 重叠意味着,当前提被发现是真实的,在'同一'时钟,后果将启动它的执行(评估)。 如图所示,当cStart在clk的posedge采样为High时,在相同的posedge clk时req需要为High。 这显示在与该属性相关的时序图中。
  a. 那么,如果'req'在先行词之后的下一个posedge clk被抽样(以及之前的false),那么会发生什么? 重叠属性会通过吗?
 

 (2)非重叠蕴涵运算符:相反,非重叠意味着当前提被发现是真的时,结果应该在一个时钟后启动它的执行。这显示在与该属性相关的时序图中。

   b. 那么,如果'req'在与先行词相同的posedge clk上被抽样(以及之后的False),会发生什么?非重叠属性会通过吗?

对1.a和2.a的答案是否定的。


                                 图4.6重叠和非重叠蕴涵算子的等价性

 图4.6 进一步显示了重叠运算符和非重叠运算符之间的等价关系。 '|=>'相当于'|-> ## 1'。请注意,## 1与Verilog的#1延迟不同。 ## 1表示一个时钟沿(采样沿)。因此'|-> ## 1'表示与'|=>'相同。

 建议:为了使调试更容易并且项目广泛统一,在断言中使用重叠操作符。原因?重叠是两类操作符的共同点。您始终可以建立从重叠到非重叠的模型,但反之亦然。这意味着在调试过程中,每个人都会知道所有属性都使用重叠进行建模,并且时钟数与属性中指定的完全相同。您不必添加或减少芯片规范中指定的时钟数量。更重要的是,如果每个人都使用他或她最喜欢的操作员,调试将是非常混乱,不知道哪个属性使用哪个操作符。

 4.2 时钟基础

                                                         图4.7时钟基础

 如前所述,并发断言​​仅在出现“边缘”时被评估,称为“采样边缘”。将“边缘”不断提及为“clk”的原因是因为最好让这个“边缘”与信号的posedge或negedge同步。你确实可以有一个异步边缘。但要非常小心。我已经使用了一个完整的例子来解释异步边沿的断言是如何工作的。它变得非常复杂,我极力阻止你写异步断言,除非你确定你知道你在做什么。在图4.7中,我们使用的是非重叠蕴涵运算符,这意味着在clk的上升沿处如果cStart为高,然后在一个时钟之后执行sr1。

 让我们重新讨论变量的“采样”。表达式变量cStart,req和gnt全部在posedge clk的预定区域中被采样。换句话说,如果(例如)cStart = 1并且posedge clk同时改变,则推定区域中的cStart的采样值将等于“零”而不是“1”。我们很快就会讨论仿真时间刻度中“预测区域”的真实含义,以及它如何影响断言的评估,特别是当采样时钟边沿和采样变量同时发生变化时。

 再次请注意,'sequence sr1'在其表达式中没有时钟。 'sequence sr1'的时钟是从'property pr1'继承的。接下来使用图4.8解释这一点。


                    图4.8“assert”,“property”和“sequence”中的时钟 - 时钟基础

 正如图4.8所解释的那样,'clk'作为边沿可以直接在assert语句中指定,也可以在属性中或序列中指定。无论它在哪里声明,它都会被整个断言(即断言,属性和序列块)继承。

 建议:如图4.8所示,我的建议是在属性中指定'clk'。原因是你可以保持序列没有采样边缘(即'clk'),因此使它们可重用。采样边沿可以在属性中改变,但序列(或级联序列)保持不变,并且可以改变其逻辑,而不用担心采样边沿。请注意,在属性中先行词的前面声明采样边沿'clk',也更具可读性。在clk的posedge,如果cStart为高,触发sr1。

 4.3采样边沿(时钟边沿)值:如何在仿真时间刻度中评估断言?

                                                 图4.9在模拟时间标记中断言可变采样和评估/执行

 所谓的采样边沿如何对属性或序列中的变量进行采样是设计断言时需要了解的最重要概念之一。如图4.9所示,需要注意的重要一点是,断言(属性/序列/表达式)中使用的变量在“预设”区域中进行采样。那是什么意思?它意味着(例如)如果采样变量与采样边沿(例如clk)同时发生变化,那么变量的值将成为它在时钟边缘之前保持的值。

 @(posedge clk)a | =>!a;

在上面的序列中,让我们假设变量'a'在采样边沿时钟变为posedge clk的同时变为'1'(并且假设'a'在变为'1'之前为'0')。会不会有先行者'a'的匹配?没有!由于在时钟到达posedge clk的同时'从'0'变为'1',因此按时钟采样的'a'的值将为'0'(预定区域)而不是'1'。这不会导致属性被触发,因为先行词没有被评估为真。这在调试过程中会让你感到困惑。你会期望'1'被采样并且属性触发了它。但是,你会得到相反的结果。

 这是一个非常重要的理解点,因为在仿真波形中(或者对于Verilog $monitor或$strobe),你会看到'a'上的'1'和posedge clk,并且不理解为什么该属性没有触发或为什么它失败(或通过)。务必记住,在采样边沿处,使用采样变量的“先前”值(即,在预定区域中的采样边沿之前的delta)。

 这里有一个完整的例子,包括测试平台和评论,解释了推定区域中变量的采样如何影响断言结果。

module assert1;
reg A, B, C, D, clk;
property ab;
@ (posedge clk) !A |-[B;
endproperty
aba: assert property (ab) else $display($stime,,, 憫ab FAIL拻);
abc: cover property (ab) $display($stime,,, 憫ab PASS拻);
initial begin
clk = 0; A = 0; B = 0; //Note: A and B are equal to ??at time 0.
forever #10 clk = !clk;
end
initial begin
`ifdef PASS

 / *以下一系列事件将导致属性'ab'通过,因为即使A = 0和B =1同时改变,他们也已经因为#1在posedge clk之前采样下来。因此当@(posedge clk)采样A,B; A = 0和B = 1被采样。属性先行词'!A'被评估为真,并且在同一时间(重叠运算符)B == 1。因此,属性通过* /

A = 0;
B = 1;
#1;
@ (posedge clk)
`else

 / *以下事件序列将导致属性'ab'失败。这是故事。 A = 0和B= 1与posedge clk同时改变。这导致B的采样值等于'0'而不等于'1',因为采样边沿(posedgeclk)对推定区域中的变量值进行采样并且在推定区域中B等于'0'。请注意,由于在上面的“初始”块中进行了初始化,所以在推定区域中A等于'0'。所以,现在你的'A'和'B'都是0,因为A是0,!A是真实的,并且属性评估发生。属性期望B == 1在同一时间(重叠运算符)!A是真实的。但是,'B的采样值是'0'并且属性失败。 */

@ (posedge clk)
A = 0;
B = 1;
`endif
@ (negedge clk)
$finish(2);
end
endmodule

 4.3.1 默认时钟模块

 对于文件中的长链属性和序列,您还可以使用默认时钟模块,如图4.10所示。这个图片可以用不同的方式来说明,在这些方式中可以声明时钟块以及它的有效范围。图中的顶部显示了'default clocking cb1'的声明,然后由后面的属性'checkReqGnt'和'checkBusGrant'继承。这个默认时钟模块将会有效,直到定义了另一个默认时钟模块。该图的底部部分很有趣。这里的属性直接嵌入到默认的时钟模块中。我不推荐这样做。时钟模块应该只包含时钟规格,这将保持模块化和可重用。在这些问题上明智地使用你的判断。


                                                            图4.10默认时钟模块

 图4.11在独立的Verilog模块中声明了两个时钟块,即'cb1'和'cb2',称为'design_clocks'。这是在一个模块中组织您的时钟策略的好方法。一旦定义好,就可以使用任何所需的时钟块,只需通过图中所示的分层实例名称引用它即可。

这是一些需要思考的方案。我概述了使用默认时钟模块的一些优缺点。这是最有利的,但有一些警告。

优点:对默认块的争论是可重用性。您可以更改默认块中的时钟关系,它将适用于以下所有块。您不必在每个属性中单独更改计时方案。这确实是一个真正的优势,如果您计划在默认块中更改时钟方案而不影响后续属性,请务必使用默认块。


                                             图4.11'时钟'和'默认时钟'

 缺点:可读性/可调性:当你看到一个没有采样边沿的属性时,你必须回滚到属性上方的'someplace'来查看正在使用的采样边沿。你必须找到先前的时钟块,不能只是去文件的顶部。我喜欢大多数采样边沿独立的属性。当然,这意外多敲几行代码,但更具可读性。

 4.3.2门控时钟

 图4.12显示了一个有趣的使用门控时钟作为属性采样边沿建模的应用。请注意,assign超出了断言的范围。但它的分配值'clkstart'确实可以用在属性中。一般来说,在定义属性/序列的给定范围内声明的任何变量都可用于断言。如果声明在模块外声明,但使用“绑定”方法绑定到模块,则适用相同的规则。更多关于'绑定'的声明即将推出。在这个例子中,采样边将是(clk和cGate)的posedge。在这个采样边的预定区域,属性和序列中的变量将被采样。

                                图4.12 门控时钟

 4.4并发断言是多线程的

 这是关于并发断言时需要掌握的最重要的概念。我们都知道SystemVerilog是一种并发语言,但它是多线程的(除了使用自动变量时)? SVA默认是并发和多线程的。


                                                 图4.13多线程并发断言

 在图4.13中,我们已经声明了与之前见过的相同的断言,即在posedge clk中,如果cStart采样为高电平,sr1将在相同的posedge clk触发,然后查找'req'为高电平时钟和'gnt'在两个时钟后被采样高电平。

 现在,让我们说cStart在clk的边沿被采样为高电平(S1),并且'req'也在同一个边沿被采样为高电平。在此posedge clk之后,序列将等待2个时钟,以查看'gnt'是否为高电平。

 但是在两个时钟结束之前,clk cStart在采样为高电平后恰好两个时钟变低,然后变为高电平(S2)。当我们的断言的第一个触发器将寻找gnt为高(S1)时,这也是相同的边沿。那么,这个断言会做什么?它是否会因为满足其先前条件而重新启动(S2),并忽略从第一个触发器(S1)等待的'gnt'?不,它不会忽略'gnt'。它将采样'gnt'为高(S1)并考虑第一个触发(cStart(S1))为PASS。那么,第二个触发器(cStart(S2))会发生什么?它会启动另一个线程。它会再等待2个时钟来检查'gnt'。到现在为止还挺好。我们看到一个SVA实例被线程化了。

但是生活变得更有趣了。

在S2之后,下一个时钟cStart再次被采样为高电平(S3)。 'req'也是高(req(S3))。现在断言会做什么?那么,S3将自己与S2线程。换句话说,现在有两个截然不同的触发器,等待在触发后的两个时钟采样'gnt'。这个图片完美的指出(!)在S2和S3之后,两个时钟'gnt'应当为高,并且所有3个相同断言都将被触发,且为PASS。

这在断言的设计和性能方面有很多含义。当我们讨论边沿触发的先行词时,我们将进一步讨论这一点。换句话说,我们例子中的属性编码的方式,它会拖累你的仿真器的性能,因为每当属性看到cStart在clk posedge处于高位时,它就会启动一个新线程。但是如果你只是想在cStart的第一次上升沿时评估这个属性,并且如果它保持高就忽略它(除非它再次变低并且再次变高),那么你必须使用边沿敏感先行词。更多关于这个的点将在Chap5阐述. 另外,多线程语言的概念变得更加有趣,你将在Sect. 6.2.1中看到。

 4.5形式参数

 断言的一个关键特征是它们可以被参数化。换句话说,断言可以用形式参数来设计,以保持它们的通用性,以便用于不同的实际参数。

图4.14是不言自明的。请注意,形式参数可以按照序列,属性以及assert语句进行指定。

这个应用在重用性方面显示了形式参数的优势。属性'noChangeSig'有3个形式参数,即pclk,refSig和Sig。该属性检查如果refSig在posedge pclk取样为高,那么Sig不是未知的。一旦这样的通用属性被写入,你可以用不同的clk,不同的refSig和Sig来调用它。 CheckRd是一个属性,它使用sysClk和OE_和RdData来检查未知条件,而CheckWr使用WE_和WrData来检查WrData是否未知。


                                                        图4.14形式和实际参数

 在任何项目中,都有可以通过传递不同的实际参数多次重用的通用属性。这不仅可以在同一个项目中重复使用,还可以在不同项目中重复使用。

有些公司已经创建了这样的属性池,可以根据项目的需要查找并重用。

如图4.15所示,属性可以是基于位置的以及以名字为基础得连接。我强烈建议使用基于名称的形式,以确保实际内容与正确的形式相关联,而不会含糊不清。该规则与我们用于Verilog端口连接的规则相同。

图4.16描述了以下几点

(1)可以将默认值分配给形式参数。

  • a. 如果实际和正式都指定了“默认”值,则实际值会覆盖默认值
  • b. 如果形式具有默认值,您可以不通过实际的形式。请参考图4.16。

 

                        图4.15形式参数和实际参数 - 默认值和基于名称的连接


                     图4.16形式参数和实际参数 - 默认值和基于位置的连接


                                图4.17将事件控制传递给一个形参

 这是一个非常有趣的功能,对于可重用性非常有用。形参也可以用于事件控制。采样边沿可以作为实际参数传递给形参,并且实际可以用作属性中的采样边沿。我们通过'posedge clk'作为实际的'csig'。该属性使用@(csig),因为它是采样边沿。当'possclk'作为实际参数调用属性'pr1'时,'@(csig)'将变为'@(posedge clk)'。为了清楚起见,请参考图4.17。这些属性实际上可以成为一个共同的属性池中的一部分,单个项目可以通过自己的采样边沿规格重复使用。

 4.6禁用(属性)操作符:'disable iff’

'当然,您需要一种方法来在电路不稳定的条件下禁用属性(请考虑Reset)。这正是'disable iff'操作符所做的。它允许您在给定条件下显式禁用该属性。请注意,'disable iff'应当解释为'禁用当且仅当'。图4.18中的示例显示了如何在激活的复位期间禁用断言。您很有可能会在整个项目的所有属性中使用基于复位的禁用方法。注意下面的规则'disable iff'

  •  (1)'禁用iff'只能用于属性 - 而不是序列。
  •  (2)'禁用iff'只能在声明先行条件之前使用。

 好的,如果一个属性开始执行并且在其执行过程中出现'disable iff'条件,会发生什么?

图4.18中的属性检查sdack_落入(即包含)在soe_中(不用担心,我们将在后面的章节中看到这些属性是如何工作的)。它也有'disable iff(!reset)'条件。如果复位信号被置位(低电平有效),则禁用该属性。

 让我们来看看仿真日志。

                                                          图4.16 ‘disable iff’操作符

 在LHS仿真日志中,复位从不被置位并且断言完成(并且在这种情况下通过)。

 在RHS模拟块中,复位在检查'sdack_中的soe'中间时被置位。猜猜看,整个断言都被丢弃了。你不会看到这个断言的通过/失败,因为它已被丢弃。如果disable iff条件发生在执行断言的中间,则整个断言将被禁用。有些人把这种丢弃视为失败,这是不正确的。

 一旦使用'disable iff'构造禁用了断言,只有'disable iff'条件不再成立后,它才会重新启动。

 正如我们将在Sect. 7.4中讨论的那样,仿真器会提供系统函数对断言执行进行全局控制。

 4.7严重级别(针对并发和立即断言)

                                     图4.19并发和即时断言的严重级别

 断言还允许具有不同严重级别的错误报告。 $fatal,$errot(默认),$warning和$info。图4.19解释了每一个的含义。

$error是默认,这意味着如果在assert语句中没有指定失败子句,$error将启动并提供仿真器生成错误消息。如果你已经为断言指定了一个标签(并且你应该有),那么(很可能)会显示在$error消息中。我说很可能是因为SystemVerilog LRM没有指定$ error的确切格式。它是仿真器供应商特定的。 $ warning和$ info是不言自明的,如图4.19所示。

 4.8绑定属性

 '绑定'允许我们将设计逻辑与断言逻辑分开。设计经理不喜欢在RTL中看到任何不能被综合的东西。 '绑定'有助于朝这个方向发展。

                                            图4.20 绑定属性

 图4.20中有三个模块。 'designModule'包含设计。 'propertyModule'包含对'designModule'中的逻辑进行操作的断言/属性。 'test_bindProperty'模块将propertyModule绑定到designModule。通过这样做,我们将'propertyModule'的属性与'designModule'分开。这就是'绑定'背后的想法。您不必将属性放置在与设计模块相同的模块中。如前所述,您应该让您的设计避免无法综合的所有语法结构。此外,将断言和设计保留在单独的模块中,可以使设计人员和DV工程师并行工作,而不受数据库管理系统的限制,其中一个文件不能同时由两名工程师修改。

为了使用'绑定'您必须在“绑定”语句中声明designModule的实例名称或模块名称。您需要设计模块/实例名称,属性模块名称和“绑定”实例名称才能使用。在我们的例子中,设计模块名称是designModule,它的实例名是'dM',属性模块名是propertyModule。

(未注释的)'bind'语句使用模块实例'dM'并将其绑定到属性模块'propertyModule '并给这个'绑定'一个实例名称'dpM'。它将propertyModule的端口与designModule的端口连接在一起。propertyModule中的'property rc1'将作用于连接的designModule端口。

注释的'bind'语句使用模块名'designModule'绑定到'propertyModule ''designModule'的所有实例都将绑定到'propertyModule'。

本质上,我们已经将设计的属性/断言和设计的逻辑分开。这是推荐的方法。通过将属性放置在与设计模块相同的模块中,您可以获得相同的结果,但这是高度非模块化和侵入式的方法。另外,如上所述,保持它们分离可使DV和设计工程师并行工作。

 4.8.1绑定属性(范围可见性)

 但是如果要将propertyModule的断言绑定到designModule的内部信号呢?这非常可行。

如图4.21所示,'rda'和'rdb'是designModule内部的信号。这些是您想要在'propertyModule'的断言中使用的信号。因此,您需要使'rda'和'rdb'对'propertyModule'可见。但是,您不想将'designModule'内部变量带到外部端口,以使其对'propertyModule'可见。你想保持'designModule'完全不变。为此,需要将输入端口添加到'propertyModule',并将其绑定到'designModule'的内部信号,如图4.21所示。请注意,在我们的示例中,我们将propertyModule端口的'pa'和'pb'绑定到designModule内部寄存器'rda'和'rdb'。换句话说,您可以在'绑定'期间直接引用designModule的内部信号。 'bind'具有对绑定模块'designModule'的完全可见范围。请注意,使用此方法,绑定到'propertyModule'输入端口时不必提供整个层次实例名称。


                         图4.21绑定属性到设计“模块”内部信号(范围可视性)

 4.8.2现有设计中的采用断言

 图4.22显示了如果你有一个现有的设计,你可以有效地使用'bind'结构在设计范围之外编写断言并绑定它们。如果您要在新的SoC中引入传统模块并希望确保传统模块在新设计中正常工作,这可能非常有用。这个图片展示的是方法论的一部分。在您的项目之前,确定您的“绑定”方法。看到所有的断言都在RTL之外,并且不是RTL中的一些混乱的混合,而是一些与外部属性文件绑定的混合。


                                                 图4.22绑定到现有设计的属性。断言在现有设计中的采用

 将断言保存在单独文件中的其他优点是可以独立验证它们,而无需控制RTL文件。当你想确保设计和验证同时进行时,这是一个很大的优势。

 4.9'序列'和'属性'之间的区别

 现在我们已经看到了使用序列和属性的断言,重新回顾并清楚地理解两者之间的差异是很好的。

 •“序列”

    - 序列是一个构建块。把它想象成一个宏或者一个子程序,你可以为给定的一组信号定义一个特定的关系。

    -  一个序列本身不会触发。它必须被断言。

    - 一个序列不允许蕴涵运算符。简单地允许信号之间的时域(或组合)关系。

    - 一个序列可以有可选的形式参数。

    - 一个时钟事件可以在一个序列中使用。

    - 一个序列可以声明在模块,接口,程序,时钟块,包(但不在'类'中)。

 •'属性'

    - 一个属性也不会自行触发,直到'assert'(或'cover')。

    - 属性蕴涵运算符,暗示先行词和后续词之间的关系。

    - 序列可以用作复杂属性的构建块。

    - 时钟事件可以应用在属性中,在序列中或者在两者中。

    - 一个属性可以声明在一个模块,一个接口,一个程序,一个时钟块,一个包(但不在'类'中)。

  • 10
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 Gradle存储库 23 使用Spring 4.0.x和Gradle 24 2.4.3项目模块 25 核心 - spring-security-core.jar 25 远程处理 - spring-security-remoting.jar 25 Web - spring-security-web.jar 25 配置 - spring-security-config.jar 26 LDAP - spring-security-ldap.jar 26 ACL - spring-security-acl.jar 26 CAS - spring-security-cas.jar 26 OpenID - spring-security-openid.jar 26 测试 - spring-security-test.jar 26 2.4.4检出来源 26 3. Spring Security 4.2的新特性 27 3.1 Web改进 27 3.2配置改进 28 3.3杂项 28 4.样品和指南(从这里开始) 28 5. Java配置 29 5.1 Hello Web安全Java配置 29 5.1.1 AbstractSecurityWebApplicationInitializer 31 5.1.2 AbstractSecurityWebApplicationInitializer不存在Spring 31 5.1.3使用Spring MVC的AbstractSecurityWebApplicationInitializer 32 5.2 HttpSecurity 32 5.3 Java配置和表单登录 34 5.4授权请求 35 5.5处理注销 36 5.5.1 LogoutHandler 37 5.5.2 LogoutSuccessHandler 37 5.5.3更多注销相关参考 38 5.6认证 38 5.6.1内存认证 38 5.6.2 JDBC认证 39 5.6.3 LDAP认证 39 5.6.4 AuthenticationProvider 41 5.6.5 UserDetailsService 41 5.6.6 LDAP认证 41 5.7多个HttpSecurity 41 5.8方法安全性 43 5.8.1 EnableGlobalMethodSecurity 43 5.8.2 GlobalMethodSecurityConfiguration 44 5.9后处理配置的对象 45 5.10自定义DSL 46 6.安全命名空间配置 47 6.1简介 47 6.1.1命名空间的设计 49 6.2安全命名空间配置入门 50 6.2.1 web.xml配置 50 6.2.2最小的配置 50 6.2.3表单和基本登录选项 52 设置默认的登录目的地 54 6.2.4注销处理 54 6.2.5使用其他身份验证提供程序 55 添加密码编码器 56 6.3高级Web功能 56 6.3.1记得我认证 56 6.3.2添加HTTP / HTTPS通道安全 57 6.3.3会话管理 57 检测超时 57 并发会话控制 58 会话固定攻击保护 59 6.3.4 OpenID支持 60 属性交换 61 6.3.5响应头 62 6.3.6添加你自己的过滤器 62 设置一个自定义的AuthenticationEntryPoint 64 6.4方法安全 64 6.4.1 元素 65 使用protect-pointcut添加安全性切入点 66 6.5默认AccessDecisionManager 67 6.5.1自定义AccessDecisionManager 67 6.6验证管理器和命名空间 67 7.示例应用程序 69 7.1教程示例 69 7.2联系人 69 7.3 LDAP样本 71 7.4 OpenID示例 71 7.5 CAS样品 71 7.6 JAAS样品 72 7.7预认证样本 72 8. Spring Security社区 72 8.1问题跟踪 72 8.2成为参与 73 8.3更多信息 73 第二部分 架构与实现 73 9.技术概述 73 9.1运行环境 73 9.2核心组件 74 9.2.1 SecurityContextHolder,SecurityContext和认证对象 74 获取有关当前用户的信息 75 9.2.2 UserDetailsService 75 9.2.3授予权力 77 9.2.4总结 77 9.3认证 78 9.3.1什么是Spring Security中的认证? 78 9.3.2直接设置SecurityContextHolder内容 80 9.4 Web应用程序中的身份验证 81 9.4.1 ExceptionTranslationFilter 82 9.4.2 AuthenticationEntryPoint 82 9.4.3认证机制 82 9.4.4在请求之间存储SecurityContext 83 9.5 Spring Security中的访问控制(授权) 84 9.5.1安全和AOP建议 84 9.5.2安全对象和AbstractSecurityInterceptor 85 什么是配置属性? 85 RunAsManager 86 AfterInvocationManager 86 扩展安全对象模型 87 9.6本地化 87 10.核心服务 89 10.1 AuthenticationManager,ProviderManager和AuthenticationProvider 89 10.1.1成功认证时清除证书 91 10.1.2 DaoAuthenticationProvider 91 10.2 UserDetailsService实现 92 10.2.1内存认证 92 10.2.2 JdbcDaoImpl 93 权威组织 94 10.3密码编码 94 10.3.1什么是散列? 95 10.3.2添加盐到哈希 95 10.3.3散列和认证 96 10.4Jackson 支持 96 第三部分 测试 97 11.测试方法安全性 97 11.1安全测试设置 98 11.2 @WithMockUser 98 11.3 @WithAnonymousUser 100 11.4 @用户详细信息 101 11.5 @WithSecurityContext 102 11.6测试元注释 104 12. Spring MVC测试集成 104 12.1设置MockMvc和Spring Security 104 12.2 SecurityMockMvcRequestPostProcessors 105 12.2.1使用CSRF保护进行测试 105 12.2.2在Spring MVC测试中以用户身份运行测试 106 12.2.3使用RequestPostProcessor在Spring MVC测试中以用户身份运行 106 作为用户在Spring MVC测试中使用注释运行 108 12.2.4测试HTTP基本认证 109 12.3 SecurityMockMvcRequestBuilders 109 12.3.1测试基于表单的认证 109 12.3.2测试注销 110 12.4 SecurityMockMvcResultMatchers 110 12.4.1未经认证的声明 111 12.4.2认证断言 111 第四部分 Web应用程序安全 112 13.安全过滤器链 112 13.1 DelegatingFilterProxy 112 13.2 FilterChainProxy 113 13.2.1绕过滤网链 115 13.3过滤器排序 115 13.4请求匹配和HttpFirewall 116 13.5与其他基于过滤器的框架一起使用 118 13.6高级命名空间配置 118 14.核心安全筛选器 119 14.1 FilterSecurityInterceptor 119 14.2 ExceptionTranslationFilter 121 14.2.1 AuthenticationEntryPoint 122 14.2.2 AccessDeniedHandler 122 14.2.3 SavedRequest和RequestCache接口 123 14.3 SecurityContextPersistenceFilter 123 14.3.1 SecurityContextRepository 124 14.4 UsernamePasswordAuthenticationFilter 125 14.4.1认证成功与失败的应用流程 125 15. Servlet API集成 127 15.1 Servlet 2.5+集成 127 15.1.1 HttpServletRequest.getRemoteUser() 127 15.1.2 HttpServletRequest.getUserPrincipal() 127 15.1.3 HttpServletRequest.isUserInRole(String) 128 15.2 Servlet 3+集成 128 15.2.1 HttpServletRequest.authenticate(HttpServletResponse) 128 15.2.2 HttpServletRequest.login(String,String) 129 15.2.3 HttpServletRequest.logout() 129 15.2.4 AsyncContext.start(Runnable) 129 15.2.5异步Servlet支持 130 15.3 Servlet 3.1+集成 131 15.3.1 HttpServletRequest#changeSessionId() 132 16.基本和摘要式身份验证 132 16.1 BasicAuthenticationFilter 132 16.1.1配置 132 16.2 DigestAuthenticationFilter 133 16.2.1配置 135 17.记住我的身份验证 136 17.1概述 136 17.2简单的基于哈希的令牌方法 136 17.3持久性令牌方法 137 17.4记住我的接口和实现 138 17.4.1 TokenBasedRememberMeServices 138 17.4.2 PersistentTokenBasedRememberMeServices 139 18.跨站点请求伪造(CSRF) 140 18.1 CSRF攻击 140 18.2同步器令牌模式 141 18.3何时使用CSRF保护 142 18.3.1 CSRF保护和JSON 142 18.3.2 CSRF和无状态浏览器应用程序 143 18.4使用Spring Security CSRF保护 143 18.4.1使用适当的HTTP动词 144 18.4.2配置CSRF保护 144 18.4.3包含CSRF令牌 145 表单提交 145 Ajax和JSON请求 145 CookieCsrfTokenRepository 146 18.5 CSRF警告 147 18.5.1超时 148 18.5.2登录 148 18.5.3注销 149 18.5.4多部分(文件上传) 149 在Spring Security之前放置MultipartFilter 150 包含CSRF令牌 151 18.5.5隐藏的HttpMethodFilter 151 18.6覆盖默认值 151 19. CORS 152 20.安全性HTTP响应头 154 20.1默认的安全头 154 20.1.1缓存控制 157 20.1.2内容类型选项 158 20.1.3 HTTP严格传输安全(HSTS) 159 20.1.4 HTTP公钥密码(HPKP) 161 20.1.5 X-Frame-Options 163 20.1.6 X-XSS保护 164 20.1.7内容安全策略(CSP) 165 配置内容安全策略 166 其他资源 168 20.1.8推荐人政策 168 配置引用者策略 169 20.2自定义标题 169 20.2.1静态头 169 20.2.2标题作者 170 20.2.3 DelegatingRequestMatcherHeaderWriter 171 21.会议管理 172 21.1 SessionManagementFilter 173 21.2 SessionAuthenticationStrategy 173 21.3并发控制 174 21.3.1查询当前通过身份验证的用户及其会话的SessionRegistry 176 22.匿名身份验证 177 22.1概述 177 22.2配置 178 22.3 AuthenticationTrustResolver 179 23. WebSocket安全 180 23.1 WebSocket配置 181 23.2 WebSocket身份验证 182 23.3 WebSocket授权 182 23.3.1 WebSocket授权说明 183 消息类型的WebSocket授权 184 目的地上的WebSocket授权 184 23.3.2出站消息 185 23.4执行相同的来源政策 185 23.4.1为什么同源? 185 23.4.2 Spring WebSocket允许的来源 186 23.4.3添加CSRF到Stomp头 186 23.4.4在WebSockets中禁用CSRF 187 23.5使用SockJS 187 23.5.1 SockJS和框架选项 187 23.5.2轻松放松CSRF 188 第五部分授权 190 24.授权体系结构 190 24.1当局 190 24.2预调用处理 191 24.2.1 AccessDecisionManager 191 24.2.2基于投票的AccessDecisionManager实现 192 RoleVoter 193 AuthenticatedVoter 194 自定义选民 194 24.3调用处理后 194 24.4分层角色 196 25.安全的对象实现 197 25.1 AOP联盟(MethodInvocation)安全拦截器 197 25.1.1显式MethodSecurityInterceptor配置 197 25.2 AspectJ(JoinPoint)安全拦截器 198 26.基于表达式的访问控制 200 26.1概述 200 26.1.1通用内置表达式 201 26.2网络安全表达式 202 26.2.1在Web安全表达式中引用Bean 203 26.2.2 Web安全表达式中的路径变量 204 26.3方法安全表达式 204 26.3.1 @Pre和@Post注释 205 访问控制使用@PreAuthorize和@PostAuthorize 205 使用@PreFilter和@PostFilter进行过滤 207 26.3.2内置表达式 207 PermissionEvaluator接口 208 方法安全元注释 209 第六部分 其他主题 209 27.域对象安全(ACL) 209 27.1概述 209 27.2重要概念 211 27.3入门 214 28.预认证方案 216 28.1预认证框架类 216 28.1.1 AbstractPreAuthenticatedProcessingFilter 217 J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource 217 28.1.2 PreAuthenticatedAuthenticationProvider 218 28.1.3 Http403ForbiddenEntryPoint 218 28.2具体实施 219 28.2.1请求头认证(Siteminder) 219 Siteminder示例配置 219 28.2.2 Java EE容器认证 220 29. LDAP认证 220 29.1概述 220 29.2在Spring Security中使用LDAP 221 29.3配置LDAP服务器 221 29.3.1使用嵌入式测试服务器 222 29.3.2使用绑定认证 222 29.3.3加载权限 223 29.4实现类 223 29.4.1 LdapAuthenticator实现 224 通用功能 224 认证者 225 PasswordComparisonAuthenticator 225 29.4.2连接到LDAP服务器 225 29.4.3 LDAP搜索对象 225 FilterBasedLdapUserSearch中 225 29.4.4 LdapAuthoritiesPopulator 226 29.4.5 Spring Bean配置 226 29.4.6 LDAP属性和定制的UserDetails 227 29.5 Active Directory认证 228 29.5.1 ActiveDirectoryLdapAuthenticationProvider 228 活动目录错误代码 229 30. JSP标签库 230 30.1声明Taglib 230 30.2授权标签 230 30.2.1禁用测试的标签授权 231 30.3认证标签 232 30.4 accesscontrollist标签 232 30.5 csrfInput标签 233 30.6 csrfMetaTags标签 233 31 Java认证和授权服务(JAAS)提供者 235 31.1概述 235 31.2摘要:Java认证提供者 235 31.2.1 JAAS CallbackHandler 235 31.2.2 JAAS权威机构 236 31.3 DefaultJaasAuthenticationProvider 237 31.3.1 InMemoryConfiguration 237 31.3.2 DefaultJaasAuthenticationProvider示例配置 238 31.4 JaasAuthenticationProvider 239 31.5作为主题运行 240 32. CAS认证 240 32.1概述 240 32.2 CAS的工作原理 240 32.2.1 Spring安全和CAS交互序列 241 32.3 CAS客户端的配置 244 32.3.1服务票据认证 244 32.3.2单一注销 246 32.3.3使用CAS认证无状态服务 249 配置CAS以获取代理授予票证 249 使用代理票证调用无状态服务 250 32.3.4代理票证认证 251 33. X.509认证 253 33.1概述 253 33.2将X.509身份验证添加到您的Web应用程序 253 33.3在Tomcat中设置SSL 254 34.运行认证替换 255 34.1概述 255 34.2配置 255 35. Spring Security加密模块 257 35.1简介 257 35.2加密器 257 35.2.1 BytesEncryptor 257 35.2.2 TextEncryptor 258 35.3关键发电机 258 35.3.1 BytesKeyGenerator 258 35.3.2 StringKeyGenerator 259 35.4密码编码 259 36.并发支持 260 36.1 DelegatingSecurityContextRunnable 260 36.2 DelegatingSecurityContextExecutor 262 36.3 Spring安全性并发类 264 37. Spring MVC集成 265 37.1 @EnableWebMvcSecurity 265 37.2 MvcRequestMatcher 265 37.3 @AuthenticationPrincipal 268 37.4 Spring MVC异步集成 271 37.5 Spring MVC和CSRF集成 271 37.5.1自动令牌包含 271 37.5.2解析CsrfToken 272 第七部分 Spring数据集成 273 38. Spring Data&Spring安全配置 273 39. @Query中的安全表达式 273 第八部分 附录 274 40.安全数据库模式 274 40.1用户模式 274 40.1.1集团当局 274 40.2持久登录(记得我)架构 275 40.3 ACL模式 275 40.3.1 HyperSQL 276 40.3.2 PostgreSQL 277 40.3.3 MySQL和MariaDB 278 40.3.4 Microsoft SQL Server 279 40.3.5 Oracle数据库 280 41.安全命名空间 282 41.1 Web应用程序安全性 282 41.1.1 282 41.1.2 282 属性 283 的子元素 285 41.1.3 286 的父元素 286 属性 286 41.1.4 286 属性 287 父元素 287 41.1.5 <headers> 287 <headers>属性 288 <headers>的父元素 288 <headers>的子元素 288 41.1.6 289 属性 289 的父元素 289 41.1.7 289 属性 289 的父元素 290 41.1.8 290 属性 290 的父元素 290 41.1.9 290 的子元素 290 41.1.10 291 属性 291 的父元素 291 41.1.11 291 属性 291 的父元素 291 41.1.12 291 属性 292 的父元素 292 41.1.13 <frame-options> 292 <frame-options>属性 292 <frame-options>的父元素 293 41.1.14 [removed] 293 [removed]属性 293 [removed]的父元素 294 41.1.15 294 属性 294 的父元素 294 41.1.16 <header> 294 <header-attributes>属性 294 <header>的父元素 295 41.1.17 295 的父元素 295 属性 295 41.1.18 295 父元素 296 属性 296 41.1.19 296 的父元素 296 属性 296 41.1.20 <expression-handler> 297 <expression-handler>的父元素 297 属性 297 41.1.21 <form-login> 297 <form-login>的父元素 298 <form-login>属性 298 41.1.22 299 的父元素 300 属性 300 41.1.23 元素 300 属性 300 41.1.24 300 的父元素 300 属性 301 41.1.25 302 的父元素 302 属性 302 41.1.26 302 父元素 302 属性 303 41.1.27 303 的父元素 303 属性 303 的子元素 305 41.1.28 305 的父元素 305 属性 305 的子元素 305 41.1.29 306 的父元素 306 属性 306 41.1.30 306 的父元素 306 的子元素 307 41.1.31 307 的父元素 307 属性 307 41.1.32 307 的父元素 307 属性 307 41.1.33 元素 309 的父元素 309 属性 309 41.1.34 309 的父元素 309 属性 309 的子元素 310 41.1.35 311 的父元素 311 属性 311 41.1.36 312 的父元素 312 属性 312 41.1.37 313 属性 313 的子元素 313 41.1.38 313 的父元素 313 属性 313 41.1.39 314 属性 314 的子元素 314 41.2 WebSocket安全 314 41.2.1 315 属性 315 的子元素 316 41.2.2 316 的父元素 316 属性 316 41.3认证服务 317 41.3.1 317 属性 317 的子元素 317 41.3.2 318 的父元素 318 属性 318 的子元素 318 41.3.3 319 属性 319 41.3.4 320 的父元素 320 属性 320 的子元素 320 41.3.5 320 的父元素 321 属性 321 41.3.6 321 属性 321 的子元素 321 41.3.7 321 的父元素 322 属性 322 41.4方法安全 322 41.4.1 322 属性 322 的子元素 324 41.4.2 324 的父元素 324 属性 324 41.4.3 324 的父元素 325 325 41.4.4 325 的父元素 325 属性 325 41.4.5 325 的父元素 325 属性 325 41.4.6 326 的父元素 326 属性 326 41.4.7使用安全方法 326 父节点 326 属性 326 41.4.8 326 属性 327 的子元素 327 41.4.9 327 属性 327 的子元素 327 41.4.10 327 父元素 328 属性 328 41.5 LDAP名称空间选项 328 41.5.1使用。定义LDAP服务器 328 属性 329 41.5.2 329 的父元素 329 属性 329 的子元素 331 41.5.3 331 的父元素 331 属性 332 的子元素 332 41.5.4 332 属性 332 42.春季安全依赖 333 42.1 spring-security-core 334 42.2 spring-security-remoting 334 42.3 spring-security-web 335 42.4 spring-security-ldap 335 42.5 spring-security-config 336 42.6 spring-security-acl 336 42.7 spring-security-cas 337 42.8 spring-security-openid 337 42.9 spring-security-taglibs 338 43.代理服务器配置 338 44. Spring Security FAQ 339 44.1一般问题 339 44.1.1 Spring Security是否会处理我所有的应用程序安全要求? 339 44.1.2为什么不使用web.xml安全? 339 44.1.3需要哪些Java和Spring Framework版本? 341 44.1.4我是Spring Security的新手,我需要构建一个支持通过HTTPS进行CAS单点登录的应用程序,同时允许对某些URL进行本地基本身份验证,并对多个后端用户信息源(LDAP和JDBC)进行身份验证。我已经复制了一些我发现的配置文件,但不起作用。什么可能是错的? 341 44.2常见问题 342 44.2.1当我尝试登录时,我收到一条错误消息,指出“Bad Credentials”。怎么了? 343 44.2.2当我尝试登录时,我的应用程序进入“无限循环”,发生了什么事? 344 44.2.3我收到一条异常消息“访问被拒绝(用户是匿名的)”。怎么了? 344 44.2.4即使在我退出应用程序之后,为什么还能看到安全的页面? 345 44.2.5我得到一个异常,消息“在SecurityContext中没有找到认证对象”。怎么了? 345 44.2.6我无法使LDAP认证正常工作。我的配置有什么问题? 345 44.2.7会话管理 346 44.2.8我使用Spring Security的并发会话控制来防止用户一次登录多次。登录后打开另一个浏览器窗口时,不会阻止我再次登录。为什么我可以多次登录? 347 44.2.9为什么在通过Spring Security进行身份验证时会话ID发生了变化? 347 44.2.10我正在使用Tomcat(或其他一些servlet容器),并为我的登录页面启用了HTTPS,之后切换回HTTP。这是行不通的 - 我只是在认证之后回到登录页面。 347 44.2.11我没有在HTTP和HTTPS之间切换,但是我的会话仍然丢失 348 44.2.12我试图使用并发会话控制支持,但是不会让我重新登录,即使我确定我已经注销并且没有超出允许的会话。 348 44.2.13 Spring Security正在创建一个会话,即使我已经配置了它,通过设置create-session属性为永远不会。 348 44.2.14执行POST时,我得到了一个403 Forbidden 349 44.2.15我正在使用RequestDispatcher将请求转发到另一个URL,但是我的安全限制没有被应用。 349 44.2.16我已经将Spring Security的元素添加到我的应用程序上下文中,但是如果将安全注释添加到我的Spring MVC控制器bean(Struts操作等)中,那么它们似乎没有效果。 349 44.2.17我有一个肯定被认证的用户,但是当我在一些请求期间尝试访问SecurityContextHolder时,认证是空的。为什么我看不到用户信息? 350 44.2.18在使用URL属性时,授权JSP标记不尊重我的方法安全注释。 350 44.3 Spring安全体系结构问题 350 44.3.1我如何知道X是哪个包? 350 44.3.2名称空间元素如何映射到传统的bean配置? 351 44.3.3“ROLE_”是什么意思,为什么我的角色名字需要它? 351 44.3.4如何知道添加到我的应用程序中的哪些依赖关系与Spring Security一起使用? 352 44.3.5运行嵌入式ApacheDS LDAP服务器需要哪些依赖关系? 352 44.3.6什么是UserDetailsService,我需要一个吗? 353 44.4共同的“Howto”请求 353 44.4.1我需要登录更多的信息,而不仅仅是用户名。如何添加对额外登录字段(例如公司名称)的支持? 354 44.4.2如果只有所请求的URL的片段值不同(例如/ foo#bar和/ foo#blah),我该如何应用不同的拦截url链接? 354 44.4.3如何在UserDetailsService中访问用户的IP地址(或其他Web请求数据)? 354 44.4.4如何从UserDetailsService访问HttpSession? 355 44.4.5如何在UserDetailsService中访问用户的密码? 355 44.4.6如何动态定义应用程序中的安全URL? 355 44.4.7如何针对LDAP进行身份验证,但从数据库加载用户角色? 357 44.4.8我想修改由命名空间创建的bean的属性,但是模式中没有任何东西支持它。我可以做什么放弃命名空间的使用? 358 45.从3.x迁移到4.x 359
数据库系统原理练习1 一、单项选择题(本大题共15小题,每小题2分,共30分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的 括号内。错选、多选或未选均无分。 1.信息世界中的术语"实体"对应于机器世界的术语是( ) A.记录 B.字段 C.文件 D.关键码 2.用二维表结构表达实体集的模型是( ) A.概念模型 B.层次模型 C.网状模型 D.关系模型 3.内模式的修改尽量不影响概念模式的特点称为数据库的( ) A.物理数据独立性 B.逻辑数据独立性 C.外模式数据独立性 D.内模式数据独立性 4.设R和S是任意两个关系,则RS等价于( ) A.(R-S) S B.R (R-S) C.S-(R-S) D.R-(R-S) 5.设有R与S两个关系如题5图所示: 关系代数表达式 C,E( (R s))的结果是( ) A.c1,el B.c2,e2 C.c3,e2 D. c3,e1 6.SQL语言中,HAVING子句用于筛选满足条件的( ) A.列 B.行 C.分组 D.元组 7.若R 1NF,且R中只有一个主属性,则R必然满足( ) A.2NF B.3NF C.4NF D.BCNF 8.设有关系模式R(A,B,C,D),F是R上成立的FD集,F={B C,C D},则属性C的闭包C +为( ) A.BC B.BCD C.BD D.CD 9.将ER模型转换成关系模型的过程属于数据库的( ) A.需求分析 B. 概念设计 C.逻辑设计 D. 物理设计 10.有职工和亲属两个关系,当职工调出时,应该从职工关系中删除该职工的元组,同 时应该从亲属关系中删除该职工所有亲属的元组,在SQL语言中,定义这个完整性约束的 短语是( ) A. ON DELETE ALL B.ON DELETE CASCADE C.ON DELETE RESTRICT D.ON DELETE SET NULL 11.多个事务执行的次序称为( ) A.过程 B.流程 C.调度 D.步骤 12.断言机制主要用于( ) A.数据库恢复 B.完整性控制 C.并发控制 D. 安全性控制 13.在DBMS中,实现事务持久性的是( ) A.完整性子系统 B. 安全性子系统 C. 恢复子系统 D. 并发控制子系统 14.在分布式数据库系统中,将数据库划分为若干不相交的逻辑子集,且每个场地存储 一个逻辑子集的数据分配策略称为( ) A.集中式 B.分割式 C.混合式 D.组合式 15.在面向对象数据库系统中,对象定义采用的信息隐蔽技术称为( ) A.保密性 B.封装性 C.自闭性 D.隐蔽性 二、填空题(本大题共10小题,每小题1分,共10分) 请在每小题的空格中填上正确答案。错填、不填均无分。 16.数据库的三级模式结构中,单个用户使用的数据视图描述称为___________。 17.在数据库系统中三级模式结构的定义存放于___________中。 18.关系模型有三类完整性约束:实体完整性、用户定义的完整性和___________。 19.设有关系R和S,与元组关系演算表达式{t"R(t) S(t)}等价的关系代数表达式是__ _________。 20.设关系R(A,B,C)和S(A,D),用关系代数的基本运算写出与R S等价的关系代数表达式是___________。 21.设有关系模式R(A,B,C,D),F是R上成立的FD集,F={A C,A D},则R的候选键是 ___________。 22.如果X Y且有YX,那么X Y称为___________。 23.在SQL语言中,用于测试一个关系是否非空的谓词是___________。 24.在数据库系统中,视图的作用是简化操作、提高数据的独立性和数据的__________ _。 25.各场地的数据模型不同的分布式数据库系统称为___________DDBS。 三、简答题(本大题共10小题,每小题3分,共30分) 26.有学生关系S和成绩关系SC,如题26图所示,写出S与SC左外联接运算的结果。 27.依据题26图,写出与SQL语句: SELECT sname FROM S WHERE sno IN (SELECT sno FROM SC) 等价的关系代数表达式。 28.设关系模式R(A,B,C),F={AC B,AB C,B C},则R最高属于第几范式?说明理 由。 29.写出Armstrong推理规则中自反律、增广律、传递律的形式化定义。 30.简述对嵌入式SQL进行预处理的作用和过程。 31.简述日志文件的内容。 32.简述SQL中的安全性控制机制。 33.已知事务T1和T2的并发操作序列,如题33图所示,指出这个并发操作引发的问题。 34.在面向对象数据库中,查找对象的方法有哪三种? 35
int和Integer有什么区别? 答:int是java的原始数据类型,Integer是java为int提供的封装类,java为每个原始数据类型都提供了封装类。 String和StringBuffer的区别? 答:String是不可变的对象,每次对String类型进行改变都相当于产生了一个新的对象,StringBuffer是可变的字符序列,所以如果要经常改变某个字符串的话建议使用StringBuffer。 list、set、map问题? 答:set 不允许重复,无序 list 允许重复,有序 map 成对的数据结构,键值必须具有唯一性 Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上低于Servlet。 面向对象的特征? 答:1:封装:通过定义类并且给类的属性和方法加上访问控制 2:继承:子类继承父类,子类可以拥有父类中已定义的方法,并且子类可以修改父类中的方法使其更适合特殊需求。 3:多台:不同对象对统一消息作出不同响应称之为多态 4:抽象:忽略与当前主题无关的那些方面,将注意力集中在与当前目标有关的方面 运行时异常和一般异常有何异同? 答:运行时异常时(JVM)java虚拟机在运行过程中发生的问题,比如:内存溢出等问题。这类异常没法要求程序员去一一捕获并抛出,一般异常是Java类库或程序员自己写的代码发生的错误,这类异常可以由我们去一一捕获并抛出。 多线程几种实现方法,同步? 答:多线程有两种实现方法,一种是继承Thread类或者实现Runnable接口。同步就是在方法返回类型后面加上synchronized。 c#中的委托,事件是不是委托? 答:委托就是将方法作为一个参数带入另一个方法叫做委托,事件是一种特殊的委托。 应用程序域? 答:应用程序域可以理解为一种轻量级的进程,起到安全的作用,占用资源小。 Class.forName作用? 答:调用该访问返回一个以字符串指定类名的类对象。 JDO? 答:JDO是java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。 CORBA? 答:CORBA标准是公共对象请求代理结构,用途为:用不同的程序设计语言书写,在不同的进程中运行,为不同的操作系统开发。 xml解析技术? 答:常用的DOM、SAX等 DOM:处理大型文件时性能下降的非常厉害,适合对xml的随机访问 SAX:事件驱动型的xml解析方法,适合对xml的顺序访问 jsp常用动作? 答:jsp:include 引入一个文件 jsp:useBean 实例化JavaBean jsp:setProperty 设置JavaBean属性 jsp:getProperty 输出JavaBean属性 jsp:forward 转发 CTS、CLS、CLR分别作何解释? 答:CTS 通用类型系统、CLS 通用语言规范、CLR 公共语言运行时。 Struts1和Struts2原理和区别? 答:Struts1和Struts2是两个完全不同的框架,Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts2以核心控制器FilterDispatcher为基础,包含了框架内部的控制流程和处理机制。 Hibernate工作原理,Hibernate数据持久化? 答:Hibernate工作原理: 1:读取并解析映射信息,创建SessionFactory 2:打开Session 3:创建事物 4:持久化操作 5:提交事务 6:关闭Session 7:关闭SessionFactory Hibernate持久化:Hibernate根据定义的映射规则将对象持久化保存到数据库,这就实现了对象的持久化。 Spring由那几个模块组成? 答:Spring主要由7个模块组成: 1:Spring核心容器:提供了Spring框架的基本功能 2:Spring AOP:通过配置管理特性 3:Spring ORM:Spring框架集成了若干ORM框架 4:Spring DAO:打开关闭数据库连接 5:Spring WEB:为基于WEB服务的应用程序提供上下文服务 6:Spring Context:向Spring框架提供上下文信息 7:Spring MVC:分离模型、视图、控制器、以便更容易定制 折构函数和虚函数? 答:折构函数式销毁一个类的函数,虚函数是为了C++的动态绑定而设计的。 描述你的编程风格? 答:类名首字母大写,常量一般全部大写,给自己的代码加注释。 控制流程? 答:控制流程一般使用if判断条件。有第二分支,多分支,循环结构。循环本质上也是通过判断来实现的。 多形与继承? 答:多形:一个类中多个同名方法。继承:子类继承父类。 jsp内置对象? 答:request 用户端请求 response 回应 pageContext 网页属性 session 会话 out 输出 page 当前网页 exception 错误网页 application servlet正在执行的内容 config servlet构架部件 Struts模型驱动? 答:封装请求参数。 简述JDBC? 答:JDBC数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问。 什么情况下不建议使用Hibernate? 答:当数据量大,并且表关系复杂的时候不建议使用。 sleep()和wait()有什么区别? 答:sleep()是线程类的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但监控状态依然保持,到时候会自动恢复。 wait()是Object类的方法,对此对象调用了wait方法导致本线程放弃对象锁,进入等待锁定池,只有针对此对象发出notify方法后本线程才进入对象锁定池准备获得对象锁进入运行状态。 同步和异步,在什么情况下分别使用? 答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步。在很多情况下采用异步往往更有效率。 数据库三大范式? 答:1:确保每列都是不可分割的原子值 2:确保每列都和主键相关 3:确保每列都和主键直接相关,而不是间接相关 单例模式有哪些好处? 答:单例模式是一种比较常见的设计模式,带给我们以下好处: 1:控制资源的使用 2:控制实例的产生数量 3:让多个不相关的两个线程或进程之间实现通信 为什么要用spring? 答:1、主要将各个框架有效的联系起来,缩短实际编程时间。 2、可以将各个框架进行有效的管理和控制,让数据传输安全。 spring的IOC和DI? 答:控制反转和依赖注入是spring的两大基础作用。主要是将所有组件在spring提供的外部容器中加载。提高安全性,减低耦合性,使各个框架或者类之间的依赖性降低。 什么是声明式的事务管理?为什么要用?spring如何实现声明式的事务管理? 答:声明式的事务管理主要是将在进行对数据库中数据的添加或者修改时需要执行事务管理,主要是为了避免在执行添加或修改的时候添加或修改不完全正确,导致数据丢失。spring使用AOP面向切面的思想进行事务管理的。 spring和Hibernate继承后,定义事务管理特性的时候查询为什么要定义为read-only? 答:因为添加、删除和更新都涉及到了数据库的修改,而查询并未涉及到数据库修改,所以只需要定义只读,这样可以提高效率,进行更加方便的事务管理。 请你谈谈对Hibernate OR映射的理解? 答:将数据库中的每一张表都映射成一个实体。 配置了lazy="true"一定会懒加载吗? 答:不一定,如果在配置中你也使用了fetch属性的话此时lazy就会失效。 Hibernate数据库标识与主键之间的认识? 答:标识是为了方便和简介映射文件,主键是为了让数据不会重复。 为什么每次请求都要创建一个Action对象? 答:Struts2每次请求的时候都会创建一个action实例,这样会保证线程的安全。Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求需要输出的数据转发到需要做数据显示的页面。Struts2只是起到一个数据接收和转接的功能,就是Controller控制器,而传来数据的页面叫view显示层,Struts2将数据提交给进行处理的类叫Model模型层,专门进行数据处理和数据库的连接。 heap和stack有什么区别? 答:栈是一种线形集合,其添加和删除元素的操作应在同一段完成,栈按照后进先出的方式进行处理。堆是栈的一个组成元素。 EJB和JavaBean的区别? 答:EJB不是一般的JavaBean,EJB是企业级的JavaBean,EJB一共分为3种,实体Bean,消息Bean,会话Bean。书写EJB要遵循一定的规范,另外要运行EJB,你需要有相应的EJB容器,比如WebLogic、jboss等,而JavaBean不需要,只需要安装Tomcat就可以了。EJB用于服务端的应用开发,而JavaBean用于客户端应用开发。 触发器? 答:触发器是一种特殊的存储过程,主要通过事件来触发而被执行。 什么是存储过程?用什么调用? 答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计。就是说只需要创建一次,以后再程序中就可以调用多次。使用存储过程比单纯的SQL语句要快,可以用一个命令对象来调用存储过程。 索引优缺点? 答:索引可以提高对数据库中数据的检索,缺点是减慢了数据录入速度,同时也增加了数据库的尺寸大小。 什么是事务?什么是事锁? 答:事务就是被绑定在一起,作为一个逻辑单元执行的SQL语句。如果任何一个操作失败,那么整个就失败。共同失败或共同成功。锁可以保证事务的完整性和并发性。 什么是视图?游标是什么? 答:视图是一种虚拟的表,具有和物理表相同的功能。游标是对查询出来的结果集作为一个单元来有效的处理,可以对结果集的当前行做修改。 select执行顺序? 答:from where group by having select order by Collection和Collections的区别? 答:Collection是集合类的父类,继承它的主要由set和list Collections是针对集合类的帮助类,它提供了一系列针对集合的搜索,排序,线程安全化等操作。 final、finally、finalize的区别? 答:final用于声明属性方法和类,分别表示:属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句的一部分,表示总是执行。 finalize是Object的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。 assert是什么?什么时候用到? 答:断言,可以将断言看成是异常处理的一种高级形式,可以用来判断某个特定的表达式或值是否为真。 接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类? 答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。 引用传递和值传递? 答:引用传递:形参改变影响实参 值传递:形参改变不影响实参 当一个线程进入一个对象的synchronized方法后,其他线程是否可进入此对象的其他方法? 答:其他方法前是否加了synchronized关键字,如果没加则能。 说出servlet生命周期? 答:servlet实例化时调用init方法,得到请求时调用service方法,service方法自动派遣doget或dopost方法,最后当实例销毁时调用destroy方法。 error和exception有什么区别? 答:error是指错误,通常程序员不能通过代码来解决。底层环境或硬件问题。 exception是指异常,可以通过代码来解决的问题。 forward和redirect的区别? 答:forward是转发,浏览器跳转后不显示新的地址。 redirect是重定向,浏览器跳转后显示新的地址。 对比之下forward更加高效,并且它有助于隐藏实际地址,但是有些情况则必须使用redirect,否则会报异常。 jsp中动态include和静态include的区别? 答:动态include用jsp:include实现,适用于动态页面,可以携带参数 静态include用include伪码实现,适用于静态页面 math.round(11.5)等于多少?math.round(-11.5)等于多少? 答:Math.round()对数字进行四舍五入 Math.round(11.5)=12 Math.round(-11.5)=11 String s=new String("xyz");创建了几个String Object? 答:创建了两个String对象,一个保存的引用地址,一个保存实际的值。 数组有没有length()这个方法?String呢? 答:数组里面没有length()方法,而是length属性。String有length()这个方法。 swtich()能否作用在byte、long、String上? 答:swtich()传递的应该是一个整数表达式,所以它的值只能是:int、short、char、byte所以long和String都不能作用在swtich()上。 jsp和servlet之间的联系? 答:jsp前段动态页面,servlet是纯java类 jsp被编译之后会转换为servlet执行 java基本数据类型有哪些?String是不是基本数据类型,他们有何区别? 答:基本数据类型8种:int、short、byte、long、float、double、char、boolean String不是基本数据类型,引用数据类型。 区别:基本数据类型比较实用“==”,引用数据类型实用equest,并且引用数据类型存放的是地址而不是具体的值。 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出bbbhhtccc? 答:String s="bbbwlirbbb"; s.replaceAll("wlirbbb","hhtccc"); 如何将数值型字符转换为数字(Integer,Double)? 答:可以用Integer.parseInt()和Double.parseDouble()方法 如何将数字转换为字符? 答:可以使用String的valueOf()方法。 如何取得1970到现在的毫秒数? 答:可以用getTime()方法。 如何格式化日期? 答:可以用SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); 判断是否有子文件?判断是否有子目录?判断文件是否存在? 答:判断是否有子文件使用file.isFile() 判断是否有子目录使用file.isDirectory() 判断文件是否存在使用file.exists() 继承、重载、覆盖问题? 答:继承:子类继承父类,子类可以拥有父类中已定义的方法,并且子类可以修改父类中的方法使其更适合特殊需求。 重载:在一个类中方法名和返回类型相同,参数不同。 覆盖:在子类中覆盖父类的某个方法,要求方法名相同,参数类型相同。 Statement和PreparedStatement之间的区别? 答:Statement比PreparedStatement速度慢 PreparedStatement是预编译,插入时速度高于Statement Statement创建速度很慢,常用选择PreparedStatement Session机制? 答:session机制是一种服务器端机制,服务器使用一种类似于散列表的结构来保存信息。 jsp和servlet中的请求转发分别如何实现? 答:jsp可以使用jsp:forward标签转发 servlet可以使用request.getRequestDispatcher()实现转发 介绍j2ee、j2se、j2me的区别? 答:j2ee(企业版):主要用于企业web开发 j2se(标准版):主要用于web开发,但缺少企业版的一些特性 j2me(微小版):主要用于手机开发 J2ee提供的技术? 答:j2ee提供的技术有EJB、servlet、jsp等。 什么是Application Server? 答:Application Server 应用服务器 简单介绍连接池的优点和原理? 答:数据库连接和关闭是比较花费时间的一件事,而连接池可以提高我们的工作效率。 刚开始创建一定数量的池连接,当需要时从池连接中拿出一个,用完之后再把这个连接重新放回连接池。 Web.xml的作用? 答:Web.xml会在程序启动时执行,如果想在程序刚启动的时候执行一些方法的话可以配置在Web.xml中。 简单介绍您所了解的MVC? 答:在项目中使用MVC模式会使项目分工更加明确,结构更加清晰 M model 模型层:JavaBean V view 视图层:jsp html C controller 控制层:servlet 简单介绍你所了解的XML? 答:XML可扩展标记语言,可以用来标记数据,定义数据结构,是一种允许用户自定义标记的语言 简单介绍您所了解的structs、spring和hibernate? 答:struts:控制层Action,页面标签和Model数据,调用业务层 Spring:Aop管理事务控制,IOC管理各个组件的耦合 Hibernate:负责数据库和对象的映射,负责Dao层 因为你去公司面试,公司让你写笔试,不可能说XX一个题目写两页纸写的太详细,所以以上答案有的可能比较简短,没有说出重点,请大家补充,如果大家有什么更好的答案请拿出来一起分享

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值