JWT单点登录

news2024/11/25 6:34:18

单点登录

文章目录

      • 单点登录
        • 零、用户模块内容以及设计
        • 一、问题的提出
        • 二、单点登录SSO
          • 1.1 什么是单点登录
          • 1.2 单点登录的技术实现机制
        • 二、远程调用方式RPC
        • 三、JWT的使用
          • 3.1 session的使用原理
          • 3.2 JWT介绍
          • 3.3 JWT原理
          • 3.4 JWT的使用
        • 四、CAS实现单点登录的原理
        • 四、CAS的安装和代码的实现
          • 4.1 CAS Server的安装
          • 4.2 编写客户端
          • 4.3 使用springboot集成CAS客户端

零、用户模块内容以及设计

用户模块一般包含注册、认证、鉴权等功能。

注册一般是指添加用户信息。

认证登录和判断是否登录。

鉴权是验证用户的权限是否符合要求。

一般设计:用户-----角色-----权限,多对多一共5张表。

特殊设计:相同角色可能由于用户的特殊性给与不同的权限。用户-----权限组(角色)----权限。用户最终跟权限挂钩,权限组只是作为一个模板(身份)。

一、问题的提出

场景一:企业里有一系列的系统,由于开发的时间有先后,导致出现了OA、ERP、CRM等系统,每个都有独立的登录模块,用户在使用系统的时候,需要登录多个系统,并且每个系统都不能直接跳转到其他系统中。

提出问题:能否在登录了其中一个系统后,其他的系统都不需要登录,直接认证,那么系统之间也就可以很容易跳转和相互调用了。

场景二:某个大型的企业收购了另外一个企业,本来每一个企业都有其用户数据库。

提出问题:能否直接将被收购的企业的网站嵌入到原来的网站,并且无论是哪个企业的用户登录其中一个系统后,就不需要登录另一个系统,可以直接使用。

场景三:现在,很多企业都是使用微服务架构来实现自己的系统。

提出问题:多个服务之间,如何保证登录了其中一个服务后,就能够直接使用其他的服务,而不需要再次登录。

二、单点登录SSO

1.1 什么是单点登录

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

较大的企业内部,一般都有很多的业务支持系统为其提供相应的管理和IT服务。
例如财务系统为财务人员提供财务的管理、计算和报表服务;
人事系统为人事部门提供全公司人员的维护服务;
各种业务系统为公司内部不同的业务提供不同的服务等等。
这些系统的目的都是让计算机来进行复杂繁琐的计算工作,来替代人力的手工劳动,提高工作效率和质量。这些不同的系统往往是在不同的时期建设起来的,运行在不同的平台上;也许是由不同厂商开发,使用了各种不同的技术和标准。

如果举例说国内一著名的IT公司(名字隐去),内部共有60多个业务系统,这些系统包括两个不同版本的SAP的ERP系统,12个不同类型和版本的数据库系统,8个不同类型和版本的操作系统,以及使用了3种不同的防火墙技术,还有数十种互相不能兼容的协议和标准,你相信吗?不要怀疑,这种情况其实非常普遍。每一个应用系统在运行了数年以后,都会成为不可替换的企业IT架构的一部分,如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UbpDdpJ0-1686298555220)(mdpic/p1.PNG)]

随着企业的发展,业务系统的数量在不断的增加,老的系统却不能轻易的替换,这会带来很多的开销。其一是管理上的开销,需要维护的系统越来越多。很多系统的数据是相互冗余和重复的,数据的不一致性会给管理工作带来很大的压力。业务和业务之间的相关性也越来越大,例如公司的计费系统和财务系统,财务系统和人事系统之间都不可避免的有着密切的关系。

为了降低管理的消耗,最大限度的重用已有投资的系统,很多企业都在进行着企业应用集成(EAI)。企业应用集成可以在不同层面上进行:例如在数据存储层面上的“数据大集中”,在传输层面上的“通用数据交换平台”,在应用层面上的“业务流程整合”,和用户界面上的“通用企业门户”等等。事实上,还用一个层面上的集成变得越来越重要,那就是“身份认证”的整合,也就是“单点登录”。

