网站公司缺点/腾讯云域名
转载自:www.javaman.cn
1、整合springsecurity
添加pom.xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、springsecurity认证授权流程
认证管理
流程图解读:
1、用户提交用户名、密码被SecurityFilterChain中的 UsernamePasswordAuthenticationFilter 过滤器获取到, 封装为请求Authentication,通常情况下是UsernamePasswordAuthenticationToken这个实现类。
2、然后过滤器将Authentication提交至认证管理器(AuthenticationManager)进行认证 。
3、认证成功后, AuthenticationManager 身份管理器返回一个被填充满了信息的(包括上面提到的权限信息, 身份信息,细节信息,但密码通常会被移除) Authentication 实例。
4、SecurityContextHolder 安全上下文容器将第3步填充了信息的 Authentication ,通过 SecurityContextHolder.getContext().setAuthentication(…)方法,设置到其中。 可以看出AuthenticationManager接口(认证管理器)是认证相关的核心接口,也是发起认证的出发点,它 的实现类为ProviderManager。而Spring Security支持多种认证方式,因此ProviderManager维护着一个 List 列表,存放多种认证方式,最终实际的认证工作是由 AuthenticationProvider完成的。咱们知道web表单的对应的AuthenticationProvider实现类为 DaoAuthenticationProvider,它的内部又维护着一个UserDetailsService负责UserDetails的获取。最终 AuthenticationProvider将UserDetails填充至Authentication。
授权管理
访问资源(即授权管理),访问url时,会通过FilterSecurityInterceptor拦截器拦截,其中会调用SecurityMetadataSource的方法来获取被拦截url所需的全部权限,再调用授权管理器AccessDecisionManager,这个授权管理器会通过spring的全局缓存SecurityContextHolder获取用户的权限信息,还会获取被拦截的url和被拦截url所需的全部权限,然后根据所配的投票策略(有:一票决定,一票否定,少数服从多数等),如果权限足够,则决策通过,返回访问资源,请求放行,否则跳转到403页面、自定义页面。
根据上面的认证授权流程,具体的实现步骤从3-8
1、首先定义一个我们自己的实现类集成SpringSecurity的UserDetailsService,实现loadUserByUsername方法,就是下面的步骤3,当抛出AccessDeniedException时,就要进行处理,也就是步骤4,
2、接着编写SpringSecurityConfig配置文件,就是下面的步骤7,需要进行认证成功后的处理,就是下面的步骤5
3、认证失败后,对认证失败进行处理,就是下面的步骤6
5、通过auth.userDetailsService(sysUserService),配置
AuthenticationManagerBuilder
来使用sysUserService
加载用户的详细信息,并使用密码编码器来处理密码。这样,当应用程序需要验证用户的身份时,它会使用这些配置来检查用户提供的凭据(通常是用户名和密码)是否正确。如果凭据正确,用户将被允许访问受保护的资源;如果凭据不正确,将拒绝访问6、接下来通过步骤7的安全配置:
定义哪些URL不需要身份验证(如/loginPage和/getImgCode)。
配置登录页面、登录处理URL、成功和失败的处理程序等。
添加一个自定义的验证码过滤器。
配置“记住我”功能。
禁用CSRF保护(通常不推荐这样做,但在这里它被禁用了)。
设置响应头中的X-Frame-Options属性。
配置会话管理,例如定义会话失效时的跳转URL。
3、创建SysUserService集成UserDetailsService
定义一个名为SysUserService
的服务类,该类主要用于处理与系统用户相关的业务逻辑:
- 服务类定义:
SysUserService
继承了ServiceImpl
并实现了UserDetailsService
接口,这意味着它提供了与用户详细信息相关的服务。 - 依赖注入:使用
@Autowired
注解注入了多个mapper(数据访问对象)和一个密码编码器。这些mapper可能用于访问数据库中的用户、菜单、用户角色和用户岗位信息。 - 根据用户名加载用户信息:
loadUserByUsername
方法根据提供的用户名从数据库中检索用户信息。如果找不到用户,则抛出UsernameNotFoundException
异常。 - 菜单和角色权限的分配:
- 如果用户是管理员(由
ConfigConsts.ADMIN_USER
定义),则为其分配所有的菜单和角色。 - 对于普通用户,根据其关联的角色ID从数据库中检索菜单和角色。如果用户没有分配任何角色,则抛出
AccessDeniedException
异常。
- 如果用户是管理员(由
- 创建并返回Spring Security的用户对象:使用从数据库中检索到的用户信息(如用户名、密码等)以及分配的菜单和角色创建一个Spring Security的
User
对象,并返回。
为Spring Security框架提供用户的详细信息和权限设置,确保用户在系统中的访问和操作都是基于其分配的权限进行的。
package com.ds.blog.system.service;import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ds.blog.system.entity.SysUser;
import com.ds.blog.system.entity.SysUserPost;
import com.ds.blog.system.entity.SysUserRole;
import com.ds.blog.system.entity.dto.ModifyPassDTO;
import com.ds.blog.system.entity.dto.ResetPassDTO;
import com.ds.blog.system.entity.dto.UserParamDTO;
import com.ds.blog.system.mapper.*;
import com.ds.common.constant.ConfigConsts;
import com.ds.common.domain.XmSelectNode;
import com.ds.common.enums.ResultStatus;
import com.ds.core.exception.MyGlobalException;
import com.ds.core.util.CommonUtil;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.core.authority.AuthorityUtils;
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.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.thymeleaf.util.ArrayUtils;import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;import static java.util.Optional.ofNullable;@Service
public class SysUserService extends ServiceImpl<SysUserMapper, SysUser> implements UserDetailsService {@Autowiredprivate SysUserMapper sysUserMapper;@Autowiredprivate SysMenuMapper sysMenuMapper;@Autowiredprivate SysUserRoleMapper sysUserRoleMapper;@Autowiredprivate SysUserPostMapper sysUserPostMapper;@Autowiredprivate BCryptPasswordEncoder passwordEncoder;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {SysUser user = sysUserMapper.findByUserName(username);if (ObjectUtil.isNull(user)) {throw new UsernameNotFoundException("用户不存在");}List<String> menuRole;if (ConfigConsts.ADMIN_USER.equals(username)) {menuRole = sysMenuMapper.findMenuRole();} else {String roleIds = user.getRoleIds();if (StringUtils.isBlank(roleIds)) {throw new AccessDeniedException("用户未分配菜单");}Long[] ids = CommonUtil.getId(user.getRoleIds());menuRole = sysMenuMapper.findMenuRoleByRoleIds(ids);}return new User(user.getUserName(), user.getPassWord(), ConfigConsts.SYS_YES.equals(user.getEnabled()),true, true, true, AuthorityUtils.commaSeparatedStringToAuthorityList(String.join(",", menuRole)));}
}
4、自定义AccessDeniedHandler
在步骤3中抛出 AccessDeniedException(“用户未分配菜单”),我们需要自定义处理器来处理该异常。
这段代码定义了一个名为CustomAccessDeniedHandler
的类,该类实现了AccessDeniedHandler
接口。这主要是用于Spring Security框架中,当用户尝试访问他们没有权限的资源时,自定义如何处理这种访问被拒绝的情况。
以下是代码的详细解释:
-
@Component:这是一个Spring的注解,它表示
CustomAccessDeniedHandler
是一个Spring组件。这意味着Spring会在启动时自动检测、注册并管理这个类的实例。 -
实现AccessDeniedHandler接口:
AccessDeniedHandler
是Spring Security中的一个接口,它要求实现一个handle
方法。当在Spring Security中发生AccessDeniedException
异常时,这个handle
方法会被调用。 -
handle方法:
-
参数
:此方法有三个参数:
HttpServletRequest request
:代表HTTP请求,可以用来获取请求相关的信息,如请求头、请求参数等。HttpServletResponse response
:代表HTTP响应,可以用来设置响应的状态码、响应头、响应体等。AccessDeniedException e
:是触发此处理程序的异常。可以提供有关为什么访问被拒绝的信息。
-
方法体
:
response.setCharacterEncoding("utf-8")
:设置响应的字符编码为UTF-8。response.setContentType("application/json;charset=utf-8")
:设置响应的内容类型为JSON,并确保字符编码为UTF-8。response.getWriter().write(new ObjectMapper().writeValueAsString(new MyGlobalException(ResultStatus.TEST_USER_LIMIT)))
:使用Jackson库的ObjectMapper
将MyGlobalException
对象序列化为JSON字符串,并将其写入响应体。从代码中可以看出,当访问被拒绝时,会返回一个具有特定状态的全局异常信息。
-
总的来说,这段代码的主要作用是为Spring Security提供一个自定义的访问拒绝处理器,当用户尝试访问他们没有权限的资源时,它会返回一个具有特定状态的JSON格式的错误信息。
@Component
public class CustomAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException, ServletException {response.setCharacterEncoding("utf-8");response.setContentType("application/json;charset=utf-8");response.getWriter().write(new ObjectMapper().writeValueAsString(e.getMessage()));}
}
5、自定义AuthenticationSuccessHandler(认证成功处理)
定义一个名为DefaultAuthenticationSuccessHandler
的类,该类是Spring Security框架中用于处理成功认证后的逻辑的组件。以下是代码的主要功能点:
- @Component:这是一个Spring的注解,表示该类是一个Spring组件,Spring会在启动时自动检测、注册并管理其实例。
- @Slf4j:这是Lombok库提供的注解,它为这个类自动生成了一个SLF4J的logger实例,名为
log
。这允许你在类中方便地记录日志。 - 扩展SavedRequestAwareAuthenticationSuccessHandler:该类继承了
SavedRequestAwareAuthenticationSuccessHandler
,这是Spring Security提供的一个处理器,用于在用户成功认证后重定向他们到最初请求的页面(如果存在的话)。 - onAuthenticationSuccess方法:这个方法覆盖了父类中的同名方法。当用户成功认证时,该方法会被调用。在这个方法中,你可以定义成功后想要执行的逻辑。这里的逻辑包括:
- 记录一个表示成功登录的日志。
- 设置HTTP响应的字符编码为UTF-8。
- 设置HTTP响应的内容类型为JSON。
- 使用响应的
PrintWriter
对象将一个表示成功的JSON字符串写入响应体,并刷新输出流。
总的来说,这段代码的主要作用是当用户成功认证后,记录一个日志,并向客户端发送一个表示成功的JSON响应。
@Component
@Slf4j
public class DefaultAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {log.info("-----login in success----");response.setCharacterEncoding("utf-8");response.setContentType("application/json;charset=utf-8");PrintWriter writer = response.getWriter();writer.write(JSON.toJSONString(Result.success()));writer.flush();}
}
6、自定义AuthenticationFailureHandler(认证失败处理)
定义一个名为DefaultAuthenticationFailureHandler
的类,该类是Spring Security框架中用于处理认证失败后的逻辑的组件。以下是代码的主要功能点:
- @Component:这是一个Spring的注解,表示该类是一个Spring组件,Spring会在启动时自动检测、注册并管理其实例。
- @Slf4j:这是Lombok库提供的注解,它为这个类自动生成了一个SLF4J的logger实例,名为
log
。这允许你在类中方便地记录日志。 - 扩展SimpleUrlAuthenticationFailureHandler:该类继承了
SimpleUrlAuthenticationFailureHandler
,这是Spring Security提供的一个处理器,用于处理认证失败的情况,并默认重定向到一个指定的失败URL。 - onAuthenticationFailure方法:这个方法覆盖了父类中的同名方法。当认证失败时,该方法会被调用。在这个方法中,你可以定义认证失败后想要执行的逻辑。这里的逻辑包括:
- 记录一个表示登录失败的日志,并打印出具体的异常信息。
- 设置HTTP响应的内容类型为JSON。
- 设置HTTP响应的字符编码为UTF-8。
- 使用响应的
PrintWriter
对象将错误信息写入响应体。 - 如果异常是
BadCredentialsException
(通常表示用户名或密码不正确),则返回一个特定的错误消息“用户名或密码错误,请重试。”。 - 对于其他类型的异常,直接返回异常的错误消息。
总的来说,这段代码的主要作用是当认证失败时,记录一个日志,并根据异常类型向客户端发送一个表示失败的JSON响应,其中包含具体的错误信息。
@Component
@Slf4j
public class DefaultAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {log.info("login in failure : " + exception.getMessage());response.setContentType("application/json;charset=utf-8");response.setCharacterEncoding("utf-8");PrintWriter writer = response.getWriter();String message;if (exception instanceof BadCredentialsException) {message = "用户名或密码错误,请重试。";writer.write(JSON.toJSONString(Result.failure(message)));}else{writer.write(JSON.toJSONString(Result.failure(exception.getMessage())));}writer.flush();}
}
7、MySecurityConfig配置
这段代码是一个Spring Security的配置类,用于配置Web应用的安全性。Spring Security是一个功能强大且可定制的身份验证和访问控制框架。
以下是该代码的主要功能点:
- @Configuration:这是一个Spring的注解,表示该类是一个配置类,用于定义和注册beans。
- @EnableWebSecurity:这个注解告诉Spring Boot启用Spring Security的默认Web安全性。
- @EnableGlobalMethodSecurity(prePostEnabled = true):这个注解启用了全局方法安全性,允许你使用注解(如@PreAuthorize、@PostAuthorize等)在方法级别上定义访问控制。
- WebSecurityConfigurerAdapter:该类继承了
WebSecurityConfigurerAdapter
,允许你自定义Spring Security的配置。 - configure(AuthenticationManagerBuilder auth):在这个方法中,你可以配置
AuthenticationManager
,这是处理身份验证逻辑的核心组件。在这里,它配置了一个UserDetailsService
和一个PasswordEncoder
来处理用户的身份验证。 - configure(HttpSecurity http):这个方法用于配置HTTP安全性。其中包括:
- 定义哪些URL不需要身份验证(如
/loginPage
和/getImgCode
)。 - 配置登录页面、登录处理URL、成功和失败的处理程序等。
- 添加一个自定义的验证码过滤器。
- 配置“记住我”功能。
- 禁用CSRF保护(通常不推荐这样做,但在这里它被禁用了)。
- 设置响应头中的X-Frame-Options属性。
- 配置会话管理,例如定义会话失效时的跳转URL。
- 定义哪些URL不需要身份验证(如
总的来说,这段代码配置了Spring Security来处理Web应用的安全性,包括身份验证、访问控制、会话管理等。需要注意的是,其中禁用了CSRF保护,这通常是不安全的做法,除非有特定的原因。
package com.ds.core.config;import com.ds.blog.system.service.SysUserService;
import com.ds.core.security.CustomAccessDeniedHandler;
import com.ds.core.security.DefaultAuthenticationFailureHandler;
import com.ds.core.security.DefaultAuthenticationSuccessHandler;
import com.ds.core.security.filter.ValidateCodeFilter;
import net.bytebuddy.asm.Advice;
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.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MySecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate SysUserService sysUserService;@Autowiredprivate DefaultAuthenticationSuccessHandler defaultAuthenticationSuccessHandler;@Autowiredprivate DefaultAuthenticationFailureHandler defaultAuthenticationFailureHandler;@Autowiredprivate ValidateCodeFilter validateCodeFilter;@Autowiredprivate CustomAccessDeniedHandler accessDeniedHandler;@Beanpublic BCryptPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(sysUserService).passwordEncoder(passwordEncoder());}@Overridepublic void configure(WebSecurity web) throws Exception {// 不需要权限能访问的资源web.ignoring()// 接口放行.antMatchers("/api/**").antMatchers("/front/**")// 静态资源.antMatchers("/static/**").antMatchers("/favicon.ico");}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()// 放过.antMatchers("/loginPage", "/getImgCode").permitAll().antMatchers("/**/*.jpg", "/**/*.png", "/**/*.gif", "/**/*.jpeg").permitAll()// 剩下的所有的地址都是需要在认证状态下才可以访问.anyRequest().authenticated().and()// 过滤登录验证码.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)// 配置登录功能.formLogin().usernameParameter("userName").passwordParameter("passWord")// 指定指定要的登录页面.loginPage("/loginPage")// 处理认证路径的请求.loginProcessingUrl("/login").successHandler(defaultAuthenticationSuccessHandler).failureHandler(defaultAuthenticationFailureHandler).and().exceptionHandling().accessDeniedHandler(accessDeniedHandler).and()// 登出.logout().invalidateHttpSession(true).deleteCookies("remember-me").logoutUrl("/logout").logoutSuccessUrl("/loginPage").and().rememberMe()// 有效期7天.tokenValiditySeconds(3600 * 24 * 7)// 开启记住我功能.rememberMeParameter("remember-me").and()//禁用csrf.csrf().disable()// header response的X-Frame-Options属性设置为SAMEORIGIN.headers().frameOptions().sameOrigin().and()// 配置session管理.sessionManagement()//session失效默认的跳转地址.invalidSessionUrl("/loginPage");}
}
8、登录界面
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head><title>ds博客</title><div th:replace="common/link::header"></div><link rel="stylesheet" th:href="@{/static/layuiadmin/style/login.css}" media="all">
</head>
<body>
<div class="layadmin-user-login layadmin-user-display-show" id="LAY-user-login" style="display: none;"><div class="layadmin-user-login-main"><div class="layadmin-user-login-box layadmin-user-login-header"><h2>ds博客</h2><p>后台登录</p></div><div class="layadmin-user-login-box layadmin-user-login-body layui-form"><div class="layui-form-item"><label class="layadmin-user-login-icon layui-icon layui-icon-username" for="LAY-user-login-username"></label><input type="text" name="userName" value="test" id="LAY-user-login-username" lay-verify="required" placeholder="用户名" class="layui-input"></div><div class="layui-form-item"><label class="layadmin-user-login-icon layui-icon layui-icon-password" for="LAY-user-login-password"></label><input type="password" name="passWord" value="test" id="LAY-user-login-password" lay-verify="required" placeholder="密码" class="layui-input"></div><div class="layui-form-item"><div class="layui-row"><div class="layui-col-xs7"><label class="layadmin-user-login-icon layui-icon layui-icon-vercode"></label><input type="text" name="code" lay-verify="required" placeholder="图形验证码" class="layui-input"></div><div class="layui-col-xs5"><div style="margin-left: 10px;"><img id="codeImg" class="layadmin-user-login-codeimg"></div></div></div></div><div class="layui-form-item" style="margin-bottom: 20px;"><input type="checkbox" name="remember-me" lay-skin="primary" title="记住密码"></div><div class="layui-form-item"><button class="layui-btn layui-btn-fluid layui-bg-blue" lay-submit lay-filter="login">登 录</button></div></div></div><div th:replace="common/script::footer"></div>
<script th:inline="javascript">layui.config({base: '/static/layuiadmin/' //静态资源所在路径}).extend({index: 'lib/index' //主入口模块}).use(['index', 'user'], function(){let $ = layui.$,form = layui.form;// 初始化getImgCode();form.render();//提交form.on('submit(login)', function(obj) {// 打开loadinglet loading = layer.load(0, {shade: false,time: 2 * 1000});// 禁止重复点击按钮$('.layui-btn').attr("disabled",true);//请求登入接口$.ajax({type: 'POST',url: ctx + '/login',data: obj.field,dataType: 'json',success: function(result) {if (result.code === 200) {layer.msg('登入成功', {icon: 1,time: 1000}, function(){window.location.href = '/';});} else {layer.msg(result.message);// 刷新验证码getImgCode();// 关闭loadinglayer.close(loading);// 开启点击事件$('.layui-btn').attr("disabled", false);}}});});$("#codeImg").on('click', function() {// 添加验证码getImgCode();});$(document).keydown(function (e) {if (e.keyCode === 13) {$('.layui-btn').click();}});// 解决session过期跳转到登录页并跳出iframe框架$(document).ready(function () {if (window != top) {top.location.href = location.href;}});});/*** 获取验证码*/function getImgCode() {let url = ctx + '/getImgCode';let xhr = new XMLHttpRequest();xhr.open('GET', url, true);xhr.responseType = "blob";xhr.onload = function() {if (this.status === 200) {let blob = this.response;document.getElementById("codeImg").src = window.URL.createObjectURL(blob);}}xhr.send();}
</script>
</body>
</html>
相关文章:

springboot集成springsecurity
转载自:www.javaman.cn 1、整合springsecurity 添加pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>2、springsecurity认证授权流程…...

脏读、不可重复读、幻读
一、脏读 A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。这个时候A事务立即读取了这个脏…...

思维模型 反馈效应
本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。反馈促进改进。 1 反馈效应的应用 1.1 反馈效应在营销中的应用 1 “可口可乐与百事可乐之战” 在 20 世纪 80 年代,可口可乐公司是全球最大的饮料公司之一,其市场…...

【PyTorch】线性回归
文章目录 1. 模型与代码实现2. Q&A 1. 模型与代码实现 模型 y ^ w 1 x 1 . . . w d x d b w ⊤ x b . \hat{y} w_1 x_1 ... w_d x_d b \mathbf{w}^\top \mathbf{x} b. y^w1x1...wdxdbw⊤xb. 代码实现 import torch from torch import nn from to…...

硝烟弥漫的科技战场——GPT之战
没想到2023年的双11之后,还能看到如此多的科技圈大佬针对GPT提出火药味十足的讨论和极具戏剧性的表演。 历史回顾: 11月6日,OpenAI发布会:GPT-4 Turbo模型、GPT应用商店、开源Whisper-large-v3等;11月17日࿰…...

re:Invent 构建未来:云计算生成式 AI 诞生科技新局面
文章目录 前言什么是云计算云计算类型亚马逊云科技云计算最多的功能最大的客户和合作伙伴社区最安全最快的创新速度最成熟的运营专业能力 什么是生成式 AI如何使用生成式 AI后记 前言 在科技发展的滚滚浪潮中,我们见证了云计算的崛起和生成式 AI 的突破,…...

oneApi实现并⾏排序算法
零、OneApi简介 oneAPI是由英特尔推出的一个开放、统一的编程模型和工具集合,旨在简化跨不同硬件架构的并行计算。oneAPI的目标是提供一个统一的编程模型,使开发人员能够使用相同的代码在不同类型的硬件上进行并行计算,包括CPU、GPU、FPGA和…...

语音芯片的BUSY状态指示功能特征:提升用户体验与系统稳定性的关键
在电子产品的音频系统中,语音芯片扮演着至关重要的角色。为了保证音频的流畅播放和功能的正常运行,语音芯片的各种状态指示功能变得尤为重要。其中,BUSY状态指示功能是语音芯片中的一项关键特征,它对于提升用户体验和系统稳定性具…...

Leetcode2661. 找出叠涂元素
Every day a Leetcode 题目来源:2661. 找出叠涂元素 解法1:哈希 题目很绕,理解题意后就很简单。 由于矩阵 mat 中每一个元素都不同,并且都在数组 arr 中,所以首先我们用一个哈希表 hash 来存储 mat 中每一个元素的…...

免费最新6款热门SEO优化排名工具
网站的存在感对于业务和品牌的成功至关重要。在众多网站推广方法中,搜索引擎优化(SEO)是提高网站可见性的关键。而SEO的核心之一就是关键词排名。为了更好地帮助您优化网站。 SEO关键词排名工具 在如今信息过载的互联网时代,用户…...

绝地求生在steam叫什么?
绝地求生在Steam的全名是《PlayerUnknowns Battlegrounds》,简称为PUBG。作为一款风靡全球的多人在线游戏,PUBG于2017年3月23日正式上线Steam平台,并迅速成为一部热门游戏。 PUBG以生存竞技为核心玩法,玩家将被投放到一个辽阔的荒…...

Elasticsearch:什么是大语言模型(LLM)?
大语言模型定义 大语言模型 (LLM) 是一种深度学习算法,可以执行各种自然语言处理 (natural language processing - NLP) 任务。 大型语言模型使用 Transformer 模型,并使用大量数据集进行训练 —— 因此规模很大。 这使他们能够识别、翻译、预测或生成文…...

Kubernetes1.27容器化部署Prometheus
Kubernetes1.27容器化部署Prometheus GitHub链接根据自己的k8s版本选择对应的版本修改镜像地址部署命令对Etcd集群进行监控(云原生监控)创建Etcd Service创建Etcd证书的Secret创建Etcd ServiceMonitorgrafana导入模板成功截图 对MySQL进行监控࿰…...

fasterxml 注解组装实体
使用 FasterXML Jackson 的注解 JsonTypeInfo 和 JsonSubTypes 可以实现多态类型的处理。在你的 User 类上,你可以添加这些注解来指示 Jackson 如何处理多态类型。 以下是使用 JsonTypeInfo 和 JsonSubTypes 注解的 User 类的修改: import com.fasterx…...

自写一个函数将js对象转为Ts的Interface接口
如今的前端开发typescript 已经成为一项必不可以少的技能了,但是频繁的定义Interface接口会给我带来许多工作量,我想了想如何来减少这些非必要且费时的工作量呢,于是决定写一个函数,将对象放进它自动帮我们转换成Interface接口&am…...

【数据结构】拆分详解 - 二叉树的链式存储结构
文章目录 一、前置说明二、二叉树的遍历 1. 前序、中序以及后序遍历 1.1 前序遍历 1.2 中序遍历 1.3 后序遍历 2. 层序遍历 三、常见接口实现 0. 递归中的分治思想 1. 查找与节点个数 1.1 节点个数 1.2 叶子节点个数 1.3 第k层节…...

Laravel修改默认的auth模块为md5(password+salt)验证
首先声明:这里只是作为一个记录,实行拿来主义,懒得去记录那些分析源码的过程,不喜勿喷,可直接划走。 第一步:创建文件夹:app/Helpers/Hasher; 第二步:创建文件: app/Help…...

OpenStack-train版安装之安装Keystone(认证服务)、Glance(镜像服务)、Placement
安装Keystone(认证服务)、Glance(镜像服务)、Placement 安装Keystone(认证服务)安装Glance(镜像服务)安装Placement 安装Keystone(认证服务) 数据库创建、创…...

【九日集训】第九天:简单递归
递归就是自己调用自己,例如斐波那契数列就是可以用简单递归来实现。 第一题 172. 阶乘后的零 https://leetcode.cn/problems/factorial-trailing-zeroes/description/ 这一题纯粹考数学推理能力,我这种菜鸡看了好久都没有懂。 大概是这样的思路&#x…...

Prime 1.0
信息收集 存活主机探测 arp-scan -l 或者利用nmap nmap -sT --min-rate 10000 192.168.217.133 -oA ./hosts 可以看到存活主机IP地址为:192.168.217.134 端口探测 nmap -sT -p- 192.168.217.134 -oA ./ports UDP端口探测 详细服务等信息探测 开放端口22&#x…...

Java 如何正确比较两个浮点数
看下面这段代码,将 d1 和 d2 两个浮点数进行比较,输出的结果会是什么? double d1 .1 * 3; double d2 .3; System.out.println(d1 d2);按照正常逻辑来看,d1 经过计算之后的结果应该是 0.3,最后打印的结果应该是 tru…...

Qt 如何操作SQLite3数据库?数据库创建和表格的增删改查?
# 前言 项目源码下载 https://gitcode.com/m0_45463480/QSQLite3/tree/main # 第一步 项目配置 平台:windows10 Qt版本:Qt 5.14.2 在.pro添加 QT += sql 需要的头文件 #include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>#include &…...

【Hadoop】分布式文件系统 HDFS
目录 一、介绍二、HDFS设计原理2.1 HDFS 架构2.2 数据复制复制的实现原理 三、HDFS的特点四、图解HDFS存储原理1. 写过程2. 读过程3. HDFS故障类型和其检测方法故障类型和其检测方法读写故障的处理DataNode 故障处理副本布局策略 一、介绍 HDFS (Hadoop Distribute…...

【Python-随笔】使用Python实现屏幕截图
使用Python实现屏幕截图 环境配置 下载pyautogui包 pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple/下载OpenCV包 pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/下载PyQT5包 pip install PyQt5 -i https://pypi.tuna.tsi…...

Sun Apr 16 00:00:00 CST 2023格式转换
Date date new Date(); log.info("当前时间为:{}",date); //yyyy-MM-dd HH:mm:ss SimpleDateFormat sdf new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS); String dateTime s…...

使用mongodb实现简单的读写操作
本文适合初学者,特别是刚刚安装了mongodb数据库的朋友,或在atlas刚拿到免费集群的朋友。 拿到数据库,心情很激动,手痒难耐。特别想向数据库插入几条数据库试试。即使是深夜完成了安装,也忍不住想去完成这些操作。看到…...

C语言实现Cohen_Sutherland算法
前提简要: 算法简介: 编码算法是最早、最流行的线段裁剪算法,该算法采用区域检验的方法,能够快速有效地判断一条线段与裁剪窗口的位置关系,对完全接受或完全舍弃的线段无需求交,即可直接识别。 算法思想&…...

MySQL进阶_EXPLAIN重点字段解析
文章目录 第一节.准备1.1 版本信息1.2 准备 第二节.type2.1 system2.2 const2.3 eq_ref2.4 ref2.5 ref_or_null2.6 index_merge2.7 unique_subquery2.8 range2.9 index2.10 all 第三节. Extra3.1 No tables used3.2 No tables used3.3 Using where3.4 No matching min/max row3…...

视图层与模板层
视图层 1 视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是…...

MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
目录 表结构准备 插入数据触发器 代码 测试 修改数据触发器 代码 测试 删除数据触发器 代码 测试 通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表user_logs中,包含增加,修改,删除。 表结构准备 根据…...