Angular 6集成Spring Boot 2,Spring Security,JWT和CORS系列:四、heroapi项目中用Spring Security实现用户和密码的认证及返回JWT令牌
一、基本认证实现
使用Spring Security提供的UsernamePasswordAuthentication进行认证,在我们前面的代码基础之上,仅需要进行两个步骤即可:
1、实现Spring Security的UserDetailsService
/*** */
package com.jh.heroes.api.service;import java.util.Optional;
import java.util.stream.Collectors;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;import com.jh.heroes.api.domain.SysUser;
import com.jh.heroes.api.repository.SysUserRepository;/*** 对UserDetailsService的实现,为Spring Security返回UserDetails.* @author liangxh**/
@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate SysUserRepository sysUserRepository;/* (non-Javadoc)* @see org.springframework.security.core.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)*/@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {SysUser queryUser = new SysUser();queryUser.setUsername(username);Example<SysUser> example = Example.of(queryUser);Optional<SysUser> sysUserOptional=sysUserRepository.findOne(example);if (sysUserOptional.isPresent()) {SysUser sysUser=sysUserOptional.get();return new User(sysUser.getUsername(),sysUser.getPassword(),sysUser.getRoles().stream().map(role->new SimpleGrantedAuthority(role.getName().name())).collect(Collectors.toList()));} else {throw new UsernameNotFoundException(String.format("No user found with username '%s'.", username));}}
}
实现UserDetailsService接口,返回UserDetails实现User。
2、修改配置文件WebSecurityConfig
package com.jh.heroes.api.web.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {/*** 装载BCrypt密码编码器* * @return*/@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Overrideprotected void configure(HttpSecurity http) throws Exception {//关闭csrf,所有请求允许访问http.cors().and().csrf().disable().formLogin().and().authorizeRequests().antMatchers("/login").permitAll().anyRequest().authenticated();}}
注:A、注入UserDetailsService,配置AuthenticationManager,告之我们使用的UserDetailsService和PasswordEncoder。
B、HttpSecurity中,formLogin登录,除login外所有访问地址都需要认证。
3、浏览器测试
启动系统,在浏览器中输入http://localhost:8001/user,浏览器页面跳转到http://localhost:8001/login,如下图
在User中录入admin,在Password中录入123456,在点击Login按钮,浏览器又跳转到http://localhost:8001/user,如下图显示
一切ok,非常完美。
4、postman测试
在postman中,地址栏输入http://localhost:8001/login,HttpMethod中选择post,body中选择form-data,然后按下图输入,再点击“send”按钮,获得如下图所示
这个显示没有根路径。
又按照下图测试,
heroapi不接受json的参数。
这两种情况,对于前后端分离以及移动端提供接口,都没有办法使用。伟大的Spring Security,很早就考虑这个问题了:
对于第一种情况,扩展认证成功和失败的处理器即可;第二种情况,新加一个认证过滤器即可。
二、扩展认证成功和失败处理器
1、扩展认证成功处理器
/*** */
package com.jh.heroes.api.web.authentication;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;import com.fasterxml.jackson.databind.ObjectMapper;/*** 身份认证成功处理器* @author liangxh**/
@Component("heroApiAuthenticationSuccessHandler")
public class HeroApiAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {private Logger logger = LoggerFactory.getLogger(getClass());@Autowiredprivate ObjectMapper objectMapper;/** (non-Javadoc)* * @see org.springframework.security.web.authentication.* AuthenticationSuccessHandler#onAuthenticationSuccess(javax.servlet.http.* HttpServletRequest, javax.servlet.http.HttpServletResponse,* org.springframework.security.core.Authentication)*/@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,Authentication authentication) throws IOException, ServletException {logger.info("登录成功");response.setContentType("application/json;charset=UTF-8");response.getWriter().write(objectMapper.writeValueAsString(authentication));}}
根据我们实际要求,通过HttpServletReponse重写返回的数据。
2、扩展认证失败处理器
/*** */
package com.jh.heroes.api.web.authentication;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
import org.springframework.stereotype.Component;import com.fasterxml.jackson.databind.ObjectMapper;
import com.jh.heroes.api.exception.ErrorMessage;/*** 身份认证失败处理器* * @author liangxh**/
@Component("heroApiAuthenctiationFailureHandler")
public class HeroApiAuthenctiationFailureHandler extends SimpleUrlAuthenticationFailureHandler {private Logger logger = LoggerFactory.getLogger(getClass());@Autowiredprivate ObjectMapper objectMapper;/** (non-Javadoc)* * @see* org.springframework.security.web.authentication.AuthenticationFailureHandler#* onAuthenticationFailure(javax.servlet.http.HttpServletRequest,* javax.servlet.http.HttpServletResponse,* org.springframework.security.core.AuthenticationException)*/@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,AuthenticationException exception) throws IOException, ServletException {logger.info("登录失败:{}");response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());response.setContentType("application/json;charset=UTF-8");response.getWriter().write(objectMapper.writeValueAsString(new ErrorMessage("-1", exception.getMessage())));}
}
3、注册新的成功和失败处理器
package com.jh.heroes.api.web.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {/*** 装载BCrypt密码编码器* * @return*/@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate AuthenticationSuccessHandler heroApiAuthenticationSuccessHandler;@Autowiredprivate AuthenticationFailureHandler heroApiAuthenctiationFailureHandler;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Overrideprotected void configure(HttpSecurity http) throws Exception {//关闭csrf,所有请求允许访问http.cors().and().csrf().disable().formLogin().successHandler(heroApiAuthenticationSuccessHandler).failureHandler(heroApiAuthenctiationFailureHandler).and().authorizeRequests().antMatchers("/authentication/form").permitAll().antMatchers("/login").permitAll().anyRequest().authenticated();}
}
依赖注入成功和失败处理器,然后在HttpSecurity中设置新的成功和失败处理器。
4、浏览器测试
在浏览器中录入http://localhost:8001/user,浏览器跳转到http://localhost:8001/login,录入账户和密码之后,返回json格式的Authentication内容,再开新标签页录入http://localhost:8001/user可以查看到所有用户的json信息。
5、postman测试
无论正确还是错误输入用户和密码信息,都会获得我们需要的内容。同时,如认证成功,可以访问其它的接口;若认证不成功,访问其它接口,它返回Spring Security默认的登录页面。
三、Json参数登录过滤器实现
研究UsernamePasswordAuthenticationFilter,我们可以发现只要修改username、password取值的方法,以及过滤器拦截的地址,就可以新的认证方式。
1、新建JsonUsernamePasswordAuthenticationFilter类。除类名称外,完全拷贝UsernamePasswordAuthenticationFilter的代码,然后稍作修改即可。
A、修改拦截地址为"/jsonlogin"。修改JsonUsernamePasswordAuthenticationFilter类的构造方法
public JsonUsernamePasswordAuthenticationFilter() {super(new AntPathRequestMatcher("/jsonlogin", "POST"));}
B、修改username、password的取值办法。这两个值从HttpServletRequest的InputStream获取,然后再JSON解析;修改attemptAuthentication方法为
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)throws AuthenticationException {if (postOnly && !request.getMethod().equals("POST")) {throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());}String username;String password;try {ServletInputStream ris = request.getInputStream();StringBuilder content = new StringBuilder();byte[] b = new byte[1024];int lens = -1;while ((lens = ris.read(b)) > 0) {content.append(new String(b, 0, lens));}String strcont = content.toString();// 内容 ObjectMapper mapper = new ObjectMapper(); //转换器 Map<?, ?> map=mapper.readValue(strcont, Map.class);username = map.get(usernameParameter).toString();password = map.get(passwordParameter).toString();} catch (Exception e) {throw new AuthenticationServiceException("参数不存在");}if (username == null) {username = "";}if (password == null) {password = "";}username = username.trim();UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);// Allow subclasses to set the "details" propertysetDetails(request, authRequest);return this.getAuthenticationManager().authenticate(authRequest);}
2、修改WebSecurityConfig配置文件,加入json登录的过滤器
A、修改AuthenticationManager的注入,解决http.getSharedObject(AuthenticationManager.class)无法获取AuthenticationManager实例的问题
@Bean(name = BeanIds.AUTHENTICATION_MANAGER)@Overridepublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}@Autowiredprotected AuthenticationManager authenticationManager;
B、修改configure(HttpSecurity http),配置如下
@Overrideprotected void configure(HttpSecurity http) throws Exception {JsonUsernamePasswordAuthenticationFilter jsonUsernamePasswordAuthenticationFilter=new JsonUsernamePasswordAuthenticationFilter();jsonUsernamePasswordAuthenticationFilter.setAuthenticationManager(authenticationManager);jsonUsernamePasswordAuthenticationFilter.setAuthenticationSuccessHandler(heroApiAuthenticationSuccessHandler);jsonUsernamePasswordAuthenticationFilter.setAuthenticationFailureHandler(heroApiAuthenctiationFailureHandler);http.addFilterAfter(jsonUsernamePasswordAuthenticationFilter, UsernamePasswordAuthenticationFilter.class).cors().and().csrf().disable().formLogin().successHandler(heroApiAuthenticationSuccessHandler).failureHandler(heroApiAuthenctiationFailureHandler).and().authorizeRequests().antMatchers("/jsonlogin").permitAll().antMatchers("/login").permitAll().anyRequest().authenticated();}
首先new 一个JsonUsernamePasswordAuthenticationFilter,设置它的AuthenticationManager以及认证成功、失败处理器;再把它注册到Spring Security过滤器链之上,并且在UsernamePasswordAuthenticationFilter之后生效的过滤器;最后再配置允许"/jsonlogin"访问.
3、postman测试
在postman中,在http://localhost:8001/jsonlogin 无能输入的json参数正确与否,都可以获得我们需要的结果。
这样,我们系统就同时支持两种形式的登录。
四、认证成功返回jwt
1、添加jwt的依赖包,站在牛人的基础上,简化jwt的生成和验证.在maven创库中搜索jjwt,使用io.jsonwebtoken的jwt。
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
2、添加jwt工具类
package com.jh.heroes.api.util;import java.security.Key;
import java.util.Date;import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;import org.springframework.security.core.userdetails.UserDetails;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;public class JwtHelper {private static final String base64Security = "mySecretofheroesapi";/*** 解密jwt.* @param jsonWebToken 令牌* @param base64Security base64的秘钥* @return*/public static Claims parseJWT(String jsonWebToken){try{Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(base64Security)).parseClaimsJws(jsonWebToken).getBody();return claims;}catch(Exception ex){return null;}}/*** 生成令牌.* @param user UserDetails* @return 令牌*/public static String createJWT(UserDetails user) {SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;//生成签名密钥byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(base64Security);Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());//添加构成JWT的参数JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT").claim("role", user.getAuthorities()).claim("username", user.getUsername()).setIssuer("lxhjh").setSubject(user.getUsername()).setIssuedAt(new Date()).signWith(signatureAlgorithm, signingKey).setNotBefore(new Date()).setExpiration(new Date(System.currentTimeMillis() + 7*24*3600 * 1000)); //生成JWTreturn builder.compact();} }
3、增加统一的接口调用返回对象
package com.jh.heroes.api.web.authentication;import java.io.Serializable;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResponseMsg implements Serializable{/*** 序列化.*/private static final long serialVersionUID = -8739271187671909578L;public static final Integer STATUS_SUCCESS = 0;public static final Integer STATUS_FAILED = -1;/*** 状态编码.*/private Integer status=0;/**返回消息.*/private String msg="";/**返回数据.*/private Object data;/*** 失败.* @param msg 失败原因*/public void failed(String msg){this.setStatus(STATUS_FAILED);this.setMsg(msg);}}
4、修改认证成功处理器
/*** */
package com.jh.heroes.api.web.authentication;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;import com.fasterxml.jackson.databind.ObjectMapper;
import com.jh.heroes.api.util.JwtHelper;/*** 身份认证成功处理器* @author liangxh**/
@Component("heroApiAuthenticationSuccessHandler")
public class HeroApiAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {private Logger logger = LoggerFactory.getLogger(getClass());@Autowiredprivate ObjectMapper objectMapper;@Autowiredprivate UserDetailsService userDetailsService;/** (non-Javadoc)* * @see org.springframework.security.web.authentication.* AuthenticationSuccessHandler#onAuthenticationSuccess(javax.servlet.http.* HttpServletRequest, javax.servlet.http.HttpServletResponse,* org.springframework.security.core.Authentication)*/@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,Authentication authentication) throws IOException, ServletException {logger.info("登录成功");UserDetails userDetails = userDetailsService.loadUserByUsername(authentication.getName());String token= JwtHelper.createJWT(userDetails);ResponseMsg msg=new ResponseMsg();msg.setData(token);response.setContentType("application/json;charset=UTF-8");response.getWriter().write(objectMapper.writeValueAsString(msg));}}
调用jwt工具类生成令牌,让后用统一返回类包装令牌放回。
5、修改认证错误处理器
/*** */
package com.jh.heroes.api.web.authentication;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
import org.springframework.stereotype.Component;import com.fasterxml.jackson.databind.ObjectMapper;/*** 身份认证失败处理器* * @author liangxh**/
@Component("heroApiAuthenctiationFailureHandler")
public class HeroApiAuthenctiationFailureHandler extends SimpleUrlAuthenticationFailureHandler {private Logger logger = LoggerFactory.getLogger(getClass());@Autowiredprivate ObjectMapper objectMapper;/** (non-Javadoc)* * @see* org.springframework.security.web.authentication.AuthenticationFailureHandler#* onAuthenticationFailure(javax.servlet.http.HttpServletRequest,* javax.servlet.http.HttpServletResponse,* org.springframework.security.core.AuthenticationException)*/@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,AuthenticationException exception) throws IOException, ServletException {logger.info("登录失败:{}");ResponseMsg msg=new ResponseMsg();msg.failed(exception.getMessage());response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());response.setContentType("application/json;charset=UTF-8");response.getWriter().write(objectMapper.writeValueAsString(msg));}
}
这个任然用了返回状态码。
6、postman测试
成功时,返回
失败时,返回
或者
五、小结
本节利用Spring Security的过滤器链原理,扩展JSON参数的认证;同时使用它的认证成功、认证失败处理器,对认证的返回进行统一处理,从而避免参考资料中的用一个controller来处理登录。
参考:
1、Spring Security无法注入authenticationManager:No qualifying bean of type AuthenticationManager found for
2、Spring Boot实战之Filter实现使用JWT进行接口认证
3、JWT的Java使用 (JJWT)
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- [附源码] SpringBoot 2.x 整合 Angular 2+ [Ant + Maven + Redis]的最佳实践
文章目录前言1. 环境准备1.1 框架版本1.2 初始化项目2. 整合 SpringBoot 与 Angular2.1 Angular 配置2.1.1 编译输出路径2.1.2 指定 basehref2.1.3 配置 Angular 路由2.2 SpringBoot 配置3. 测试前言 当前 Java EE 中, SpringBoot 已经逐渐成为主流, 慢慢替代了笨重的 SSM, 而随…...
2024/4/25 23:11:22 - 定位双眼皮早一天拆线
...
2024/4/21 5:08:05 - Angular + Spring Cloud 微服务 + OAuth2(SSO)+Docker 部署
在这个 Chat 中,我们将设计和开发一个完整的实用的微服务架构应用程序。 主要包含以下内容: 基于 Spring Boot 和 Spring Cloud 的微服务后端。使用 Angular 作为我们的 UI 客户端。客户端通过 Spring Zuul gateway 和后端服务进行通信。 使用 OAuth 2.0…...
2024/4/21 5:08:03 - 定位双眼皮可以改吗
...
2024/5/5 11:56:36 - 5s双眼皮是怎样的
...
2024/4/28 4:21:57 - 北京做北京双眼皮吧 整形
...
2024/5/5 7:50:07 - 技术站点
技术站点 在线学习:Coursera、edX、Udacity、MIT公开课、MOOC学院、慕课网Hacker News:非常棒的针对编程的链接聚合网站Techmeme:美国知名科技新闻和博客聚集网站,类似的还有(Panda, Hacker & Designer News&…...
2024/5/8 22:01:58 - [转载]老司机程序员用到的各种优秀资料、神器及框架整理
前言 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。 笔者作为一位tool mad,将工作以来用到的各种优秀资料、神器及框架整理在此,毕竟好记性不如烂键盘࿰…...
2024/4/20 7:00:19 - 韩式链接双眼皮谁做过
...
2024/5/5 7:26:01 - 前端模板的原理与实现
时下流行什么react, avalon, angular, vue什么,其核心都离不开前端模板。理解前端模板,是我们了解MV* 的关键。 前端框架最重要的目的是将页面渲染出来。“渲染”(render)这个词最初不是前端的东西的。前端之前叫做切图࿰…...
2024/5/5 8:43:49 - github看到:https://github.com/niuwang/guide
前言 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。 笔者作为一位tool mad,将工作以来用到的各种优秀资料、神器及框架整理在此,毕竟好记性不如烂键盘࿰…...
2024/5/6 19:45:41 - 程序员学习的军火库
本文是鄙人工作这几年随手收集整理的一些自认为还不错的资料,成长的道理上需要积累,这么长时间了,是时候放出来分享下了,或许能帮助到你。 欢迎点赞,让更多人看到,让福利普照。 因为本文以后不会更新&#…...
2024/5/7 0:44:08 - 【修仙】成为专业程序员路上用到的各种优秀资料、神器及框架
原文链接 - https://zhuanlan.zhihu.com/p/25152321 腾讯社区链接 - http://www.gad.qq.com/article/detail/25782 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。 资料篇 技术站点 在…...
2024/5/8 3:24:38 - 【真正福利】成为专业程序员路上用到的各种优秀资料、神器及框架(转)
出处:http://www.cnblogs.com/jasondan/p/6380597.html 好东西不是随便收集下,发篇博文,骗些点赞的!积累了5年多的东西,是时候放出来跟大家见见面了。 或许有的园友在14年的时候收藏过我的一篇“工欲善其事、必先利其器…...
2024/5/8 4:54:17 - 普通双眼皮价格是多少
...
2024/5/5 7:37:41 - 专业程序员路上用到的各种优秀资料、神器及框架
前言 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。 笔者作为一位tool mad,将工作以来用到的各种优秀资料、神器及框架整理在此,毕竟好记性不如烂键盘…...
2024/4/21 5:07:58 - 老司机程序员用到的各种优秀资料、神器及框架整理
目录 资料篇 技术站点必看书籍大牛博客GitHub篇 学习资料篇Swift相关工作、工具篇优秀项目篇工具篇 平台工具常用工具第三方服务爬虫相关(好玩的工具)安全相关Web服务器性能/压力测试工具/负载均衡器大数据处理/数据分析/分布式工具Web前端语言篇 ScalaJavaPython.NETC & C…...
2024/5/6 0:07:15 - 4D韩式定位双眼皮价格
...
2024/5/5 13:40:39 - 成为专业程序员路上用到的各种优秀资料、神器及框架
撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>> 前言(关注有红包http://t.cn/RHuOTnd) 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自…...
2024/4/21 5:07:55 - 架构师成长之路(6)--架构师知识体系(方法)
前言: 哲学家常思考的问题:" 我是谁?"" 我从哪里来?"" 要到哪里去?不只是哲学家,我想每个人都有自己对这三个问题的认知。如果我们要成为架构师,我们自己要面临的三大…...
2024/5/5 13:39:39
最新文章
- 搜维尔科技:工作场所人体工程学分析-最大限度地提高员工生产力
工作场所人体工程学分析-最大限度地提高员工生产力 - 增强工作场所安全和生产力:了解人体工程学评估在改善工作场所安全和提高企业生产力方面的关键作用 搜维尔科技:工作场所人体工程学分析-最大限度地提高员工生产力...
2024/5/9 14:56:29 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - STM32实现软件SPI对W25Q64内存芯片实现读写操作
先看看本次实验的成果吧: 这么简单的一个程序,我学习了一个星期左右,终于把所有的关节都打通了。所有代码都能什么都不看背着敲出来了。为了使自己的记忆更为清晰,特意总结了一个思维导图,感觉自己即便是日后忘记了看一…...
2024/5/7 21:13:56 - Docker实战教程 第1章 Linux快速入门
2-1 Linux介绍 为什么要学Linux 三个不得不学习 课程需要:Docker开发最好在Linux环境下。 开发需要:作为一个后端程序员,是必须要掌握Linux的,这是找工作的基础门槛。 运维需要:在服务器端,主流的大型服…...
2024/5/7 4:40:32 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/8 6:01:22 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/9 4:20:59 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/8 20:48:49 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/8 19:33:07 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/8 20:38:49 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/9 7:32:17 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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