通常来说,每个单独的系统都会有自己的安全体系和身份认证系统。整合以前,进入每个系统都需要进行登录,这样的局面不仅给管理上带来了很大的困难,在安全方面也埋下了重大的隐患。下面是一些著名的调查公司显示的统计数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zj4vyoP0-1686298555221)(mdpic/p2.PNG)]

另外,使用“单点登录”还是SOA时代的需求之一。在面向服务的架构中,服务和服务之间,程序和程序之间的通讯大量存在,服务之间的安全认证是SOA应用的难点之一,应此建立“单点登录”的系统体系能够大大简化SOA的安全问题,提高服务之间的合作效率。

1.2 单点登录的技术实现机制

单点登录的机制其实是比较简单的,用一个现实中的例子做比较。颐和园是北京著名的旅游景点,在颐和园内部有许多独立的景点,例如“苏州街”、“佛香阁”和“德和园”,都可以在各个景点门口单独买票。很多游客需要游玩所有的景点,这种买票方式很不方便,需要在每个景点门口排队买票,钱包拿进拿出的,容易丢失,很不安全。于是绝大多数游客选择在大门口买一张通票(也叫套票),就可以玩遍所有的景点而不需要重新再买票。他们只需要在每个景点门口出示一下刚才买的套票就能够被允许进入每个独立的景点

单点登录的机制也一样,如下图所示,当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录(1);根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket(2);用户再访问别的应用的时候(3,5)就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性(4,6)。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aDW1lLyh-1686298555221)(mdpic/p3.PNG)]

从上面的视图可以看出,要实现SSO,需要以下主要的功能:

所有应用系统共享一个身份认证系统。
统一的认证系统是SSO的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。

所有应用系统能够识别和提取ticket信息
要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。

常见的方式有:

  1. 使用redis之类的实现session共享
  2. 使用jwt实现
  3. 使用CAS实现

二、远程调用方式RPC

指在一个项目中,调用另一个项目中的服务。

【RMI】:RMI是个典型的为java定制的远程通信协议, 我们都知道,在single vm中,我们能够通过直接调用java object instance来实现通信,那么在远程通信时,假设也能依照这样的方式当然是最好了。这样的远程通信的机制成为RPC(RemoteProcedure Call),RMI正是朝着这个目标而诞生的。传输的标准格式是Java Object Stream;基于Java串行化机制将请求的Java Object信息转化为流。传输协议是Socket。

特点:为Java定制,所以在Java中运行速度最快,使用Java语言开发,不能跨语言。通用性较弱。例如微服务dubbo就是采用的此方案。

【REST】:采用http协议进行通信。例如微服务的springcloud就是采用此方案。

特点:由于采用的通用协议,也就意味着通用性比较强。基本上现在大多都采用此方案。

【WS】:webservice。采用SOAP(SimpleObject Access Protocol)协议,采用标准的xml格式传输数据。要求语言格式为WSDL(webservice describe language)。

特点: 使用xml格式,通用性也很强。但是xml传输数据相对json来说,体积比较大,格式解析比较麻烦。早期用得很多。

【JMS】:Java消息服务,传输内容作为一个Message。

三、JWT的使用

3.1 session的使用原理

http协议是无状态的。无状态是指服务器不记录客户端的信息。借助session来确认是否同一个客户端发送的请求。

当客户端第一次访问服务器时,请求中没有包含sessionid,服务器会自动创建一个session,并将该sessionid保存到客户端的cookie中,age采用默认设置(即关闭浏览器失效),下一次客户端访问服务器时,会将sessionid传输到服务器,服务器将会验证该id是否合法,并确认该id所关联的数据(map)。

【缺点:】如果需要跨服务认证,那么可能无法获取之前存在的session信息。不适合分布式环境,除非进行session共享。

3.2 JWT介绍

在分布式环境中,需要模拟session的使用过程,此处采用第三方的框架JWT。

JWT,即JSON WEB TOKEN。是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

3.3 JWT原理

参考JWT官方文档:https://jwt.io/

