Spring Security day 11.23

news2025/2/4 8:57:30

ok了今天学习一个关于登录角色权限的管理框架,我们一起取看看吧

.权限控制

1.1 认证和授权概念

前面我们已经完成了后台管理系统的部分功能,例如检查项管
理、检查组管理、套餐管理、预约设置等。接下来我们需要思
2 个问题:
问题 1 :在生产环境下我们如果不登录后台系统就可以完成这
些功能操作吗?
答案显然是否定的,要操作这些功能必须首先登录到系统才可

以。

问题 2 :是不是所有用户,只要登录成功就都可以操作所有功
能呢?
答案是否定的,并不是所有的用户都可以操作这些功能。不同
的用户可能拥有不同的权限,这就需要进行授权了。
认证:系统提供的用于识别用户身份的功能,通常提供用户名
和密码进行登录其实就是在进行认证,认证的目的是让系统知
道你是谁。
授权:用户认证成功后,需要为用户授权,其实就是指定当前
用户可以操作哪些功能。

1.2 权限模块数据模型

前面已经分析了认证和授权的概念,要实现最终的权限控制,
需要有一套表结构支撑:
用户表 t_user 、权限表 t_permission 、角色表 t_role 、菜单表
t_menu 、用户角色关系表 t_user_role 、角色权限关系表
t_role_permission 、角色菜单关系表 t_role_menu
表之间关系如下图:

 

通过上图可以看到,权限模块共涉及到 7 张表。在这 7 张表
中,角色表起到了至关重要的作用,其处于核心位置,因为用
户、权限、菜单都和角色是多对多关系。
接下来我们可以分析一下在认证和授权过程中分别会使用到哪
些表:
授权过程:用户必须完成认证之后才可以进行授权,首先可以
根据用户查询其角色,再根据角色查询对应的菜单,这样就确
定了用户能够看到哪些菜单。然后再根据用户的角色查询对应
的权限,这样就确定了用户拥有哪些权限。所以授权过程会用
到上面 7 张表。

 

1.3 Spring Security简介

Spring Security Spring 提供的安全认证服务的框架。使用
Spring Security 可以帮助我们来简化认证和授权的过程。 常用的权限框架除了 Spring Security ,还有 Apache shiro 框架。

.Spring Security入门案例

2.1 工程搭建

创建 maven 工程,打包方式为 war 。提供 index.html 页面,内 容为hello Spring Security!!
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://maven.apache.org/POM/
4.0.0 http://maven.apache.org/xsd/maven-
4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>demo01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-securityconfig</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-securitytaglibs</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-mavenplugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>8080</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>

 2.2 配置web.xml

web.xml 中主要配置 SpringMVC DispatcherServlet 和用
于整合第三方框架的 DelegatingFilterProxy ,用于整合 Spring
Security
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/
javaee http://xmlns.jcp.org/xml/ns/javaee/webapp_4_0.xsd"
version="4.0">
<listener>
<listenerclass>org.springframework.web.context.ContextLoa
derListener</listener-class>
</listener>
<context-param>
<paramname>contextConfigLocation</param-name>
<param-value>classpath:springsecurity.xml</param-value>
</context-param>
<filter>
<!--
DelegatingFilterProxy用于整合第三方框架
整合Spring Security时过滤器的名称必须为
springSecurityFilterChain,
否则会抛出NoSuchBeanDefinitionException
异常
-->
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingF
ilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

 2.3 配置spring-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/bea
