Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制
前言
在企业项目开发中,对系统的安全和权限控制往往是必需的,常见的安全框架有 Spring Security、Apache Shiro 等。本文主要简单介绍一下 Spring Security,再通过 Spring Boot 集成开一个简单的示例。
Spring Security
什么是 Spring Security?
Spring Security 是一种基于 Spring AOP 和 Servlet 过滤器 Filter 的安全框架,它提供了全面的安全解决方案,提供在 Web 请求和方法调用级别的用户鉴权和权限控制。
Web 应用的安全性通常包括两方面:用户认证(Authentication)和用户授权(Authorization)。
用户认证指的是验证某个用户是否为系统合法用户,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码,系统通过校验用户名和密码来完成认证。
用户授权指的是验证某个用户是否有权限执行某个操作。
2.原理
Spring Security 功能的实现主要是靠一系列的过滤器链相互配合来完成的。以下是项目启动时打印的默认安全过滤器链(集成5.2.0):
[org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5054e546,org.springframework.security.web.context.SecurityContextPersistenceFilter@7b0c69a6,org.springframework.security.web.header.HeaderWriterFilter@4fefa770,org.springframework.security.web.csrf.CsrfFilter@6346aba8,org.springframework.security.web.authentication.logout.LogoutFilter@677ac054,org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@51430781,org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4203d678,org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@625e20e6,org.springframework.security.web.authentication.AnonymousAuthenticationFilter@19628fc2,org.springframework.security.web.session.SessionManagementFilter@471f8a70,org.springframework.security.web.access.ExceptionTranslationFilter@3e1eb569,org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3089ab62
]
- WebAsyncManagerIntegrationFilter
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- CsrfFilter
- LogoutFilter
- UsernamePasswordAuthenticationFilter
- RequestCacheAwareFilter
- SecurityContextHolderAwareRequestFilter
- AnonymousAuthenticationFilter
- SessionManagementFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
详细解读可以参考:https://blog.csdn.net/dushiwodecuo/article/details/78913113
3.核心组件
SecurityContextHolder
用于存储应用程序安全上下文(Spring Context)的详细信息,如当前操作的用户对象信息、认证状态、角色权限信息等。默认情况下,SecurityContextHolder
会使用 ThreadLocal
来存储这些信息,意味着安全上下文始终可用于同一执行线程中的方法。
获取有关当前用户的信息
因为身份信息与线程是绑定的,所以可以在程序的任何地方使用静态方法获取用户信息。例如获取当前经过身份验证的用户的名称,代码如下:
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {String username = ((UserDetails)principal).getUsername();
} else {String username = principal.toString();
}
其中,getAuthentication()
返回认证信息,getPrincipal()
返回身份信息,UserDetails
是对用户信息的封装类。
Authentication
认证信息接口,集成了 Principal
类。该接口中方法如下:
接口方法 | 功能说明 |
---|---|
getAuthorities() | 获取权限信息列表,默认是 GrantedAuthority 接口的一些实现类,通常是代表权限信息的一系列字符串 |
getCredentials() | 获取用户提交的密码凭证,用户输入的密码字符窜,在认证过后通常会被移除,用于保障安全 |
getDetails() | 获取用户详细信息,用于记录 ip、sessionid、证书序列号等值 |
getPrincipal() | 获取用户身份信息,大部分情况下返回的是 UserDetails 接口的实现类,是框架中最常用的接口之一 |
AuthenticationManager
认证管理器,负责验证。认证成功后,AuthenticationManager
返回一个填充了用户认证信息(包括权限信息、身份信息、详细信息等,但密码通常会被移除)的 Authentication
实例。然后再将 Authentication
设置到 SecurityContextHolder
容器中。
AuthenticationManager
接口是认证相关的核心接口,也是发起认证的入口。但它一般不直接认证,其常用实现类 ProviderManager
内部会维护一个 List<AuthenticationProvider>
列表,存放里多种认证方式,默认情况下,只需要通过一个 AuthenticationProvider
的认证,就可被认为是登录成功。
UserDetailsService
负责从特定的地方加载用户信息,通常是通过JdbcDaoImpl
从数据库加载实现,也可以通过内存映射InMemoryDaoImpl
实现。
UserDetails
该接口代表了最详细的用户信息。该接口中方法如下:
接口方法 | 功能说明 |
---|---|
getAuthorities() | 获取授予用户的权限 |
getPassword() | 获取用户正确的密码,这个密码在验证时会和 Authentication 中的 getCredentials() 做比对 |
getUsername() | 获取用于验证的用户名 |
isAccountNonExpired() | 指示用户的帐户是否已过期,无法验证过期的用户 |
isAccountNonLocked() | 指示用户的账号是否被锁定,无法验证被锁定的用户 |
isCredentialsNonExpired() | 指示用户的凭据(密码)是否已过期,无法验证凭证过期的用户 |
isEnabled() | 指示用户是否被启用,无法验证被禁用的用户 |
Spring Security 实战
1.系统设计
本文主要使用 Spring Security 来实现系统页面的权限控制和安全认证,本示例不做详细的数据增删改查,sql 可以在完整代码里下载,主要是基于数据库对页面 和 ajax 请求做权限控制。
1.1 技术栈
- 编程语言:Java
- 编程框架:Spring、Spring MVC、Spring Boot
- ORM 框架:MyBatis
- 视图模板引擎:Thymeleaf
- 安全框架:Spring Security(5.2.0)
- 数据库:MySQL
- 前端:Layui、JQuery
1.2 功能设计
- 实现登录、退出
- 实现菜单 url 跳转的权限控制
- 实现按钮 ajax 请求的权限控制
- 防止跨站请求伪造(CSRF)攻击
1.3 数据库层设计
t_user 用户表
字段 | 类型 | 长度 | 是否为空 | 说明 |
---|---|---|---|---|
id | int | 8 | 否 | 主键,自增长 |
username | varchar | 20 | 否 | 用户名 |
password | varchar | 255 | 否 | 密码 |
t_role 角色表
字段 | 类型 | 长度 | 是否为空 | 说明 |
---|---|---|---|---|
id | int | 8 | 否 | 主键,自增长 |
role_name | varchar | 20 | 否 | 角色名称 |
t_menu 菜单表
字段 | 类型 | 长度 | 是否为空 | 说明 |
---|---|---|---|---|
id | int | 8 | 否 | 主键,自增长 |
menu_name | varchar | 20 | 否 | 菜单名称 |
menu_url | varchar | 50 | 是 | 菜单url(Controller 请求路径) |
t_user_roles 用户权限表
字段 | 类型 | 长度 | 是否为空 | 说明 |
---|---|---|---|---|
id | int | 8 | 否 | 主键,自增长 |
user_id | int | 8 | 否 | 用户表id |
role_id | int | 8 | 否 | 角色表id |
t_role_menus 权限菜单表
字段 | 类型 | 长度 | 是否为空 | 说明 |
---|---|---|---|---|
id | int | 8 | 否 | 主键,自增长 |
role_id | int | 8 | 否 | 角色表id |
menu_id | int | 8 | 否 | 菜单表id |
实体类这里不详细列了。
2.代码实现
2.0 相关依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- 热部署模块 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> <!-- 这个需要为 true 热部署才有效 --></dependency><!-- mysql 数据库驱动. --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- mybaits --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.0</version></dependency><!-- thymeleaf --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- alibaba fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><!-- spring security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency></dependencies>
2.1 继承 WebSecurityConfigurerAdapter 自定义 Spring Security 配置
/**
prePostEnabled :决定Spring Security的前注解是否可用 [@PreAuthorize,@PostAuthorize,..]
secureEnabled : 决定是否Spring Security的保障注解 [@Secured] 是否可用
jsr250Enabled :决定 JSR-250 annotations 注解[@RolesAllowed..] 是否可用.*/
@Configurable
@EnableWebSecurity
//开启 Spring Security 方法级安全注解 @EnableGlobalMethodSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true,jsr250Enabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{@Autowiredprivate CustomAccessDeniedHandler customAccessDeniedHandler;@Autowiredprivate UserDetailsService userDetailsService;/*** 静态资源设置*/@Overridepublic void configure(WebSecurity webSecurity) {//不拦截静态资源,所有用户均可访问的资源webSecurity.ignoring().antMatchers("/","/css/**","/js/**","/images/**","/layui/**");}/*** http请求设置*/@Overridepublic void configure(HttpSecurity http) throws Exception {//http.csrf().disable(); //注释就是使用 csrf 功能 http.headers().frameOptions().disable();//解决 in a frame because it set 'X-Frame-Options' to 'DENY' 问题 //http.anonymous().disable();http.authorizeRequests().antMatchers("/login/**","/initUserData","/main")//不拦截登录相关方法 .permitAll() //.antMatchers("/user").hasRole("ADMIN") // user接口只有ADMIN角色的可以访问
// .anyRequest()
// .authenticated()// 任何尚未匹配的URL只需要验证用户即可访问.anyRequest().access("@rbacPermission.hasPermission(request, authentication)")//根据账号权限访问 .and().formLogin().loginPage("/").loginPage("/login") //登录请求页.loginProcessingUrl("/login") //登录POST请求路径.usernameParameter("username") //登录用户名参数.passwordParameter("password") //登录密码参数.defaultSuccessUrl("/main") //默认登录成功页面.and().exceptionHandling().accessDeniedHandler(customAccessDeniedHandler) //无权限处理器.and().logout().logoutSuccessUrl("/login?logout"); //退出登录成功URL}/*** 自定义获取用户信息接口*/@Overridepublic void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}/*** 密码加密算法* @return*/@Beanpublic BCryptPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}
2.2 自定义实现 UserDetails 接口,扩展属性
public class UserEntity implements UserDetails {/*** */private static final long serialVersionUID = -9005214545793249372L;private Long id;// 用户idprivate String username;// 用户名private String password;// 密码private List<Role> userRoles;// 用户权限集合private List<Menu> roleMenus;// 角色菜单集合private Collection<? extends GrantedAuthority> authorities;public UserEntity() {}public UserEntity(String username, String password, Collection<? extends GrantedAuthority> authorities,List<Menu> roleMenus) {this.username = username;this.password = password;this.authorities = authorities;this.roleMenus = roleMenus;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public List<Role> getUserRoles() {return userRoles;}public void setUserRoles(List<Role> userRoles) {this.userRoles = userRoles;}public List<Menu> getRoleMenus() {return roleMenus;}public void setRoleMenus(List<Menu> roleMenus) {this.roleMenus = roleMenus;}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return this.authorities;}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}}
2.3 自定义实现 UserDetailsService 接口
/*** 获取用户相关信息* @author charlie**/
@Service
public class UserDetailServiceImpl implements UserDetailsService {private Logger log = LoggerFactory.getLogger(UserDetailServiceImpl.class);@Autowiredprivate UserDao userDao;@Autowiredprivate RoleDao roleDao;@Autowiredprivate MenuDao menuDao;@Overridepublic UserEntity loadUserByUsername(String username) throws UsernameNotFoundException {// 根据用户名查找用户UserEntity user = userDao.getUserByUsername(username);System.out.println(user);if (user != null) {System.out.println("UserDetailsService");//根据用户id获取用户角色List<Role> roles = roleDao.getUserRoleByUserId(user.getId());// 填充权限Collection<SimpleGrantedAuthority> authorities = new HashSet<SimpleGrantedAuthority>();for (Role role : roles) {authorities.add(new SimpleGrantedAuthority(role.getRoleName()));}//填充权限菜单List<Menu> menus=menuDao.getRoleMenuByRoles(roles);return new UserEntity(username,user.getPassword(),authorities,menus);} else {System.out.println(username +" not found");throw new UsernameNotFoundException(username +" not found");} }}
2.4 自定义实现 URL 权限控制
/*** RBAC数据模型控制权限* @author charlie**/
@Component("rbacPermission")
public class RbacPermission{private AntPathMatcher antPathMatcher = new AntPathMatcher();public boolean hasPermission(HttpServletRequest request, Authentication authentication) {Object principal = authentication.getPrincipal();boolean hasPermission = false;// 读取用户所拥有的权限菜单List<Menu> menus = ((UserEntity) principal).getRoleMenus();System.out.println(menus.size());for (Menu menu : menus) {if (antPathMatcher.match(menu.getMenuUrl(), request.getRequestURI())) {hasPermission = true;break;}}return hasPermission;}
}
2.5 实现 AccessDeniedHandler
自定义处理无权请求
/*** 处理无权请求* @author charlie**/
@Component
public class CustomAccessDeniedHandler implements AccessDeniedHandler {private Logger log = LoggerFactory.getLogger(CustomAccessDeniedHandler.class);@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response,AccessDeniedException accessDeniedException) throws IOException, ServletException {boolean isAjax = ControllerTools.isAjaxRequest(request);System.out.println("CustomAccessDeniedHandler handle");if (!response.isCommitted()) {if (isAjax) {String msg = accessDeniedException.getMessage();log.info("accessDeniedException.message:" + msg);String accessDenyMsg = "{\"code\":\"403\",\"msg\":\"没有权限\"}";ControllerTools.print(response, accessDenyMsg);} else {request.setAttribute(WebAttributes.ACCESS_DENIED_403, accessDeniedException);response.setStatus(HttpStatus.FORBIDDEN.value());RequestDispatcher dispatcher = request.getRequestDispatcher("/403");dispatcher.forward(request, response);}}}public static class ControllerTools {public static boolean isAjaxRequest(HttpServletRequest request) {return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));}public static void print(HttpServletResponse response, String msg) throws IOException {response.setCharacterEncoding("UTF-8");response.setContentType("application/json; charset=utf-8");PrintWriter writer = response.getWriter();writer.write(msg);writer.flush();writer.close();}}}
2.6 相关 Controller
登录/退出跳转
/*** 登录/退出跳转* @author charlie**/
@Controller
public class LoginController {@GetMapping("/login")public ModelAndView login(@RequestParam(value = "error", required = false) String error,@RequestParam(value = "logout", required = false) String logout) {ModelAndView mav = new ModelAndView();if (error != null) {mav.addObject("error", "用户名或者密码不正确");}if (logout != null) {mav.addObject("msg", "退出成功");}mav.setViewName("login");return mav;}
}
登录成功跳转
@Controller
public class MainController {@GetMapping("/main")public ModelAndView toMainPage() {//获取登录的用户名Object principal= SecurityContextHolder.getContext().getAuthentication().getPrincipal();String username=null;if(principal instanceof UserDetails) {username=((UserDetails)principal).getUsername();}else {username=principal.toString();}ModelAndView mav = new ModelAndView();mav.setViewName("main");mav.addObject("username", username);return mav;}}
用于不同权限页面访问测试
/*** 用于不同权限页面访问测试* @author charlie**/
@Controller
public class ResourceController {@GetMapping("/publicResource")public String toPublicResource() {return "resource/public";}@GetMapping("/vipResource")public String toVipResource() {return "resource/vip";}
}
用于不同权限ajax请求测试
/*** 用于不同权限ajax请求测试* @author charlie**/
@RestController
@RequestMapping("/test")
public class HttptestController {@PostMapping("/public")public JSONObject doPublicHandler(Long id) {JSONObject json = new JSONObject();json.put("code", 200);json.put("msg", "请求成功" + id);return json;}@PostMapping("/vip")public JSONObject doVipHandler(Long id) {JSONObject json = new JSONObject();json.put("code", 200);json.put("msg", "请求成功" + id);return json;}
}
2.7 相关 html 页面
登录页面
<form class="layui-form" action="/login" method="post"><div class="layui-input-inline"><input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/><input type="text" name="username" requiredplaceholder="用户名" autocomplete="off" class="layui-input"></div><div class="layui-input-inline"><input type="password" name="password" required placeholder="密码" autocomplete="off"class="layui-input"></div><div class="layui-input-inline login-btn"><button id="btnLogin" lay-submit lay-filter="*" class="layui-btn">登录</button></div><div class="form-message"><label th:text="${error}"></label><label th:text="${msg}"></label></div></form>
防止跨站请求伪造(CSRF)攻击
退出系统
<form id="logoutForm" action="/logout" method="post"style="display: none;"><input type="hidden" th:name="${_csrf.parameterName}"th:value="${_csrf.token}"></form><ahref="javascript:document.getElementById('logoutForm').submit();">退出系统</a>
ajax 请求页面
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" id="hidCSRF">
<button class="layui-btn" id="btnPublic">公共权限请求按钮</button>
<br>
<br>
<button class="layui-btn" id="btnVip">VIP权限请求按钮</button>
<script type="text/javascript" th:src="@{/js/jquery-1.8.3.min.js}"></script>
<script type="text/javascript" th:src="@{/layui/layui.js}"></script>
<script type="text/javascript">layui.use('form', function() {var form = layui.form;$("#btnPublic").click(function(){$.ajax({url:"/test/public",type:"POST",data:{id:1},beforeSend:function(xhr){xhr.setRequestHeader('X-CSRF-TOKEN',$("#hidCSRF").val()); },success:function(res){alert(res.code+":"+res.msg);} });});$("#btnVip").click(function(){$.ajax({url:"/test/vip",type:"POST",data:{id:2},beforeSend:function(xhr){xhr.setRequestHeader('X-CSRF-TOKEN',$("#hidCSRF").val()); },success:function(res){alert(res.code+":"+res.msg);}});});});</script>
2.8 测试
测试提供两个账号:user 和 admin (密码与账号一样)
由于 admin 作为管理员权限,设置了全部的访问权限,这里只展示 user 的测试结果。
完整代码
github
码云
非特殊说明,本文版权归 朝雾轻寒 所有,转载请注明出处.
原文标题:Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制
原文地址:https://www.zwqh.top/article/info/27
如果文章有不足的地方,欢迎提点,后续会完善。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 对线程interrupt的初浅理解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_39326472/article/details/103257234在java中,使用interrrupt可以用来请求中止线程。对一个线程调用interrrupt方法时,…...
2024/4/25 20:00:01 - 中标麒麟系统换yum
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/yonggandess/article/details/103257347https://blog.csdn.net/xupengxl/article/details/89946287...
2024/4/21 19:28:28 - ArrayList,LinkedList
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/dl674756321/article/details/1032565991. ArrayList基于数组实现,允许空值和重复元素。 当添加元素数量大于数组容量时,…...
2024/4/25 2:57:30 - 八.汇编-转移指令的原理
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/WQ_631288233/article/details/101727866可以修改IP,或者同时修改CS和IP的指令统称为转移指令。或者说转移指令就是可以控…...
2024/4/25 9:47:38 - input文本框限制输入整数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_26660583/article/details/103254159onkeypress 键盘按下事件 οnkeyup 键盘弹起事件 onpaste 粘贴事件 onblur 焦…...
2024/4/20 2:13:13 - zookeeper 的安装 和 启动
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/heima201907/article/details/1032573491.下载下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/2、…...
2024/4/24 15:37:40 - spring中ThreadLocal 的使用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_38691015/article/details/103255543解决问题:在service层,使用RequestContextHolder获取controller层请求(HttpServ…...
2024/4/17 21:20:53 - mybatis缓存
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/hebtu666/article/details/103256816mybatis提供了缓存机制减轻数据库压力,提高数据库性能mybatis的缓存分为两级:一级缓…...
2024/4/26 18:05:54 - Android-Universal-Image-Loader源码分析
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/stven_king/article/details/103256724前言 ImageLoader 是 android 使用中出现比较早(PS:即的刚接触安卓项目的时候就用…...
2024/4/26 18:48:27 - H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析
原文链接:https://blog.csdn.net/Romantic_Energy/article/details/50508332版权声明:本文为CSDN博主「Chucky_Hu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Romantic_Energy/article/details/50508332本…...
2024/4/25 19:06:55 - 信息检索研究与开发国际会议SIGIR 2020于西安召开!摘要截止日期为1月15日!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/ConferenceEye/article/details/103256666关注“会议之眼”,第一时间送达 会议之眼A类,CCF A类信息检索研究与开发国际会…...
2024/4/25 15:55:11 - 国标GB/T28181协议下EasyGBS互联网无插件视频播放器起播慢或延迟高问题解决方案
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/EasyGBS/article/details/100983126引言28181协议全称为GB/T28181《安全防范视频监控联网系统信息传输、交换、控制技术要求…...
2024/4/26 16:42:18 - 夜光带你走进C# 游戏开发等(八十四)擅长的领域
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_41987706/article/details/103194048夜光序言:如果人生永远是一条直路,那一定很单调;如果人生永远停留在某个阶段…...
2024/4/14 18:03:08 - 夜光带你走进C# 游戏开发等(八十五)擅长的领域
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_41987706/article/details/103194489夜光序言:不要问, 雨, 为何如此凄凉? 那天,诗人独自忧伤,没有日落的帷幕…...
2024/4/23 18:25:56 - (C语言)求1-n的阶乘之和
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/hua12ng/article/details/103256838求1-n的阶乘之和 题目:输入正整数n(1-10),求1-n的阶乘之和,最后必须输出回车。遇到…...
2024/4/19 18:01:34 - Hadoop的集群安装
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/u010395024/article/details/103256897今天开始hadoop学习。一开虚拟机就出现各种状况。状况一vim 编辑器出现中文乱码。 …...
2024/4/20 4:43:57 - Python的安装及环境变量配置
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/xiaoyaGrace/article/details/1032569211.去python官网下载安装镜像,地址:https://www.python.org/downloads/Python的安…...
2024/4/20 13:19:59 - 阅读笔记(TIP2019)Subjective and Objective Quality Assessment of Stitched Images for Virtual Reality
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Miracle0_0/article/details/103256950#2019年11月26日...
2024/4/25 23:14:50 - 推导投影矩阵
原文链接:https://www.codeguru.com/cpp/misc/misc/graphics/article.php/c10123/Deriving-Projection-Matrices.htm#page-3参考:添加链接描述 在任何3D图形程序员工具包中的基本矩阵变换中,投影矩阵都更为复杂。一眼就能理解平移和缩放,任何对三角学有基本了解的人都可以想…...
2024/4/26 14:31:21 - redis desktop manager安装以及使用教程
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/luanzongke5704/article/details/1032569791.下载redis desktop manager 版本0.9.99 官网下载: https://redisdesktop.com…...
2024/4/25 12:38:28
最新文章
- 五、搭建 Videojs,实战网络直播
目录 目录 一、安装 nginx 二、撰写video.js 三 、修改 Ubuntu 上 Nginx 的配置文件...
2024/4/26 22:42:01 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 如何转行成为产品经理?
转行NPDP也是很合适的一条发展路径,之后从事新产品开发相关工作~ 一、什么是NPDP? NPDP 是产品经理国际资格认证,美国产品开发与管理协会(PDMA)发起的,是目前国际公认的唯一的新产品开发专业认证ÿ…...
2024/4/22 16:14:13 - 最新在线工具箱网站系统源码
内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API,同时还自带免费API接口, 是一个多功能性工具程序,支持后台管理、上…...
2024/4/23 4:11:28 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/26 20:12:18 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/25 18:38:39 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/25 18:39:23 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/25 18:39:22 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/25 18:39:22 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/26 21:56:58 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/25 16:48:44 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/26 16:00:35 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/26 22:01:59 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/25 18:39:12 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴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/25 18:38:58 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/25 18:38:57 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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