3.4 JWT的使用

1、导入依赖

<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.1</version>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

2、编写帮助类

public class TokenUtil {
    private static Long tokenExpireTime = 1000 * 60 * 30L;//  单位毫秒
    public static final String PRIVATEKEY = "privateKey";
    public static final String ACCESSTOKEN = "AccessToken";// 公私钥
    private static final String secretKey = "ueor82739sjsd234759jdfijosd289347sdjklfvjsxdr389wrksjdhfjksdyr9234yu89htsdkhfjksdhf83wy4hrsdjkhfsdjkh8i34wyuirfhsdjkfsxmnfbcvm,xcnskdhfriw3eyrikni12y391y238923y4y89dfhisfhsdjknfk23w4y598hfdjkfkjxcfbnisyer93we5rhkdjsfnjks"; // secret

    // 生成token
    public static String createToken(String userName){
        // 得到当前时间
        Date now = new Date();
        // 通过hs256算法,以及secretKey得到Algorithm对象
        Algorithm algo = Algorithm.HMAC256(secretKey);
        String token = JWT.create()
                .withIssuer("qianfeng")
                .withIssuedAt(now)
                .withExpiresAt(new Date(now.getTime() + tokenExpireTime))
                .withClaim("userName", userName)//保存身份标识
                .sign(algo);
        return token;
    }



    /**
     * JWT验证
     * @param token
     * @return userName
     */
    public static String verifyJWT(String token){
        String userName = null;
        try {
            Algorithm algorithm = Algorithm.HMAC256(secretKey);
            JWTVerifier verifier = JWT.require(algorithm)
                    .withIssuer("qianfeng")
                    .build();
            DecodedJWT jwt = verifier.verify(token);
            userName = jwt.getClaim("userName").asString();
        } catch (JWTVerificationException e){
            e.printStackTrace();
        }
        return userName;
    }

    public static void main(String[] args) {
        String jwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJxaWFuZmVuZyIsImV4cCI6MTYwNTYwMzc1NSwidXNlck5hbWUiOiJhZG1pbiIsImlhdCI6MTYwNTYwMTk1NX0.7mgYbJfCSqkauj0Vi7KJba96qHjk7i3CYYj4bCJF5FE";
        System.out.println(verifyJWT(jwt));

//        System.out.println(createToken("admin"));
    }
}

3、在登录时创建token并存入到cookie中,在访问时加载cookie中的数据并发送到服务器验证。

四、CAS实现单点登录的原理

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:

【1】开源的企业级单点登录解决方案。

【2】CAS Server 为需要独立部署的 Web 应用。

【3】CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:

CAS原理
img

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server

SSO单点登录访问流程主要有以下步骤:

  • 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。

  • 定向认证:SSO客户端会重定向用户请求到SSO服务器。

  • 用户认证:用户身份认证。

  • 发放票据:SSO服务器会产生一个随机的Service Ticket。

  • 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。

  • 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

四、CAS的安装和代码的实现

4.1 CAS Server的安装

CAS服务器安装

可以在下载:https://github.com/apereo/cas-overlay-template/tree/5.3

点击Download ZIP下载并解压
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0rmAOg2U-1686298555222)(mdpic/p4.PNG)]

下载后,将工程用开发工具打开,使用maven进行打包为war

使用开发工具打开并使用maven的package命令打包成war文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FQeYReDY-1686298555222)(mdpic/p5.PNG)]

将cas.war部署到tomcat的webapps目录下,后启动tomcat

在浏览器打开http://localhost:8080/cas 会出现登录页面,默认用户名:casuser,密码:Mellon

4.2 编写客户端

下载一个客户端示例代码:https://github.com/cas-projects/cas-sample-java-webapp

新建一个Java web的maven项目,将刚下载的示例项目中的pom.xml中的依赖复制到自己项目中,导入对应的依赖,将示例项目的web.xml中的内容复制到自己的项目的web.xml中,并将示例项目中的index.jsp和logout.jsp复制到自己的项目中,并修改web.xml中配置,将cas服务端修改成自己配置的tomcat地址,将客户端修改成自己的客户端的地址,例如本项目web.xml中的配置

<filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>http://localhost:8080/cas</param-value>
        </init-param>
    </filter>

    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>

    <filter>
        <filter-name>CAS Authentication Filter</filter-name>
        <!--<filter-class>org.jasig.cas.client.authentication.Saml11AuthenticationFilter</filter-class>-->
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>http://localhost:8080/cas/login</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://localhost:8080/demo</param-value>
        </init-param>
    </filter>

    <filter>
        <filter-name>CAS Validation Filter</filter-name>
        <!--<filter-class>org.jasig.cas.client.validation.Saml11TicketValidationFilter</filter-class>-->
        <filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>http://localhost:8080/cas</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://localhost:8080/demo</param-value>
        </init-param>
        <init-param>
            <param-name>redirectAfterValidation</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>useSession</param-name>
            <param-value>true</param-value>
        </init-param>
        <!--
        <init-param>
            <param-name>acceptAnyProxy</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>proxyReceptorUrl</param-name>
            <param-value>/sample/proxyUrl</param-value>
        </init-param>
        <init-param>
            <param-name>proxyCallbackUrl</param-name>
            <param-value>https://mmoayyed.unicon.net:9443/sample/proxyUrl</param-value>
        </init-param>
        -->
        <init-param>
            <param-name>authn_method</param-name>
            <param-value>mfa-duo</param-value>
        </init-param>
    </filter>

    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

启动项目,运行项目的首页,会出现以下问题

未配置https出现的问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-09V2cK8A-1686298555223)(mdpic/p6.PNG)]

出现此问题的原因主要是CAS默认支持的服务器和客户端必须是https协议的,但是我们刚写的项目中默认是http协议,此处有两种办法解决:1. 将刚刚的项目配置成https。2:修改服务端配置,让http也可以支持。此处为了简单起见直接采用第二种方式。实际生产环境中可以采取第一种方式。

修改配置:在刚刚配置服务端的tomcat的webapps中找到cas项目,修改cas\WEB-INF\classes\services目录下的HTTPSandIMAPS-10000001.json文件,修改第三行。

#未修改前
"serviceId" : "^(https|imaps)://.*",
#修改成
"serviceId" : "^(https|http|imaps)://.*",

修改cas\WEB-INF\classes目录下的application.properties文件,在最后加上如下内容

cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true

重启服务器端后,再访问客户端的首页,会提示登录

登录页
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RC3Wk2vT-1686298555223)(mdpic/p7.PNG)]

说明客户端和服务器都配置成功,接下来需要验证客户端是否能够实现SSO效果

在tomcat的webapps中将客户端代码demo复制一份,起名为demo1,并修改web.xml中的demo为demo1

重启tomcat

在浏览器中打开:http://localhost:8080/demo,并开启一个新的标签页打开另一个项目:http://localhost:8080/demo1

发现都会出现上图的登录页面,在其中一个登录页面使用用户名casuser和密码Mellon进行登录,会跳转到项目的首页,然后在另一个标签中刷新,发现不用再次登录也会跳转到首页,说明单点登录效果成功。

4.3 使用springboot集成CAS客户端

接下来搭建springboot项目的客户端1

在新建的springboot项目的pom.xml添加如下依赖(匹配对应的版本)

<dependency>
    <groupId>net.unicon.cas</groupId>
    <artifactId>cas-client-autoconfig-support</artifactId>
    <version>2.1.0-GA</version>
</dependency>

修改application.properties文件

server.port=8088
#cas服务端的地址
cas.server-url-prefix=http://localhost:8080/cas
#cas服务端的登录地址
cas.server-login-url=http://localhost:8080/cas/login
#当前服务器的地址(客户端)
cas.client-host-url=http://localhost:8088
#Ticket校验器使用Cas30ProxyReceivingTicketValidationFilter
cas.validation-type=cas3

修改Application类,添加注解@EnableCasClient

@EnableCasClient
@SpringBootApplication
public class TestcasApplication {
	public static void main(String[] args) {
		SpringApplication.run(TestcasApplication.class, args);
	}
}