ns"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xmlns:context="http://www.springframework.org/sc
hema/context"
xmlns:mvc="http://www.springframework.org/schema
/mvc"
xmlns:security="http://www.springframework.org/s
chema/security"
xsi:schemaLocation="http://www.springframework.o
rg/schema/beans
http://www.springframework.org/schema/beans/spri
ng-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring
-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/sp
ring-context.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/
spring-security.xsd">
<!--
auto-config:是否自动配置
设置为true时框架会提供默认的一些配
置,例如提供默认的登录页面、登出处理等
设置为false时需要显示提供登录表单配
置,否则会报错
use-expressions:是否使用spring
security提供的表达式来描述权限
-->
<security:http auto-config="true" useexpressions="true">
<!--
intercept-url:定义一个拦截规则
pattern:描述拦截规则 /** 表示拦截
所有请求
asscess:指定所需的访问角色或者访问权
限
-->
<security:intercept-url
pattern="/**" access="hasAnyRole('ROLE_ADMIN')">
</security:intercept-url>
</security:http>
<!--配置认证管理器-->
<security:authentication-manager>
<!--配置认证提供者-->
<security:authentication-provider>
<!-- 配置一个具体的用户,后期需要从数
据库查询用户-->
<security:user-service>
<security:user name="admin"
password="{noop}123456"
authorities="ROLE_ADMIN"></security:user>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
</beans>

2.4 入门案例改进

前面我们已经完成了 Spring Security 的入门案例,通过入门案
例我们可以看到, Spring Security 将我们项目中的所有资源都
保护了起来,要访问这些资源必须要完成认证而且需要具有
ROLE_ADMIN 角色。但是入门案例中的使用方法离我们真实
生产环境还差很远,还存在如下一些问题:
  • 项目中我们将所有的资源(所有请求URL)都保护起来,实际环境下往往有一些资源不需要认证也可以访问,也就 是可以匿名访问。
  • 登录页面是由框架生成的,而我们的项目往往会使用自己的登录页面。
  • 直接将用户名和密码配置在了配置文件中,而真实生产环境下用户名和密码往往保存在数据库中
  • 在配置文件中配置的密码使用明文,这非常不安全,而真
    实生产环境下密码需要进行加密。

.案例改进

3.1 配置可匿名访问的资源

第一步:在项目中创建 pages 目录,在 pages 目录中创建
a.html b.html
第二步:在 spring-security.xml 文件中配置,指定哪些资源可
以匿名访问
第三步:通过上面的配置可以发现, pages 目录下的文件可以
在没有认证的情况下任意访问。
<!--
配置哪些资源匿名可以访问(不登录也可以访
问)
指定哪些资源不需要进行权限校验,可以使用通
配符
-->
<!-- <security:http security="none"
pattern="/pages/a.html"></security:http>-->
<!-- <security:http security="none"
pattern="/pages/b.html"></security:http>-->
<security:http security="none"
pattern="/pages/**"></security:http>

 3.2 使用指定的登录页面

第一步:提供login.html作为项目的登录页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<h3>自定义登录页面</h3>
<form action="/login" method="post">
username:<input type="text"
name="username"><br>
password:<input type="password"
name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
第二步:修改 spring-security.xml 文件,指定 login.html 页面可以匿名访问
<security:http security="none" pattern="/login.html" />
第三步:修改 spring-security.xml 文件,加入表单登录信息的配置
<security:http auto-config="true" use-expressions="true">
第三步:修改 spring-security.xml 文件,加入表单登录信息的配置
<security:http auto-config="true" use-expressions="true">
<!--
intercept-url:定义一个拦截规则
pattern:描述拦截规则 /** 表示拦截
所有请求
asscess:指定所需的访问角色或者访问权
限
-->
<security:intercept-url
pattern="/**" access="hasAnyRole('ROLE_ADMIN')">
</security:intercept-url>
<!--
如果我们要使用自己指定的页面作为登录页面,
必须配置登录表单.页面提交的登录表单请求是由框架负责处理
login-page:指定登录页面访问URL
-->
<security:form-login
login-page="/login.html"
username-parameter="username"
password-parameter="password"
login-processing-url="/login"
default-target-url="/index.html"
authentication-failure-url="/login.html"></security:form-login>
<!--
csrf:对应CsrfFilter过滤器
disabled:是否启用CsrfFilter过滤
器,如果使用自定义登录页面需要关闭此项,否则登录操作会被禁
用(403)
-->
<security:csrf disabled="true">
</security:csrf>
</security:http>

 3.3 从数据库查询用户信息

如果我们要从数据库动态查询用户信息,就必须按照 spring
security 框架的要求提供一个实现 UserDetailsService 接口的
实现类,并按照框架的要求进行配置即可。框架会自动调用实
现类中的方法并自动进行密码校验。
  • 实体类 
public class Emp {
private String username;
private String password;
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 class EmpService implements
UserDetailsService {
public Map<String, Emp> map=new HashMap<>
();//模拟数据库中的数据
public void initData(){
Emp emp1=new Emp();
emp1.setUsername("admin");
emp1.setPassword("123456");
Emp emp2=new Emp();
emp2.setUsername("xiaoming");
emp2.setPassword("123456");
map.put(emp1.getUsername(),emp1);
map.put(emp2.getUsername(),emp2);
}
@Override
public UserDetails loadUserByUsername(String
username) throws UsernameNotFoundException {
initData();
System.out.println("username="+username);
Emp emp = map. Get(username);//模拟根据用户
名查询员工信息
if(emp==null){
//用户不存在
return null;
}else{
//将用户信息返回给框架
//框架会进行密码比对(页面提交的密码和数据
库查询的密码进行比对)
List<GrantedAuthority> list=new
ArrayList<>();
//为当前用户授权 后期需要改为从数据库查询
当前用户对应的权限
list.add(new
SimpleGrantedAuthority("permission_A"));//授权
list.add(new
SimpleGrantedAuthority("permission_B"));//授权
if(username.equals("admin")){
list.add(new
SimpleGrantedAuthority("ROLE_ADMIN"));//授予角色
}
User securityUser=new
User(username,"{noop}"+emp.getPassword(),list);
return securityUser;
}
}
}
spring-security.xml
<!--配置认证管理器-->
<security:authentication-manager>
<!--配置认证提供者-->
<security:authentication-provider
user-service-ref="empService">
<!-- 配置一个具体的用户,后期需要从数
据库查询用户-->
<!-- <security:user-service>-->
<!-- <security:user
name="admin" password="{noop}123456"
authorities="ROLE_ADMIN"></security:user>-->
<!-- </security:user-service>-->
</security:authentication-provider>
</security:authentication-manager>
<bean id="empService"
class="com.lzw.service.EmpService"></bean>
我们提供了 UserService 实现类,并且按照框架的要求实现了
UserDetailsService 接口。在 spring 配置文件中注册
UserService ,指定其作为认证过程中根据用户名查询用户信
息的处理类。当我们进行登录操作时, spring security 框架会
调用 UserService loadUserByUsername 方法查询用户信
息,并根据此方法中提供的密码和用户页面输入的密码进行比
对来实现认证操作。

3.4 对密码加密

前面我们使用的密码都是明文的,这是非常不安全的。一般情况下用户的密码需要进行加密后再保存到数据库中。
常见的密码加密方式有:
3DES、 AES DES :使用对称加密算法,可以通过解密来还原出原始密码
MD5 SHA1 :使用单向 HASH 算法,无法通过计算还原出原始密码,但是可以建立彩虹表进行查表破解
bcrypt :将 salt 随机并混入最终加密后的密码,验证时也无需 单独提供之前的salt ,从而无需单独处理 salt 问题 加密后的格式一般为:
$2a$10$/bTVvqqlH9UiE0ZJZ7N2Me3RIgUCdgMheyTgV0B4c
MCSokPa.6oCa
第一步:在 spring-security.xml 文件中指定密码加密对象
<!--配置认证管理器-->
<security:authentication-manager>
<!--配置认证提供者-->
<security:authentication-provider
user-service-ref="empService">
<!-- 配置一个具体的用户,后期需要从数
据库查询用户-->
<!-- <security:user-service>-->
<!-- <security:user
name="admin" password="{noop}123456"
authorities="ROLE_ADMIN"></security:user>-->
<!-- </security:user-service>-->
<!--指定度密码进行加密的对象-->
<security:password-encoder
ref="passwordEncoder"></security:passwordencoder>
</security:authentication-provider>
</security:authentication-manager>
<bean id="empService"
class="com.lzw.service.EmpService"></bean>
<!--配置密码加密对象-->
<bean id="passwordEncoder"
class="org.springframework.security.crypto.bcry
pt.BCryptPasswordEncoder"/>
<!--开启spring注解使用-->
<context:annotation-config>
</context:annotation-config>
第二步:修改 UserService 实现类
public class EmpService implements
UserDetailsService {
@Autowired
private BCryptPasswordEncoder
passwordEncoder;
public Map<String, Emp> map=new HashMap<>
();//模拟数据库中的数据
public void initData(){
Emp emp1=new Emp();
emp1.setUsername("admin");
emp1.setPassword(passwordEncoder.encode("123456"
));
Emp emp2=new Emp();
emp2.setUsername("xiaoming");
emp1.setPassword(passwordEncoder.encode("123456"
));
map.put(emp1.getUsername(),emp1);
map.put(emp2.getUsername(),emp2);
}
@Override
public UserDetails loadUserByUsername(String
username) throws UsernameNotFoundException {
initData();
System.out.println("username="+username);
Emp emp = map.get(username);//模拟根据用户
名查询员工信息
if(emp==null){
//用户不存在
return null;
}else{
//将用户信息返回给框架
//框架会进行密码比对(页面提交的密码和数据
库查询的密码进行比对)
List<GrantedAuthority> list=new
ArrayList<>();
//为当前用户授权 后期需要改为从数据库查询
当前用户对应的权限
list.add(new
SimpleGrantedAuthority("permission_A"));//授权
list. Add(new
SimpleGrantedAuthority("permission_B"));//授权
if(username.equals("admin")){
list.add(new
SimpleGrantedAuthority("ROLE_ADMIN"));//授予角色
}
User securityUser=new
User(username,emp.getPassword(),list);
return securityUser;
}
}
}

3.5 配置多种校验规则

为了测试方便,首先在项目中创建 a.html b.html c.html
d.html 几个页面
修改 spring-security.xml 文件:
<security:http auto-config="true" useexpressions="true">
<!--
intercept-url:定义一个拦截规则
pattern:描述拦截规则 /** 表示拦截
所有请求
asscess:指定所需的访问角色或者访问权
限
-->
<!--只要认证通过就可以访问-->
<security:intercept-url
pattern="/pages/a.html"
access="isAuthenticated()" />
<!--拥有add权限就可以访问b.html页面-->
<security:intercept-url
pattern="/pages/b.html"
access="hasAuthority('add')" />
<!--拥有ROLE_ADMIN角色就可以访问c.html
页面-->
<security:intercept-url
pattern="/pages/c.html"
access="hasRole('ROLE_ADMIN')" />
<!--拥有ROLE_ADMIN角色就可以访问d.html
页面,
注意:此处虽然写的是ADMIN角色,框架会
自动加上前缀ROLE_-->
<security:intercept-url
pattern="/pages/d.html"
access="hasRole('ADMIN')" />
<security:intercept-url
pattern="/**" access="hasAnyRole('ROLE_ADMIN')">
</security:intercept-url>
<!--
如果我们要使用自己指定的页面作为登录页面,
必须配置登录表单.页面提交的登录表单请求是由框架负责处理
login-page:指定登录页面访问URL
-->

<security:form-login
login-page="/login.html"
usernameparameter="username"
passwordparameter="password"
login-processingurl="/login"
default-targeturl="/index.html"
authentication-failureurl="/login.html"></security:form-login>
<!--
csrf:对应CsrfFilter过滤器
disabled:是否启用CsrfFilter过滤
器,如果使用自定义登录页面需要关闭此项,否则登录操作会被禁
用(403)
-->
<security:csrf disabled="true">
</security:csrf>
</security:http>

3.6 注解方式权限控

第一步:在 spring-security.xml 文件中配置组件扫描,用于扫描Controller
<!--开启spring注解使用-->
<context:annotation-config></context:annotationconfig>
<mvc:annotation-driven></mvc:annotation-driven>
<context:component-scan basepackage="com.lzw.controller">
</context:component-scan>
第二步:在 spring-security.xml 文件中开启权限注解支持
<!--开启注解方式权限控制-->
<security:global-method-security pre-postannotations="enabled" />
第三步:创建 Controller 类并在 Controller 的方法上加入注解
进行权限控制
@RestController
@RequestMapping("/emp")
public class EmpController {
@RequestMapping("/add")
@PreAuthorize("hasAuthority('add')")//表示用
户必须拥有add权限才能调用当前方法
public String add(){
System.out.println("add...");
return "success";
}
@RequestMapping("/delete")
@PreAuthorize("hasRole('ROLE_ADMIN')")//表示
用户必须拥有ROLE_ADMIN角色才能调用当前方法
public String delete(){
System.out.println("delete...");
return "success";
}
}

3.7 退出登录

用户完成登录后 Spring Security 框架会记录当前用户认证状态
为已认证状态,即表示用户登录成功了。那用户如何退出登录
呢?我们可以在 spring-security.xml 文件中进行如下配置:
<security:http auto-config="true" useexpressions="true">
<!--
intercept-url:定义一个拦截规则
pattern:描述拦截规则 /** 表示拦截所有请求
asscess:指定所需的访问角色或者访问权限
-->
<!--只要认证通过就可以访问-->
<security:intercept-url
pattern="/pages/a.html"
access="isAuthenticated()" />
<!--拥有add权限就可以访问b.html页面-->
<security:intercept-url
pattern="/pages/b.html"
access="hasAuthority('add')" />
<!--拥有ROLE_ADMIN角色就可以访问c.html页面-->
<security:intercept-url
pattern="/pages/c.html"
access="hasRole('ROLE_ADMIN')" />
<!--拥有ROLE_ADMIN角色就可以访问d.html页面,
注意:此处虽然写的是ADMIN角色,框架会自动加上前
缀ROLE_-->
<security:intercept-url
pattern="/pages/d.html"
access="hasRole('ADMIN')" />
<security:intercept-url pattern="/**"
access="hasAnyRole('ROLE_ADMIN')">
</security:intercept-url>
<!--
如果我们要使用自己指定的页面作为登录页面,必须配置登
录表单.页面提交的登录表单请求是由框架负责处理
login-page:指定登录页面访问URL
-->
<security:form-login
login-page="/login.html"
username-parameter="username"
password-parameter="password"
login-processing-url="/login"
default-target-url="/index.html"
authentication-failureurl="/login.html"></security:form-login>
<!--
csrf:对应CsrfFilter过滤器
disabled:是否启用CsrfFilter过滤器,如果使用
自定义登录页面需要关闭此项,否则登录操作会被禁用(403)
-->
<security:csrf disabled="true">
</security:csrf>
<!--
logout:退出登录
logout-url:退出登录操作对应的请求路径
logout-success-url:退出登录后的跳转页面
-->
<security:logout logout-url="/logout"
logout-successurl="/login.html" invalidate-session="true"/>
</security:http>

 ok了家人们明天见bye

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IC验证】verilog及systemverilog特殊特性的分析

verilog及systemverilog特殊特性的分析 1.概述2.赋值延迟&#xff08;0&#xff09;总结&#xff08;1&#xff09;情况一&#xff1a;initial中进行阻塞赋值和非阻塞赋值&#xff08;不延迟&#xff09;a代码b 电路图c 结果 &#xff08;2&#xff09;时钟a 代码b 电路图c 结果…

FPGA流水线考虑因素

流水线考虑因素 另一种提升性能的方法是对拥有多个逻辑级数的长数据路径进行重新组织&#xff0c;并将其分配在多个时钟周期上。这种方法 以时延和流水线开销逻辑管理为代价&#xff0c;来达到加快时钟周期和提高数据吞吐量的目的。 由于 FPGA 器件带有大量的寄存器&#x…

关于 PCB线路板细节锣槽问题 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144783817 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

SQL创建和操纵表

本文介绍创建、更改和删除表的基本知识。 1. 创建表 SQL 不仅用于表数据操纵&#xff0c;而且还用来执行数据库和表的所有操作&#xff0c;包括表本身的创建和处理。一般有两种创建表的方法&#xff1a; 多数DBMS 都具有交互式创建和管理数据库表的工具&#xff1b;表也可以…

RPA系列-uipath 学习笔记4

使用Uipath 处理hover的问题 备注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有学习来源自uipath Academy 首先&#xff0c;打开uipath给我们提供的一个网站 ACME,这个网站呢&#xff0c;需要提前注册一下的哈。 今天呢&#xff0c;就是记录一下&#xff0c;怎…

Unity编译Android apk包进度奇慢或gradle报错的解决方案

最近遇到Unity编译Android apk进度卡在"Calling IPostGenerateGradleAndroidProject callbacks"进度一直不变&#xff0c;如下图&#xff1a; 最后提示编译失败&#xff0c;类似错误如下&#xff1a; Picked up JAVA_TOOL_OPTIONS: -Dfile.encodingUTF-8FAILURE: Bu…

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分&#xff0c;感知可能不明显&#xff1b;而如果丢字发生在高能量部分或关键音素上&#xff0c;感知…

CAT3D: Create Anything in 3D with Multi-View Diffusion Models 论文解读

24年5月的论文&#xff0c;上一版就是ReconFusion 目录 一、概述 二、相关工作 1、2D先验 2、相机条件下的2D先验 3、多视角先验 4、视频先验 5、前馈方法 三、Method 1、多视角扩散模型 2、新视角生成 3、3D重建 一、概述 该论文提出一种CAT3D方法&#xff0c;实现…

模型工作流:自动化的模型内部三角面剔除

1. 关于自动减面 1.1 自动减面的重要性及现状 三维模型是游戏、三维家居设计、数字孪生、VR/AR等几乎所有三维软件的核心资产&#xff0c;模型的质量和性能从根本上决定了三维软件的画面效果和渲染性能。其中&#xff0c;模型减面工作是同时关乎质量和性能这两个要素的重要工…

黑马程序员Java笔记整理(day08)

1.代码块 静态代码块 实例代码块 2.内部类 成员内部类 静态内部类 局部内部类 匿名内部类 认识 常见使用形式 应用场景 简化版本 另一个应用场景 3.函数式编程 Lambda 函数简化 方法引用 4.常用API String ArrayList 5.GUI编程 快速认识 事件处理 三种常用写法 第一种 第二…

redis延迟队列

Redis延迟队列 Redis延迟队列是基于Redis构建的消息队列&#xff0c;用来处理需延迟执行的任务。 基本原理 它借助Redis的有序集合&#xff08;Sorted Set&#xff09;数据结构达成目的。会把任务及其执行时间分别当成成员与分值存进有序集合&#xff0c;由于执行时间作为分值&…

爱思唯尔word模板

爱思唯尔word模板 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 参考文献书签链接

【JDBC】入门增删改查

JDBC JDBC概述 JDBC&#xff08;Java DataBase Connectivity, java数据库连接&#xff09;是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范&#xff0c;可以为不同的关系型数据库提供统一访问&#xff0c;它由一组用Java语言编写的接口和类组成。 XML方式…

Java开发-后端请求成功,前端显示失败

文章目录 报错解决方案1. 后端未配置跨域支持2. 后端响应的 Content-Type 或 CORS 配置问题3. 前端 request 配置问题4. 浏览器缓存或代理问题5. 后端端口未被正确映射 报错 如下图&#xff0c;后端显示请求成功&#xff0c;前端显示失败 解决方案 1. 后端未配置跨域支持 …

Dify服务器部署教程

Dify的github地址: https://github.com/langgenius/dify 服务器要求&#xff1a;2c4g 1、克隆仓库 可以通过命令或者下载zip解压后上传服务器都行 git clone https://github.com/langgenius/dify.git 2、docker启动 cd dify/dockercp .env.example .envdocker compose up -d…

砝码称重(2021年蓝桥杯)

【问题描述】 你有一架天平和N个砝码&#xff0c;这N个砝码的重量依次是w1,w2,……,wn。&#xff08;1~n为下标&#xff09; 请你计算利用N个砝码一共可以称出多少种不同的重量&#xff1f; 【注意】砝码可以放在天平的两边 【输入格式】 第一行包含一个整数N。 第二行包含N个…

KaiOS 4.0 | DataCall and setupData implemention

相关文档 1、KaiOS 3.1 系统介绍 KaiOS 系统框架和应用结构(APP界面逻辑)文章浏览阅读842次,点赞17次,收藏5次。对于Java开发者而言,理解JS的逻辑调用是有点困难的。而KaiOS webapp开发又不同于现代的web开发,更像chrome浏览器内嵌模式。在这里梳理一下kaios平台web应用…

ArcGIS Pro地形图四至角图经纬度标注与格网标注

今天来看看ArcGIS Pro 如何在地形图上设置四至角点的经纬度。方里网标注。如下图的地形图左下角经纬度标注。 如下图方里网的标注 如下为本期要介绍的例图&#xff0c;如下&#xff1a; 图片可点击放大 接下来我们来介绍一下 推荐学习&#xff1a;GIS入门模型构建器Arcpy批量…

win系统B站播放8k视频启用HEVC编码

下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads&#xff0c;根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent 在youtube中会导致视频无法播放&#xff0c;我选择直接屏蔽了 B站设置

mysql锁机制以及隔离级别下保证并发安全的方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 mysql锁机制以及隔离级别下保证并发安全的方式 多事务并发执行可能出现的问题mysql有那些锁全局锁表级锁行锁 在不同的隔离级别下mysql保证并发安全的方式RU隔离级别RC隔离级…