servlet3.1规范翻译:第13章 安全
servlet3.1规范翻译:第13章 安全
目录(?)[+]
第13章 安全
应用开发人员创建Web应用,他把应用给、销售,或转让给部署人员安装到运行时环境中。应用开发人员与部署人员沟通部署系统以及安全需求。该信息可以通过应用部署描述符声明传达,或者在应用代码中使用注解来传达。
本质描述了Servlet容器安全机制、接口、部署描述符和基于注解机制传达应用安全需求。
13.1 介绍
web应用包含的资源可以被多个用户访问。这些资源常常在开放网络如Internet上不受保护的遍历。在这样的环境中,大量的web应用将有安全需求。
尽管质量保障和实现细节可能会有所不同,但servlet容器有满足这些需求的机制和基础设施,共用如下一些特性:
■ 身份认证:表示通信实体之间以代表特定身份彼此证明进行授权访问。
■ 资源访问控制:表示用户或程序与资源交互是受限制的,以达到强制完整性、保密性、或可用性约束的目的。
■ 数据完整性:表示用来证明信息在传输过程中没有被第三方修改。
■ 保密性或数据隐私:表示用来保证信息只对已授权访问的用户访问。
13.2 声明式安全
声明式安全是指以在应用外部的形式表达应用的安全模型需求,包括角色、访问控制和认证需求。部署描述符是web应用中声明式安全的主要手段。
部署人员映射应用的逻辑安全需求到特定于运行时环境代表性的安全策略。在运行时,servlet容器使用安全策略表示来实施认证和授权。
13.3 编程式安全
当单独使用声明式安全是不足以表达应用的安全模型时,编程式安全被用于安全意识的应用。编程式安全包括以下HttpServletRequest接口的方法:
login方法允许应用执行用户名和密码收集(作为一种Form-Based Login的替代)。authenticate方法允许一个应用由容器从不受约束的请求上下文内部让请求调用者认证。
getRemoteUser方法由容器返回与该请求相关的远程用户(即来访者)的名字。
isUserInRole方法确定与该请求相关的远程用户(即来访者)是否在一个特定的安全角色中。
如果没有用户通过身份认证,getRemoteUser方法返回null,isUserInRole方法总返回false,getUserPrincipal方法返回null。
例如,映射安全角色引用“FOO”到role-name为"manager"的安全角色的语法是:
- <security-role-ref>
- <role-name>FOO</role-name>
- <role-link>manager</role-link>
- </security-role-ref>
在这种情况下,如果属于“manager”安全角色的用户调用了servlet,则调用isUserInRole("FOO")API的结果是true。
如果没有security-role-ref元素与一个已经声明的security-role元素匹配,容器默认必须参照web应用的security-role元素列表去检查role-name元素参数。isUserInRole方法参考该列表以确定调用者是否映射到一个安全角色。开发人员必须注意,使用默认机制可能限制了在应用中改变角色名称不必重新编译发起调用的servlet的灵活性。
13.4 编程式访问控制注解
本章定义的注解和API提供用于配置Servlet容器强制的安全约束。
13.4.1 @ServletSecurity注解
- package javax.servlet.annotation;
- @Inherited
- @Documented
- @Target(value=TYPE)
- @Retention(value=RUNTIME)
- public @interface ServletSecurity {
- HttpConstraint value();
- HttpMethodConstraint[] httpMethodConstraints();
- }
表 13-1 ServletSecurity接口
元素 |
描述 |
默认值 |
value |
HttpConstraint 定义了应用到没有在httpMethodConstraints 返回的数组中表示的所有HTTP方法的保护。 |
@HttpConstraint |
httpMethodConstraints |
HTTP方法的特定限制数组 |
{} |
@HttpConstraint
@HttpConstraint注解用在@ServletSecurity注解中表示应用到所有HTTP协议方法的安全约束,且HTTP协议方法对应的@HttpMethodConstraint没有出现在@ServletSecurity注解中。
- package javax.servlet.annotation;
- @Documented
- @Retention(value=RUNTIME)
- public @interface HttpConstraint {
- ServletSecurity.EmptyRoleSemantic value();
- java.lang.String[] rolesAllowed();
- ServletSecurity.TransportGuarantee transportGuarantee();
- }
表 13-2 HttpConstraint接口
元素 |
描述 |
默认值 |
value |
(仅)当rolesAllowed返回一个空数组时应用的默认授权语义。 |
PERMIT |
rolesAllowed |
包含授权角色的数组 |
{} |
transportGuarantee |
在连接的请求到达时必须满足的数据保护需求。 |
NONE |
@HttpMethodConstraint
@HttpMethodConstraint注解用在@ServletSecurity注解中表示在特定HTTP协议消息上的安全约束。
- package javax.servlet.annotation;
- @Documented
- @Retention(value=RUNTIME)
- public @interface HttpMethodConstraint {
- ServletSecurity.EmptyRoleSemantic value();
- java.lang.String[] rolesAllowed();
- ServletSecurity.TransportGuarantee transportGuarantee();
- }
表 13-3 HttpMethodConstraint接口
元素 |
描述 |
默认值 |
value |
HTTP协议方法名 |
|
emptyRoleSemantic |
(仅)当rolesAllowed返回一个空数组应用的默认授权语义。 |
PERMIT |
rolesAllowed |
包含授权角色的数组 |
{} |
transportGuarantee |
在连接的请求到达时必须满足的数据保护需求。 |
NONE |
@ServletSecurity注解可以指定在(更准确地说,目标是) Servlet实现类上,且根据@Inherited元注解定义的规则,它的值是被子类继承的。至多只有一个@ServletSecurity注解实例可以出现在Servlet实现类上,且@ServletSecurity注解必须不指定在(更准确地说,目标是)Java方法上。
当一个或多个@HttpMethodConstraint注解定义在@ServletSecurity注解中时,每一个@HttpMethodConstraint定义的security-constraint,其应用到@HttpMethodConstraint中标识的HTTP协议方法。围绕的@ServletSecurity注解定义了应用到所有HTTP协议方法的security-constraint,除了那些定义在@ServletSecurity中的@HttpMethodConstraint相关的HTTP协议方法。
定义在便携式部署描述符中的security-constraint元素用于对所有出现在该约束中的url-pattern授权。
当在便携式部署描述符中的一个security-constraint包含一个url-pattern,其精确匹配一个使用@ServletSecurity注解的模式映射到的类,该注解必须不影响Servlet容器在该模式上实施的强制约束。
当为便携式部署描述符定义了metadata-complete=true时,@ServletSecurity注解不会应用到部署描述符中的任何url-pattern映射到(任何servlet映射到)的注解类。
@ServletSecurity注解不应用到ServletRegistration使用ServletContext接口的addServlet(String, Servlet)方法创建的url-pattern,除非该Servlet是由ServletContext接口的createServlet方法构建的。
除了上面列出的,当一个Servlet类使用了@ServletSecurity注解,该注解定义的安全约束应用到所有url-pattern映射到的所有Servlet映射到的类。
当一个类没有加@ServletSecurity注解时,应用到从那个类映射到的Servlet的访问策略是由合适的security-constraint元素确定的,如果有,在相关的便携式部署描述符中,或者由约束禁止任何这样的标签,则如果有,通过ServletRegistration接口的setServletSecurity方法编程式为目标servlet确定。
13.4.1.1示例
以下示例演示了ServletSecurity注解的用法。
代码示例13-1 用于所有HTTP方法,且无约束
- @ServletSecurity
- public class Example1 extends HttpServlet {
- }
代码示例13-2 用于所有HTTP方法,无认证约束,需要加密传输
- @ServletSecurity(@HttpConstraint(transportGuarantee = TransportGuarantee.CONFIDENTIAL))
- public class Example2 extends HttpServlet {
- }
代码示例13-3 用于所有HTTP方法,拒绝所有访问
- @ServletSecurity(@HttpConstraint(EmptyRoleSemantic.DENY))
- public class Example3 extends HttpServlet {
- }
代码示例13-4 用于所有HTTP方法,认证约束需要成员身份在角色“R1”中
- @ServletSecurity(@HttpConstraint(rolesAllowed = "R1"))
- public class Example4 extends HttpServlet {
- }
代码示例13-5 用于除GET和POST之外的所有HTTP方法,无约束;对于GET和POST方法,认证约束需要成员身份在角色“R1”中;对于POST,需要加密传输
- @ServletSecurity((httpMethodConstraints = {
- @HttpMethodConstraint(value = "GET", rolesAllowed = "R1"),
- @HttpMethodConstraint(value = "POST", rolesAllowed = "R1",
- transportGuarantee = TransportGuarantee.CONFIDENTIAL)
- })
- public class Example5 extends HttpServlet {
- }
代码示例 13-6 用于除了GET之外的所有HTTP方法,认证约束需要成员身份在“R1”角色中;对于GET,无约束
- @ServletSecurity(value = @HttpConstraint(rolesAllowed = "R1"),
- httpMethodConstraints = @HttpMethodConstraint("GET"))
- public class Example6 extends HttpServlet {
- }
代码示例 13-7 用于除了TRACE之外的所有HTTP方法,认证约束需要成员身份在“R1”角色中;对于TRACE,拒绝所有访问
- @ServletSecurity(value = @HttpConstraint(rolesAllowed = "R1"),
- httpMethodConstraints = @HttpMethodConstraint(value="TRACE",
- emptyRoleSemantic = EmptyRoleSemantic.DENY))
- public class Example7 extends HttpServlet {
- }
13.4.1.2映射@ServletSecurity为security-constraint
本节将介绍@ServletSecurity注解映射为它等价表示,security-constraint元素。这提供了使用已存在容器的security-constraint实施机制来简化实施。由Servlet容器实施的@ServletSecurity注解必须在实施的效果上是等价的,由容器从在本节中定义的映射产生security-constraint元素。
@ServletSecurity注解用于定义一个方法无关的@HttpConstraint,且紧跟着一个包含零个或多个@HttpMethodConstraint规格的列表。方法无关的约束应用到那些没有定义HTTP特定方法约束的所有HTTP方法。
当没有包含@HttpMethodConstraint元素,@ServletSecurity注解相当于包含一个web-resource-collection的单个security-constraint元素,且web-resource-collection不包含http-method元素,因此涉及到所有HTTP方法。
下面的例子展示了把一个不包含@HttpMethodConstraint注解的@ServletSecurity注解表示为单个security-constraint元素。相关的servlet(registration)定义的url-pattern元素将被包含在web-resource-collection中, 任何包含的auth-constraint 和 user-data-constraint元素的存在和值,将由定义在13-132页中13.4.1.3节的“映射@HttpConstraint 和 @HttpMethodConstraint为XML”的映射的@HttpConstraint的值确定。
代码示例 13-8 不包含@HttpMethodConstraint的映射@ServletSecurity
- @ServletSecurity(@HttpConstraint(rolesAllowed = "Role1"))
- <security-constraint>
- <web-resource-collection>
- <url-pattern>...</url-pattern>
- </web-resource-collection>
- <auth-constraint>
- <role-name>Role1</role-name>
- </auth-constraint>
- </security-constraint>
当指定了一个或多个@HttpMethodConstraint元素,方法无关的约束相当于包含一个web-resource-collection的单个security-constraint元素,且web-resource-collection包含的http-method-omission元素为每一个HTTP方法指定了方法特定的约束。每一个@HttpMethodConstraint相当于另一种包含一个web-resource-collection 的security-constraint,且web-resource-collection包含一个使用相应HTTP方法命名的http-method元素。下面的例子展示了映射带有单个@HttpMethodConstraint的@ServletSecurity注解为两种security-constraint元素。相应的Servlet(registration)定义的url-pattern元素将被包含在两种约束的web-resource-collection中,且任何包含的auth-constraint 和user-data-constraint元素的存在和值,将由定义在13-132页中13.4.1.3节的“映射@HttpConstraint和@HttpMethodConstraint为XML”的映射关联的@HttpConstraint和@HttpMethodConstraint的值确定。
代码示例 13-9 映射包含@HttpMethodConstraint的@ServletSecurity
- @ServletSecurity(value=@HttpConstraint(rolesAllowed = "Role1"),
- httpMethodConstraints = @HttpMethodConstraint(value = "TRACE",
- emptyRoleSemantic = EmptyRoleSemantic.DENY))
- <security-constraint>
- <web-resource-collection>
- <url-pattern>...</url-pattern>
- <http-method-omission>TRACE</http-method-omission>
- </web-resource-collection>
- <auth-constraint>
- <role-name>Role1</role-name>
- </auth-constraint>
- </security-constraint>
- <security-constraint>
- <web-resource-collection>
- <url-pattern>...</url-pattern>
- <http-method>TRACE</http-method>
- </web-resource-collection>
- <auth-constraint/>
- </security-constraint>
13.4.1.3映射@HttpConstraint和@HttpMethodConstraint为XML
本节将介绍映射@HttpConstraint和@HttpMethodConstraint注解值(在@ServletSecurity中定义使用的)为它们等价的auth-constraint和user-data-constraint表示,这些注解共用一个通用模型用于表示用在便携式部署描述符中的auth-constraint 和user-data-constraint元素的等价形式。该模型包括以下3种元素:
■ emptyRoleSemantic
授权语义,PERMIT或DENY,适用于在rolesAllowed中没有指定的角色时。此元素的默认值为PERMIT,且DENY不支持与非空的rolesAllowed列表结合使用。
■ rolesAllowed
一个包含授权角色的名字列表。当该列表为空时,其含义取决于emptyRoleSemantic的值。当角色名字“*”包含在允许的角色列表中时是没有特别的含义。该元素的默认值是一个空列表。
■ transportGuarantee
数据保护需求,NONE或CONFIDENTIAL,在连接的请求到达时必须满足。该元素与一个包含一个使用相应值的transport-guarantee的user-data-constraint是等价的。该元素的默认值是NONE。
下面的例子展示了上述的@HttpConstraint模型和web.xml中的auth-constraint和user-data-constraint元素之间的对应关系。
代码示例 13-10 emptyRoleSemantic=PERMIT, rolesAllowed={}, transportGuarantee=NONE
无约束
代码示例 13-11 emptyRoleSemantic=PERMIT,rolesAllowed={}, transportGuarantee=CONFIDENTIAL
- <<user-data-constraint>
- <transport-guarantee>CONFIDENTIAL</transport-guarantee>
- </user-data-constraint>
代码示例 13-12 emptyRoleSemantic=PERMIT, rolesAllowed={Role1}, transportGuarantee=NONE
- <auth-constraint>
- <security-role-name>Role1</security-role-name>
- </auth-constraint>
代码示例 13-13 emptyRoleSemantic=PERMIT,rolesAllowed={Role1}, transportGuarantee=CONFIDENTIAL
- <auth-constraint>
- <security-role-name>Role1</security-role-name>
- </auth-constraint>
- <user-data-constraint>
- <transport-guarantee>CONFIDENTIAL</transport-guarantee>
- </user-data-constraint>
代码示例 13-14 emptyRoleSemantic=DENY,rolesAllowed={}, transportGuarantee=NONE
- <auth-constraint/>
代码示例 13-15 emptyRoleSemantic=DENY,rolesAllowed={}, transportGuarantee=CONFIDENTIAL
- <auth-constraint/>
- <user-data-constraint>
- <transport-guarantee>CONFIDENTIAL</transport-guarantee>
- </user-data-constraint>
13.4.2 ServletRegistration.Dynamic的setServletSecurity
可在ServletContextListener 中使用setServletSecurity方法来定义应用到ServletRegistration定义的映射的安全约束。
Collection<String>setServletSecurity(ServletSecurityElement arg);
setServletSecurity方法返回一组URL pattern(可能空),其已是便携式部署描述符中的security-constraint元素的精确目标(因此,调用是不影响的)。
如果ServletContext中得到的ServletRegistration已经被初始化了,该方法抛出IllegalStateException。
13.5 角色
安全角色是由应用开发人员或装配人员定义的逻辑用户分组。当部署了应用,由部署人员映射角色到运行时环境的principal或组。
Servlet容器根据principal的安全属性为与进入请求相关的principal实施声明式或编程式安全。这可能以如下任一方式发生:
13.6 认证
web客户端可以使用以下机制之一向web服务器认证用户身份:
■ HTTP基本认证(HTTP Basic Authentication)
■ HTTP摘要认证(HTTP Digest Authentication)
■ HTTPS客户端认证(HTTPS Client Authentication)
■ 基于表单的认证(Form Based Authentication)
13.6.1 HTTP基本认证
13.6.2 HTTP摘要认证
13.6.3基于表单的认证
“登录界面”的外观在使用web浏览器的内置的认证机制时不能被改变。本规范引入了所需的基于表单的认证机制,允许开发人员控制登录界面的外观。
Web应用部署描述符包含登录表单和错误页面条目。登录界面必须包含用于输入用户名和密码的字段。这些字段必须分别命名为j_username和j_password。
当用户试图访问一个受保护的web资源,容器坚持用户的认证。如果用户已经通过认证则具有访问资源的权限,请求的web资源被激活并返回一个引用。如果用户未被认证,发生所有如下步骤:
1. 与安全约束关联的登录界面被发送到客户端,且由容器存储触发认证的URL路径。
5. 如果认证失败,使用forward或redirect返回错误页面,且响应状态码设置为200。
6. 如果认证成功,检查被验证用户的principal,看其是否是以一个授权的角色访问资源。
7. 如果用户被授权,客户端使用存储的URL路径重定向回资源。
HttpServletRequest接口的login方法提供另一种用于应用控制它的登录界面外观的手段。
基于表单的登录和基于URL的session跟踪可以通过编程实现。基于表单的登录应该仅被用在当session由cookie或SSL session信息维护时。
为了进行适当的认证,登录表单的action 总是j_security_check。该限制使得不管请求什么资源,登录表单都能工作,且避免了要求服务器指定输出表单的action字段。
- <form method=”POST” action=”j_security_check”>
- <input type=”text” name=”j_username”>
- <input type=”password” name=”j_password”>
- </form>
如果因为HTTP请求造成基于表单的登录被调用,容器必须保存原始请求参数,在成功认证时使用,它重定向调用所请求的资源。
如果用户已使用表单登录通过认证,且已经创建一个HTTP session,该session的超时或失效将导致用户被注销,在这种情况下,随后的请求必须导致用户重新认证。注销与认证具有相同的作用域:例如,如果容器支持单点登录,如兼容JavaEE技术的web容器,用户只需要与托管在web容器中的任何一个web应用重新认证即可。
13.6.4 HTTPS客户端认证
13.6.5 其他容器认证机制
13.7 服务器跟踪认证信息
下面的安全标识(如用户和组)在运行时环境中映射的角色是环境指定的而非应用指定的,理想的是:
2. 在同一个容器部署的所有应用能使用相同的认证信息来表示principal,且
因此,servlet容器需要在容器级别(而不是在web应用级别)跟踪认证信息。这允许在一个web应用已经通过认证的用户可以访问容器管理的以同样的安全标识许可的其他资源。
13.8 指定安全约束
安全约束是一种定义web内容保护的声明式方式。安全约束关联授权和或在web资源上对HTTP操作的用户数据约束。安全约束,在部署描述符中由security-constraint表示,其包含以下元素:
■ web资源集合(部署描述符中的web-resource-collection)
■ 授权约束 (部署描述符中的auth-constraint)
■ 用户数据约束 (部署描述符中的user-data-constraint)
HTTP操作和应用安全约束(取出受限的请求)的web资源由一个或多个web资源集合标识。Web资源集合包含以下元素:
■ HTTP methods (部署描述符中的http-method或http-method-omission元素)
■ role name (部署描述符中的role-name)
■ transport guarantee (部署描述符中的transport-guarantee)
如果没有授权约束应用到请求,容器必须接受请求,而不要求用户身份认证。如果没有用户数据约束应用到请求,当容器通过任何包括不受保护的连接接收到请求时,必须接受此请求。
13.8.1 组合约束
13.8.2 示例
下面的示例演示了组合约束及它们翻译到的可应用的约束表格。假设部署描述符包含如下安全约束。
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>precluded methods</web-resource-name>
- <url-pattern>/*</url-pattern>
- <url-pattern>/acme/wholesale/*</url-pattern>
- <url-pattern>/acme/retail/*</url-pattern>
- <http-method-omission>GET</http-method-omission>
- <http-method-omission>POST</http-method-omission>
- </web-resource-collection>
- <auth-constraint/>
- </security-constraint>
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>wholesale</web-resource-name>
- <url-pattern>/acme/wholesale/*</url-pattern>
- <http-method>GET</http-method>
- <http-method>PUT</http-method>
- </web-resource-collection>
- <auth-constraint>
- <role-name>SALESCLERK</role-name>
- </auth-constraint>
- </security-constraint>
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>wholesale 2</web-resource-name>
- <url-pattern>/acme/wholesale/*</url-pattern>
- <http-method>GET</http-method>
- <http-method>POST</http-method>
- </web-resource-collection>
- <auth-constraint>
- <role-name>CONTRACTOR</role-name>
- </auth-constraint>
- <user-data-constraint>
- <transport-guarantee>CONFIDENTIAL</transport-guarantee>
- </user-data-constraint>
- </security-constraint>
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>retail</web-resource-name>
- <url-pattern>/acme/retail/*</url-pattern>
- <http-method>GET</http-method>
- <http-method>POST</http-method>
- </web-resource-collection>
- <auth-constraint>
- <role-name>CONTRACTOR</role-name>
- <role-name>HOMEOWNER</role-name>
- </auth-constraint>
- </security-constraint>
翻译这个假定的部署描述符将产生定义在表13-4中的约束。
表 13-4 安全约束表
url-pattern |
http-method |
许可的角色 |
支持的连接类型 |
/* |
所有方法 除GET,POST |
阻止访问 |
不限制 |
/acme/wholesale/* |
所有方法 除GET,POST |
阻止访问 |
不限制 |
/acme/wholesale/* |
GET |
CONTRACTOR SALESCLERK |
不限制 |
/acme/wholesale/* |
POST |
CONTRACTOR |
CONFIDENTIAL |
/acme/retail/* |
所有方法 除GET,POST |
阻止访问 |
不限制 |
/acme/retail/* |
GET |
CONTRACTOR HOMEOWNER |
不限制 |
/acme/retail/* |
POST |
CONTRACTOR HOMEOWNER |
不限制 |
13.8.3 处理请求
13.9 默认策略
13.10 登录和退出
servlet3.1规范翻译:第13章 安全相关推荐
- servlet3.1规范翻译:前言
应朋友之邀(博客地址:http://jinnianshilongnian.iteye.com/),一起翻译servlet3.1规范,本人不才,英语水平有限,勉强而为之.翻译过程中有很多地方把握不准确, ...
- Servlet3.1规范翻译 - 应用生命周期事件
2019独角兽企业重金招聘Python工程师标准>>> https://github.com/javahongxi 本文转载自kaitao.toutiao.im 应用生命周期事件 1 ...
- java 可插拔注解_servlet3.1规范翻译:第8章 注解和可插拔性
servlet3.1规范翻译:第8章 注解和可插拔性 . 这是Servlet3.0的新特性之一:这是Servlet3.0的新特性之一: 通过Annotation(注解)配置Servlet之前版本的Se ...
- 翻译《文件系统取证分析》第13章
第13章 NTFS 数据结构 这是关于NTFS的第三章亦是最后一章,这里我们将分析它的数据结构.前两章写了它的基本概念和怎么去解析它.对许多人来说,目前为止所涉及的知识已经足够了,但我们中的其他人想知 ...
- sx1268芯片手册第13章翻译
sx1268芯片手册第13章谷歌翻译,包含了所有的命令操作函数的中文翻译,30多页内容不便直接粘贴,具体见文档 sx1268芯片手册第13章机器翻译.pdf
- 《Programming WPF》翻译 第7章 3.笔刷和钢笔
原文:<Programming WPF>翻译 第7章 3.笔刷和钢笔 为了在屏幕上绘制一个图形,WPF需要知道你想要为图形填充什么颜色以及如何绘制它的边框.WPF提供了一些Brush类型支 ...
- Linux就这个范儿 第13章 打通任督二脉
Linux就这个范儿 第13章 打通任督二脉 0111010110--你有没有想过,数据从看得见或看不见的线缆上飞来飞去,是怎么实现的呢?数据传输业务的未来又在哪里?在前面两章中我们学习了Linux网 ...
- java核心技术卷I 第1-3章 笔记
java核心技术卷I 第1-3章 本书将详细介绍下列内容: ● 面向对象程序设计 ● 反射与代理 ● 接口与内部类 ● 异常处理 ● 泛型程序设计 ● 集合框架 ● 事件监听器模型 ● 使用Swing ...
- 关于对《Spring Security3》翻译 (第一章 - 第三章)
原文:http://lengyun3566.iteye.com/category/153689?page=2 翻译说明 最近阅读了<Spring Security3>一书,颇有收获(封面见 ...
最新文章
- 使用cv2.Sobel()、cv2.Scharr()、cv2.Laplacian()寻找图像的梯度、边缘
- 《LeetCode力扣练习》第136题 只出现一次的数字 Java
- python基础05
- DW Question Answer Pro 1.3.4 DWQA问答系统插件
- 大数据领域可以应聘的岗位
- 封装caffe-windows-gpu(支持模型有多个输出)
- linux修改用户名和密码
- 证明独立集合问题是NP-complete
- atitit.提升软件开发效率大的总结O5
- 安川机器人如何注释化指令_安川机器人指令一览
- 基于大数据平台的数据仓库
- 如何安装nginx并代理下载服务器文件
- chat后缀域名_.chat域名简介
- 第十四周助教心得体会
- 支持树莓派的路由器系统_基于树莓派(Raspberry Pi)搭建openwrt路由器
- 验证码——python去除干扰线
- 搭建MPI并行计算环境并计算pi值[windows 和 Ubuntu]
- 运行moveit报错
- java断路器原理_spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护...
- 迷宫之深搜回溯算法(B站)
热门文章
- python_爬虫 01 爬虫前奏
- ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)
- 一位小程序代理商亲自见证小程序在外卖行业的突破
- mesothelioma-弥漫性间皮瘤
- MySQL 连接挂死了!该如何排查?
- 抖音直播伴侣显示服务器问题,抖音直播伴侣窗口怎么设置?调整窗口的方法了解一下...
- register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.
- Maven学习(一)---Maven简介
- 兔子繁衍问题—c语言
- 关于double和float类型的转换