创建一个测试类

@RestController
public class CasController {
    @RequestMapping("/")
    public String hello(){
        return "hello, cas";
    }
}

打开浏览器启动http://localhost:8088,也会出现登录页面,可以跟前面的客户端一起测试效果

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

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

相关文章

十二、进程间通信

目录 目录 零、前置知识 一、什么是进程间通信 &#xff08;一&#xff09;含义 &#xff08;二&#xff09;发展 &#xff08;三&#xff09;类型 1.管道 2.System V IPC 3.POSIX IPC 二、为什么要有进程间通信 三、怎么进行进程间通信 &#xff08;一&#xff09;…

Snipaste工具推荐

Snipaste Snipaste 不只是截图&#xff0c;善用贴图功能将帮助你提升工作效率&#xff01; 新用户&#xff1f; 截图默认为 F1&#xff0c;贴图为 F3&#xff0c;然后请对照着 快捷键列表 按一遍&#xff0c;体会它们的用法&#xff0c;就入门啦&#xff01; 遇到了麻烦&…

Java通过Ip2region实现IP定位

我们在一些短视频平台上可以看到,视频作者或评论区可以显示IP地址,这其实就是根据IP获取到的我们可以通过一些在线网站就可以看到我们当前的公网IP和IP定位,最近有个需求也需要通过请求获取客户端的IP和IP的定位,于是通过一系列的百度,最终选择使用Ip2region这个工具库来进行定…

flutter的自定义系列雷达图

自定义是flutter进阶中不可缺少的ui层知识点&#xff0c;这里我们来总结下&#xff1a; 在Flutter中&#xff0c;自定义绘制通常是通过使用CustomPaint和CustomPainter来实现的。 创建CustomPaint组件 首先&#xff0c;需要创建一个CustomPaint组件。CustomPaint是一个Widge…

MobPush 厂商通道申请指南

华为厂商申请 创建应用 登录华为开发者联盟&#xff0c;注册您的应用&#xff0c;在应用信息中获取APP ID和Client Secret 配置SHA256证书指纹 在华为开发者联盟配置SHA256证书指纹。获取及配置请参见华为官方文档配置AppGallery Connect 设置消息回执 集成华为厂商通道SDK…

带你了解二进制

目录 视频参考&#xff1a; 讲解&#xff1a;​编辑 运算&#xff1a; 1001&#xff08;二进制&#xff09; 9&#xff08;十位数&#xff09;1111&#xff08;二进制&#xff09; 15&#xff08;十位数&#xff09;11001&#xff08;二进制&#xff09; 25&#xff08;…

第二章 搭建TS环境

搭建 TypeScript 的开发环境。一个舒适、便捷且顺手的开发环境&#xff0c;不仅能大大提高学习效率&#xff0c;也会对我们日常的开发工作有很大帮助。 这一节我们就来介绍 VS Code 下的 TypeScript 环境搭建&#xff1a;插件以及配置项。对于 TS 文件的执行&#xff0c;我们会…

设计模式(十):结构型之外观模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

备战2月面试8家大厂,成功上岸字节(Java岗)定级T2-2,分享一下我的面试心得

最近在公众号上看到一位道友的字节面经&#xff0c;可以说是深有感触了&#xff01; 他的背景是杭州某中厂的Java后端开发&#xff0c;本科毕业5年&#xff0c;最近2个月面试了PDD、小红书、字节等多个大厂。几乎都拿到了Offer&#xff0c;最终选择了字节2-2。以下是他的一些分…

Navicat对postgresql导入导出的坑

Navicat导出postgresql中的表&#xff0c;再新建数据库导入时通常会报错&#xff0c;往往是因为自增id导致的 可以看到&#xff0c;再次导入时会报错&#xff01; 解决办法如下&#xff1a; 解决办法&#xff1a; 重新导入&#xff0c;并执行以下命令&#xff1a;&#xff08…

Python从入门到精通_第0讲_Python的学习路线整理

