Spring Security和Angular教程(二)登录页面
Spring Security和Angular教程(二)
登录页面
在本节中,我们将继续讨论如何在“单页面应用程序”中使用带有Angular的Spring Security。在这里,我们将展示如何使用Angular通过表单对用户进行身份验证,并获取要在UI中呈现的安全资源。这是一系列部分中的第二部分,您可以通过阅读第一部分来了解应用程序的基本构建块或从头开始构建它,或者您可以直接访问Github中的源代码。在第一部分中,我们构建了一个使用HTTP Basic身份验证来保护后端资源的简单应用程序。在这一个中,我们添加一个登录表单,让用户可以控制是否进行身份验证,并在第一次迭代时解决问题(主要是缺乏CSRF保护)。
提醒:如果您正在使用示例应用程序完成此部分,请务必清除Cookie和HTTP Basic凭据的浏览器缓存。在Chrome中,为单个服务器执行此操作的最佳方法是打开新的隐身窗口。
添加导航到主页
Angular应用程序的核心是基本页面布局的HTML模板。我们已经有一个非常基本的,但对于这个应用程序,我们需要提供一些导航功能(登录,注销,主页),所以让我们修改它(in src/app
):
app.component.html
<div class="container"><ul class="nav nav-pills"><li><a routerLinkActive="active" routerLink="/home">Home</a></li><li><a routerLinkActive="active" routerLink="/login">Login</a></li><li><a (click)="logout()">Logout</a></li></ul>
</div>
<div class="container"><router-outlet></router-outlet>
</div>
主要内容是a,<router-outlet/>
并且有一个带登录和注销链接的导航栏。
所述<router-outlet/>
选择器是由角提供,它需要在主模块中进行接线同一个组件。每个路由将有一个组件(每个菜单链接),以及将它们粘合在一起的帮助程序服务,并共享一些state(AppService
)。这是将所有部分组合在一起的模块的实现:
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { RouterModule, Routes } from '@angular/router';
import { AppService } from './app.service';
import { HomeComponent } from './home.component';
import { LoginComponent } from './login.component';
import { AppComponent } from './app.component';const routes: Routes = [{ path: '', pathMatch: 'full', redirectTo: 'home'},{ path: 'home', component: HomeComponent},{ path: 'login', component: LoginComponent}
];@NgModule({declarations: [AppComponent,HomeComponent,LoginComponent],imports: [RouterModule.forRoot(routes),BrowserModule,HttpClientModule,FormsModule],providers: [AppService]bootstrap: [AppComponent]
})
export class AppModule { }
我们在一个名为“RouterModule”的Angular模块上添加了一个依赖项,这使我们能够在一个router
构造函数中注入一个魔法AppComponent
。在routes
使用的进口内AppModule
设置链接到“/”(“家”控制器)和“/登录”(以下简称“登陆”控制器)。
我们还潜入了FormsModule
那里,因为稍后需要将数据绑定到我们想要在用户登录时提交的表单。
UI组件都是“声明”,服务粘合剂是“提供者”。在AppComponent
实际上并没有做很多。与app root一起使用的TypeScript组件位于:
app.component.ts
import { Component } from '@angular/core';
import { AppService } from './app.service';
import { HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';
import 'rxjs/add/operator/finally';@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css']
})
export class AppComponent {constructor(private app: AppService, private http: HttpClient, private router: Router) {this.app.authenticate(undefined, undefined);}logout() {this.http.post('logout', {}).finally(() => {this.app.authenticated = false;this.router.navigateByUrl('/login');}).subscribe();}}
突出特点:
-
还有一些依赖注入,这次是
AppService
-
有一个注销函数作为组件的属性公开,我们稍后可以使用它向后端发送注销请求。它在
app
服务中设置一个标志,并将用户发送回登录屏幕(并通过finally()
回调无条件地执行此操作)。 -
我们正在使用
templateUrl
将模板HTML外部化为单独的文件。 -
在
authenticate()
加载控制器时调用该函数以查看用户是否实际上已经过身份验证(例如,如果他在会话中间刷新了浏览器)。我们需要authenticate()
函数来进行远程调用,因为实际的身份验证是由服务器完成的,我们不希望信任浏览器来跟踪它。
app
我们上面注入的服务需要一个布尔标志,以便我们可以判断用户当前是否已经过身份验证,以及authenticate()
可用于对后端服务器进行身份验证的函数,或者仅查询用户详细信息:
app.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';@Injectable()
export class AppService {authenticated = false;constructor(private http: HttpClient) {}authenticate(credentials, callback) {const headers = new HttpHeaders(credentials ? {authorization : 'Basic ' + btoa(credentials.username + ':' + credentials.password)} : {});this.http.get('user', {headers: headers}).subscribe(response => {if (response['name']) {this.authenticated = true;} else {this.authenticated = false;}return callback && callback();});}}
该authenticated
标志是简单的。authenticate()
如果提供了HTTP基本身份验证凭据,则该函数将发送,否则不会。它还有一个可选callback
参数,如果认证成功,我们可以用它来执行一些代码。
打招呼
来自旧主页的问候语内容可以直接显示在“src / app”中的“app.component.html”旁边:
home.component.html
<h1>Greeting</h1>
<div [hidden]="!authenticated()"><p>The ID is {{greeting.id}}</p><p>The content is {{greeting.content}}</p>
</div>
<div [hidden]="authenticated()"><p>Login to see your greeting</p>
</div>
由于用户现在可以选择是否登录(在浏览器完全控制之前),我们需要在UI中区分安全内容和非安全内容。我们通过添加对(当前不存在的)authenticated()
函数的引用来预测这一点。
该HomeComponent
再去捡问候,同时还提供了authenticated()
拉动旗出的效用函数AppService
:
home.component.ts
import { Component, OnInit } from '@angular/core';
import { AppService } from './app.service';
import { HttpClient } from '@angular/common/http';@Component({templateUrl: './home.component.html'
})
export class HomeComponent {title = 'Demo';greeting = {};constructor(private app: AppService, private http: HttpClient) {http.get('resource').subscribe(data => this.greeting = data);}authenticated() { return this.app.authenticated; }}
登录表格
登录表单也有自己的组件:
login.component.html
<div class="alert alert-danger" [hidden]="!error">There was a problem logging in. Please try again.
</div>
<form role="form" (submit)="login()"><div class="form-group"><label for="username">Username:</label> <input type="text"class="form-control" id="username" name="username" [(ngModel)]="credentials.username"/></div><div class="form-group"><label for="password">Password:</label> <input type="password"class="form-control" id="password" name="password" [(ngModel)]="credentials.password"/></div><button type="submit" class="btn btn-primary">Submit</button>
</form>
这是一个非常标准的登录表单,有2个用户名和密码输入,以及一个通过Angular事件处理程序提交表单的按钮(submit)
。您不需要对表单标记执行操作,因此最好不要将其放入表单标记中。还有一条错误消息,仅在角度模型包含时显示error
。表单控件使用ngModel
从角形式的HTML和角控制器之间传递数据,并且在这种情况下,我们使用的是credentials
对象来保存用户名和pasword。
身份验证过程
为了支持我们刚刚添加的登录表单,我们需要添加更多功能。在客户端,这些将LoginComponent
在服务器上实现,它将是Spring Security配置。
提交登录表格
要提交表单,我们需要定义login()
我们在表单via中引用的函数ng-submit
,以及credentials
我们引用的对象ng-model
。让我们充实“登录”组件:
login.component.ts
import { Component, OnInit } from '@angular/core';
import { AppService } from './app.service';
import { HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';@Component({templateUrl: './login.component.html'
})
export class LoginComponent {credentials = {username: '', password: ''};constructor(private app: AppService, private http: HttpClient, private router: Router) {}login() {this.app.authenticate(this.credentials, () => {this.router.navigateByUrl('/');});return false;}}
除了初始化credentials
对象外,它还定义login()
了表单中我们需要的对象。
在authenticate()
发出GET一个相对资源(相对于你的应用程序的部署根)“/用户”。从login()
函数调用时,它会在标头中添加Base64编码的凭据,因此在服务器上它会进行身份验证并接受cookie作为回报。当我们获得认证结果时,该login()
函数还相应地设置本地$scope.error
标志,该结果用于控制登录表单上方的错误消息的显示。
当前经过身份验证的用户
要为该authenticate()
功能提供服务,我们需要在后端添加一个新端点:
UiApplication.java
@SpringBootApplication
@RestController
public class UiApplication {@RequestMapping("/user")public Principal user(Principal user) {return user;}...}
这是Spring Security应用程序中的一个有用技巧。如果“/ user”资源可以访问,那么它将返回当前经过身份验证的用户(an Authentication
),否则Spring Security将拦截该请求并通过a发送401响应AuthenticationEntryPoint
。
处理服务器上的登录请求
Spring Security可以轻松处理登录请求。我们只需要在主应用程序类中添加一些配置(例如作为内部类):
UiApplication.java
@SpringBootApplication
@RestController
public class UiApplication {...@Configuration@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.httpBasic().and().authorizeRequests().antMatchers("/index.html", "/", "/home", "/login").permitAll().anyRequest().authenticated();}}}
这是一个带有Spring Security自定义的标准Spring Boot应用程序,只允许匿名访问静态(HTML)资源。HTML资源需要供匿名用户使用,而不仅仅是被Spring Security忽略,原因很明显。
我们需要记住的最后一件事是使Angular提供的JavaScript组件匿名提供给应用程序。我们可以在HttpSecurity
上面的配置中做到这一点,但由于它是静态内容,最好简单地忽略它:
application.yml
security:ignored:- "*.bundle.*"
添加默认HTTP请求标头
如果此时运行应用程序,您会发现浏览器会弹出基本身份验证对话框(用户名和密码)。它这样做是因为它看到一个401效应初探从XHR请求/user
,并/resource
以“WWW身份验证”标头。抑制此弹出窗口的方法是禁止来自Spring Security的标头。抑制响应标头的方法是发送一个特殊的传统请求标头“X-Requested-With = XMLHttpRequest”。它曾经是Angular中的默认值,但是它们在1.3.0中取出了它。所以这里是如何在Angular XHR请求中设置默认标头。
首先扩展RequestOptions
Angular HTTP模块提供的默认值:
app.module.ts
@Injectable()
export class XhrInterceptor implements HttpInterceptor {intercept(req: HttpRequest<any>, next: HttpHandler) {const xhr = req.clone({headers: req.headers.set('X-Requested-With', 'XMLHttpRequest')});return next.handle(xhr);}
}
这里的语法是样板文件。该implements
财产Class
是它的基类,而除了构造函数中,我们真正需要做的是重写intercept()
它总是被称为角,可用于添加额外的头功能。
要安装这个新的RequestOptions
工厂,我们需要声明它在providers
的AppModule
:
app.module.ts
@NgModule({...providers: [AppService, { provide: HTTP_INTERCEPTORS, useClass: XhrInterceptor, multi: true }],...
})
export class AppModule { }
登出
该应用程序几乎在功能上完成。我们需要做的最后一件事是实现我们在主页中勾画的注销功能。如果用户已通过身份验证,那么我们会显示“注销”链接并将其挂钩到该logout()
功能中AppComponent
。请记住,它将HTTP POST发送到“/ logout”,我们现在需要在服务器上实现。这很简单,因为Spring Security已经为我们添加了它(即我们不需要为这个简单的用例做任何事情)。为了更好地控制注销行为,您可以使用to中的HttpSecurity
回调WebSecurityAdapter
,例如在注销后执行一些业务逻辑。
CSRF保护
该应用程序几乎可以使用,事实上,如果你运行它,你会发现到目前为止我们构建的所有内容实际上都有效,除了注销链接。尝试使用它并查看浏览器中的响应,您将看到原因:
POST /logout HTTP/1.1
...
Content-Type: application/x-www-form-urlencodedusername=user&password=passwordHTTP/1.1 403 Forbidden
Set-Cookie: JSESSIONID=3941352C51ABB941781E1DF312DA474E; Path=/; HttpOnly
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
...{"timestamp":1420467113764,"status":403,"error":"Forbidden","message":"Expected CSRF token not found. Has your session expired?","path":"/login"}
这很好,因为这意味着Spring Security的内置CSRF保护措施已经开始,以防止我们在脚下射击。它只需要一个名为“X-CSRF”的标头发送给它的标记。在HttpRequest
加载主页的初始请求的属性中,CSRF令牌的值在服务器端可用。要将它传送到客户端,我们可以使用服务器上的动态HTML页面呈现它,或通过自定义端点公开它,否则我们可以将其作为cookie发送。最后一个选择是最好的,因为Angular已经基于cookie 内置了对CSRF(它称之为“XSRF”)的支持。
所以在服务器上我们需要一个自定义过滤器来发送cookie。Angular希望cookie名称为“XSRF-TOKEN”,默认情况下Spring Security将其作为请求属性提供,因此我们只需要将值从请求属性传递到cookie。幸运的是,Spring Security(自4.1.0开始)提供了一个特殊的功能CsrfTokenRepository
,它可以完成以下任务:
UiApplication.java
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http....and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());}
}
有了这些更改,我们不需要在客户端执行任何操作,登录表单现在正在运行。
它是如何工作的?
如果您使用某些开发人员工具,则可以在浏览器中看到浏览器和后端之间的交互(通常F12打开它,默认情况下在Chrome中运行,可能需要Firefox中的插件)。这是一个总结:
动词 | 路径 | 状态 | 响应 |
---|---|---|---|
得到 | / | 200 | 的index.html |
得到 | /*.js | 200 | 角度资产 |
得到 | /用户 | 401 | 未经授权(被忽略) |
得到 | /家 | 200 | 主页 |
得到 | /用户 | 401 | 未经授权(被忽略) |
得到 | /资源 | 401 | 未经授权(被忽略) |
得到 | /用户 | 200 | 发送凭据并获取JSON |
得到 | /资源 | 200 | JSON问候语 |
上面标记为“忽略”的响应是Angular在XHR调用中收到的HTML响应,并且由于我们不处理该数据,因此HTML被丢弃在地板上。我们确实在“/ user”资源的情况下寻找经过身份验证的用户,但由于它在第一次调用中不存在,因此该响应被删除。
仔细查看请求,您会看到他们都有cookie。如果你从一个干净的浏览器开始(例如在Chrome中隐身),第一个请求没有cookie去服务器,但是服务器发回“Set-Cookie”为“JSESSIONID”(常规HttpSession
)和“X-XSRF” -TOKEN“(我们在上面设置的CRSF cookie)。后续请求都有这些cookie,它们很重要:没有它们,应用程序就无法工作,它们提供了一些非常基本的安全功能(身份验证和CSRF保护)。当用户进行身份验证(POST后)时,cookie的值会发生变化,这是另一个重要的安全功能(防止会话固定攻击)。
CSRF保护依赖于将cookie发送回服务器是不够的,因为即使您不在从应用程序加载的页面中,浏览器也会自动发送它(跨站点脚本攻击,也称为XSS)。标题不会自动发送,因此原点受到控制。您可能会在我们的应用程序中看到CSRF令牌作为cookie发送到客户端,因此我们将看到它由浏览器自动发回,但它是提供保护的头。 |
帮助,我的应用程序如何扩展?
“但是等等......”你说,“在单页应用程序中使用会话状态真的不好吗?” 这个问题的答案必须“大部分”,因为使用会话进行身份验证和CSRF保护肯定是一件好事。该状态必须存储在某个地方,如果您将其从会话中取出,则必须将其放在其他位置,并在服务器和客户端上自行手动管理。这只是更多的代码,可能更多的维护,并通常重新发明一个非常好的车轮。
“但是,但是......”你会回答,“我现在如何横向扩展我的应用程序?” 这是你上面提到的“真实”问题,但它往往会缩短为“会话状态不好,我必须是无国籍”。不要惊慌。这里要考虑的重点是安全是有状态的。您无法拥有安全的无状态应用程序。那么你要在哪里存储州?这里的所有都是它的。Rob Winch在Spring Exchange 2014上发表了非常有用且富有洞察力的演讲,解释了对状态的需求(以及它的无处不在 - TCP和SSL是有状态的,因此无论你是否知道你的系统都是有状态的),这可能值得一看如果你想更深入地研究这个话题。
好消息是你有一个选择。最简单的选择是将会话数据存储在内存中,并依赖负载均衡器中的粘性会话将来自同一会话的请求路由回相同的JVM(它们都以某种方式支持)。这是够好让你掉在地上,并会为工作真正大量的使用案例。另一种选择是在应用程序的实例之间共享会话数据。只要您是严格的并且只存储安全数据,它就很小并且不经常更改(仅当用户登录和退出,或者他们的会话超时时),因此不应该存在任何重大的基础结构问题。使用Spring Session也很容易。我们将在本系列的下一部分中使用Spring Session,因此没有必要详细介绍如何在此处进行设置,但它实际上是几行代码和一个Redis服务器,它超级快速。
设置共享会话状态的另一种简单方法是将应用程序作为WAR文件部署到Cloud Foundry Pivotal Web服务,并将其绑定到Redis服务。 |
但是,我的自定义令牌实现怎么样(它是无状态的,看看)?
如果那是你对上一部分的回应,那么再读一遍,因为也许你第一次没有得到它。如果你将令牌存储在某处,它可能不是无状态的,但即使你没有(例如你使用JWT编码的令牌),你将如何提供CSRF保护?这一点很重要。这是一条经验法则(归功于Rob Winch):如果您的应用程序或API将由浏览器访问,则需要CSRF保护。这并不是说你没有会话就无法做到这一点,只是你必须自己编写所有代码,这是什么意思,因为它已经实现并且在上面完美运行HttpSession
(从一开始,它又是你正在使用的容器的一部分,并且已经成为规格的一部分)?即使您决定不需要CSRF,并且拥有完美的“无状态”(非基于会话)令牌实现,您仍然必须在客户端编写额外的代码来使用和使用它,您可以将其委托给浏览器和服务器自带的内置功能:浏览器总是发送cookie,服务器总是有一个会话(除非你关闭它)。这段代码不是商业逻辑,它不会让你赚钱,只是一个开销,所以更糟糕的是,它花费你的钱。
结论
我们现在拥有的应用程序接近于用户在实时环境中的“真实”应用程序中可能期望的内容,并且它可能被用作模板,用于构建具有该体系结构的功能更丰富的应用程序(具有静态的单个服务器)内容和JSON资源)。我们使用HttpSession
存储安全数据,依靠我们的客户尊重和使用我们发送的cookie,我们对此感到满意,因为它让我们专注于我们自己的业务领域。在下一节中我们将架构扩展到单独的身份验证和UI服务器,以及JSON的独立资源服务器。这显然很容易推广到多个资源服务器。我们还将把Spring Session引入堆栈,并展示如何使用它来共享身份验证数据。
原文地址:https://spring.io/guides/tutorials/spring-security-and-angular-js
下载代码:https://github.com/daqiang123/Spring-Security-and-Angular/tree/master/single
依次执行mvn clean,mvn install,mvn spring-boot:run命令,运行程序。
如果执行命令报错,可终止后再次执行。
在浏览器中输入http://localhost:8080/,访问程序。
在登录框中输入用户名:user,密码:password,
登录成功后,如下图所示:
欢迎加入大华软件学院QQ群交流,群号:665714453。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- angular7教程(1)——初步了解angular7及项目构建
1、安装cli npm install -g angular/cli 2、创建工作区和初始应用项目 ng new my-app npm ERR! path E:\aGit-project\myapp\node_modules\.staging\typescript-53141799\lib\tsserverlibrary.js npm ERR! code EPERM npm ERR! errno -4048 npm ERR! syscall unlink npm ER…...
2024/4/21 2:11:08 - Angular 使用教程
1、下载node.js,然后一直安装,可以修改一下node.js文件安装路径 查看是否node.js安装成功,在运行——cmd中输入以下代码。如果安装成功,则会显示出node.js的版本号node -v2、安装Angular CLI 在cmd中继续输入安装 angular命令行界…...
2024/4/21 2:11:08 - Angular 英雄示例教程
英雄指南教程(Tour of Heroes)涵盖了 Angular 的基本知识。 在本教程中,你将构建一个应用,来帮助人事代理机构来管理一群英雄。 这个入门级 app 包含很多数据驱动的应用所需的特性。 它需要获取并显示英雄的列表、编辑所选英雄的…...
2024/4/22 7:21:41 - Angular10教程--1.0 环境搭建
从这篇文章开始,我将在这里记录学习angular10的全部过程。这是一条艰辛的路,希望我能坚持走下去~(原文查看) 1.安装全局ANGULAR CLI npm install -g angular/cli10 // windows sudo npm install -g angular/cli10 // macOS安装成功后执行n…...
2024/4/21 2:11:06 - Angula4学习(一)简介及Angular程序框架
一、课程简介 1.AngularJS/Angular ①AngularJS 优点 a.模板功能强大丰富 b.比较 完善的前端MVC框架 c.引入了JAVA的一些概念 缺点 a.性能:双向数据绑定 b.路由:不能嵌套 c.作用域:无法原生JS d.表单验证:显示错误信息复…...
2024/4/22 11:13:47 - Angular 服务端渲染(SSR) 学习笔记
文章目录1 服务器端渲染 (SSR)2 SSR的利弊2.1 SSR的优势2.2 SSR的局限3 Angular Universal3.1 Node.js Express web server3.2 限制4 总结1 服务器端渲染 (SSR) SSR是Server Side Render简称,页面上的内容是通过服务端…...
2024/4/21 2:11:03 - Angular框架中控制css样式
Angular中控制样式这话题在之前一篇文章里曾涉及:http://blog.csdn.net/u011649436/article/details/12249457 现在决定单独拿出来讨论一下。 开/关某个样式是前端编程中一个非常基本的要求,在jquery年代这功能是挺容易完成的: $(.blablabl…...
2024/4/20 14:53:08 - 初始angular框架(1)
作为一个从来没有使用过的angular框架的小白 第一步肯定是 看文档! 没错就是看文档了!转载于:https://www.cnblogs.com/lovelysunflower/p/6208305.html...
2024/4/21 2:11:01 - angular 动态html,angular如何动态添加css?
AngularJS 是一个 JavaScript 框架。它可通过 使用AngularJS动态设置CSS大致有2种思路:1、通过动态设置class名称比如先定义2个样式:.show-true{display:block;}.show-flase{display:none;}在某个元素中:temp为$scope的一个变量,通…...
2024/4/21 2:11:00 - angular框架的SmartAdmin模板 如何请求后台数据
公司新项目用angular 并且要求在smartadmin里写, 以前没用过,记一下。 1.在自己的模块里创建控制器controllers.js文件 文件里代码如下: angular.module(app.Inspection).controller("inspection",function ($scope, Inspection…...
2024/4/21 2:10:59 - Angular框架4升级到6
卸载 卸载脚手架,node库,以及文件,(手动卸载) 重新配置angular环境,安装ts(npm install -g typescript), 安装脚手架:(npm install --save-dev angular/clilatest -g) 可以手动是删除文件: npm…...
2024/4/21 2:10:59 - Angular 的 Material Design 风格框架 Angular Material
Angular Material 详细介绍 Material Design for Angular 是 Angular 官方团队开发的基于最新版本 Angular 的 Material Design 风格的框架,可和 Nest.js 搭配使用做全栈开发。 针对 Angular 1 版本的实现 https://www.oschina.net/p/material-design-for-angular…...
2024/4/21 2:10:57 - angular4搭建框架步骤以及注意点
1. 新创建一个项目 : ng new app(项目名称) 2. 进入到项目中,npm install,加载依赖包 3. ng serve 运行,在浏览器输入localhost:4200查看项目,是否成功 4. 停止项目是:ctrlc 然后输入y即可 4. src下边的app…...
2024/4/21 2:10:57 - Angular 表单状态及校验
在angular框架中,表单状态的含义: valid:校验成功invalid: 校验失败pending: 表单正在提交过程中pristine: 数据依然处于原始状态,字段没有被修改过dirty: 数据已经变脏了,被用户修改过了touched: 被触摸或点击过unto…...
2024/4/21 2:10:55 - Bootstrap的css如何导入angular框架
在前端中想加入一个bootstrap自带的carousel,但是发现怎么弄都不是图片轮询而是一张一张图顺着下来的,折腾好久才发现原来不是单单把bootstrap下好就好的啦,还要导入!方法一:在index.html中加入<link rel"styl…...
2024/4/21 2:10:54 - Angular 2 架构概览
网址:https://angular.cn/docs/ts/latest/guide/architecture.html------------------------------第一部分:Angular应用中8个主要构造块------------------------------这个架构图展现了 Angular 应用中的 8 个主要构造块:模块 (Modules)组件…...
2024/4/21 2:10:53 - Angular-使用Angular CLI快速搭建框架
什么是Angular? 是一款优秀的前端JS框架,AngularJS有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等,AngularJS 是一个 JavaScript 框架。它是一个以 JavaScript 编写的库. 搭建前端框架一般的三种方法…...
2024/4/20 20:29:52 - 三大框架的优缺点(Vue、Angular、React)以及Svelte
三大框架的优缺点 Vue Vue优点 简单:官方文档很清晰,比 Angular 简单易学。快速:异步批处理方式更新 DOM。组合:用解耦的、可复用的组件组合你的应用程序。紧凑:~18kb mingzip,且无依赖。强大࿱…...
2024/4/20 20:29:53 - 【最新详细】使用Angular创建第一个项目(前端框架angular入门)
这是目录简单说一下angular命令行搞起来建一个angular项目补充说明简单说一下angular 很多人说angular1火了一时,angular2却难产了,所以较之vue和react,它快无人问津了。实则不然,如今angular8都有了,这个框架还在被人用…...
2024/4/20 20:29:50 - angular框架 select设定默认值
这儿有两个需要注意的地方, 1.下拉框的改变触发事件要用ng-select 2. ng-model要绑定的对象...
2024/4/26 13:58:07
最新文章
- Java高阶私房菜-JVM垃圾回收机制及算法原理探究
目录 垃圾回收机制 什么是垃圾回收机制 JVM的自动垃圾回收机制 垃圾回收机制的关键知识点 初步了解判断方法-引用计数法 GCRoot和可达性分析算法 什么是可达性分析算法 什么是GC Root 对象回收的关键知识点 标记对象可回收就一定会被回收吗? 可达性分析算…...
2024/4/28 4:17:10 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 【面经】2024春招-软件开发工程师-后端方向1
面经整理系列: 【面经】软件开发工程师-后端方向1 文章目录 岗位与面经基础1:数据库 & 网络基础2:系统 & 语法模板3:算法 & 项目 岗位与面经 岗位介绍 JD: 美团-软件开发工程师-后端方向-1小时左右 金融服务平台 技…...
2024/4/27 9:25:23 - 【嵌入式开发 Linux 常用命令系列 4.3 -- git add 不 add untracked file】
请阅读【嵌入式开发学习必备专栏 】 文章目录 git add 不add untracked file git add 不add untracked file 如果你想要Git在执行git add .时不添加未跟踪的文件(untracked files),你可以使用以下命令: git add -u这个命令只会加…...
2024/4/25 4:06:17 - Redis分区
Redis分区是一种数据分片技术,用于将数据分布到多个Redis实例(节点)上以提高性能和扩展性。分区使得Redis能够处理比单个实例更大的数据集,并允许并行处理客户端请求。 原理: Redis分区通过一致性哈希算法(…...
2024/4/23 6:11:42 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/28 3:28:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/28 1:22:35 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57