写在最前&#xff1a; 为什么开这个专栏&#xff1a; 之前我做过一个专栏&#xff0c;专门介绍Python爬虫技术&#xff0c;这一专栏收获了很多朋友们的点赞收藏和关注。但是在爬虫技术专栏中&#xff0c;对于Python语言本身的讲解并不是很细致&#xff0c;由于Python在爬虫、数…

Unity 安装 wwise

先下载 https://www.audiokinetic.com/zh/download 安装的时候要选sdk 就是20g的那个 然后运行 选择unity 可以看到这个界面 好&#xff0c;现在开始要安装离线包 直接项目里点 第二个 装好后 他会提示你 无法找到unity安装的地址 1 打开你的 unity 编辑器 2 在unity安装的…

CorelDRAW矢量绘图2023中文版下载

市面上的矢量绘图工具虽然很多&#xff0c;但权威又专业的却不多&#xff0c;选到不好用的工具&#xff0c;会极大的影响自己创作&#xff0c;CorelDRAW简称cdr&#xff0c;是一款功能强大的矢量图制作软件&#xff0c;一说到矢量图制作&#xff0c;大家都会不由自主地想到cdr。…

车牌识别之UI(Tkinter + OpenCV显示Picture和Video)

画一张总图&#xff1a; 图形界面开发 本篇只介绍图形界面开发。 遇到的第一个问题就是选择什么开发语言和技术。因为我之前用Python做过Tkinter的小东西&#xff0c;所以这次还是用Python Tkinter OpenCV来搞吧。 这里面需要注意几个地方&#xff1a; 1. Tkinter 的布局 …

ADManager Plus:提升企业人员管理效率的全能工具

导言&#xff1a; 在现代企业中&#xff0c;高效的人员管理是取得成功的关键。随着企业规模的扩大和人员数量的增加&#xff0c;传统的人工管理方法已经无法满足快速变化的需求。ADManager Plus作为一款全能的人员管理工具&#xff0c;通过自动化和集成的方式&#xff0c;为企…

一文即可了解!自动化回归测试工具

目录 前言&#xff1a; 设计背景&#xff1a; 解决方案&#xff1a; 测试工具使用loadrunner脚本编写&#xff0c;这样的好处是 控制指令说明&#xff1a; 自定义检查方法说明&#xff1a; 变量说明&#xff1a; 附加动作说明&#xff1a; 前言&#xff1a; 自动化回归测试工…

Numpy---ndarray矩阵运算、广播机制、排序、文件操作

1. 矩阵运算 n 10 # 加 n - 10 # 减 n * 10 # 乘 n / 10 # 除 n // 2 # 整除 n ** 2 # 次方 n % 2 # 余数 n1 np.random.randint(0, 10, size(4, 5)) n2 np.random.randint(0, 10, size(4, 5)) display(n1, n2) array([[3, 6, 1, 9, 9],[8, 9, 2, 0, 4],[4, 8, 5, …

17 条件随机场

文章目录 17 条件随机场——CRF&#xff08;Condition Random Field&#xff09;17.1 背景介绍17.2 HMM与MEMM的区别17.3 MEMM与CRF的区别17.4 CRF模型17.4.1 CRF的概率密度函数17.4.2 CRF概率密度函数简化&#xff08;向量形式&#xff09; 17.5 CRF需要解决的问题17.6 边缘概…

基于 AIGC,RocketMQ 学习社区探索开源软件学习新范式

作者&#xff1a;寒斜 AIGC 持续火爆全球&#xff0c;越来越多的场景开始接入并体现非凡的价值。其中应用广泛的场景之一就是智能知识问答&#xff0c;它改变了人们学习的方式&#xff0c;从阅读式到问答式&#xff0c;让知识的获取更加精准有效。开源软件拥有着广泛的求知群体…

ITSM 如何帮助制造业企业

ITSM在现代制造业中的作用 在过去的几年中&#xff0c;制造业已经看到了快速的数字化&#xff0c;以智能制造技术改进生产技术。在工业4.0和工业5.0的推动下&#xff0c;制造商正在摆脱陈旧 以及利用物联网、人工智能、机器学习和大数据等先进技术的互联智能制造系统&#xff…