单点登录原理及代码实现

article/2025/9/21 10:36:53

   这次废话少说,直接扔干货,自己也是刚刚学习的单点登录,如有问题,还请评论进行一起探讨。

一、单系统登录机制

1、http无状态协议

   web应用采用的B/S架构,http作为通信协议。由于http本身是无状态协议,不存储任何登录信息,所以每次登录系统服务器之间都无任何关联,服务器都会进行独立处理操作。从网上盗个图来给大家进行解释下,下图将进行这个过程说明:在这里插入图片描述   这也就意味着任何用户都可以进行访问服务器资源,如果想进行保护服务器的资源,那么就需要进行限制对服务器的请求;要想限制对服务器的请求,那么就需要进行鉴别服务器的请求,响应合法请求,忽略非法请求;要想进行鉴别是否合法请求,那么就需要清楚浏览器的状态。由于http协议无状态,那么就需要浏览器和服务器进行共同维护一个状态,这就是会话机制。

2、会话机制

   当浏览器第一次进行请求服务器时,服务器会创建一个会话,并将会话id作为响应浏览器的一部分,浏览器并且会存储这个会话id;当浏览器进行第二次第三次第n次进行访问浏览器时,请求上会带上会话id,服务器得到会话id时会进行判断是不是同一个用户,后续请求就会和第一次产生了关联;下图就会进行说明:在这里插入图片描述   服务器将在内存中进行保存会话id,那么浏览器中将在哪里保存呢,它有两种:
   1、在请求参数中进行保存会话id
   2、在cookie中进行保存
   将会话id作为每一个请求的参数,服务器接收请求并且能进行解析获得会话id,来进行判断是否是同一用户,很明显的可以看出这种方式不安全。那就用浏览器自身来进行维护会话id,每发一次请求时都进行自动发送会话id,cookie机制正好可以来做这件事,cookie本身就是一种来进行存储少量数据的机制,数据以“key/value”键值对来进行存储,浏览器请求时自动带上cookie信息。
   Tomcat会话机制当然也实现了cookie,访问tomcat服务器时,浏览器中会看到一个名为“JSESSIONID”的cookie,这个就是浏览器维护的会话id,如图所示:在这里插入图片描述   

3、登录状态

   刚刚学习了会话机制,那么登录状态就很容易明白,我们当浏览器第一次请求时,输入用户名和密码,会将用户名和密码拿去跟数据库进行比较,比较正确的话,将记录为合法用户,否则记录为非法用户,合法用户将进行标记为“已授权”或“已登录”等状态,既然是会话状态,那么自然保存在会话对象中,tomcat会话在会话对象中设置登录状态如下:

HttpSession session = request.getSession();
session.setAttribute("isLogin", true);

   用户再次登录时,tomcat将在会话对象中查看会话对象:

HttpSession session = request.getSession();
session.getAttribute("isLogin");

二、多系统的复杂性

   随着时代的进步,单系统时代已经成为了历史,现如今已经发展成为了复杂的多系统组成的应用群,面对如此多的子系统,当用户登录和退出的时候,难道需要一个一个的登录和退出吗,这种方式肯定是不可取的。如下图所示:在这里插入图片描述   web系统已经由单系统发展成为复杂的多系统应用群,这个复杂性应该由系统内部承担,而非用户进行承担复杂性。无论系统拥有多么多的子系统多么复杂,对用户来说都是一个整体,也就是说,用户访问web系统应用群应该像访问单系统一样,进行登录和退出一次就行。在这里插入图片描述   单系统解决方案核心是cookie,cookie携带的会话id在浏览器和服务器之间维护会话状态,但是cookie是有限制的,这个限制就是域(通常对应网站的域名)的问题,浏览器发送http请求时会自动携带与该域匹配的cookie,并不是所有的cookie在这里插入图片描述   也许此时你们会说,可以使用一个共同的顶级域,也就是全部将域名设置成“*.baidu.com”,这种方法理论上可以的,甚至在早期有一些应用群都是这样解决的,但是实际中并不好,首先域名要进行统一,然后应用群要使用的技术都一致,要相同,不然cookie的key不相同,无法维持会话,并且无法实现宽平台语言的开发;第三:cookie本身是不安全的。
   因此,需要单点登录来进行解决。

三、单点登录

   单点登录的全称为Single Sign On(简称SSO),单点登录就是在多系统集群的情况下只需要进行登录其中一个系统,那么其他系统就可以得到授权无需再次登录,包括单点登录和单点注销两个部分。
   相比较与单系统来说,SSO需要一个独立的认证中心,只有认证中心能够接受用户名和密码等安全信息,其他系统将不再提供注册登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,认证中心判断是合法的用户会创建令牌,在接下来跳转的过程中,认证中心会将令牌作为参数发送给各个系统,子系统拿到令牌,即得到授权,可以借此创建局部会话,局部会话登录方式和单系统的登录方式相同。这也就是单点登录系统的原理,如图所示:在这里插入图片描述   下面对上图进行分析解释:

  1. 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
  2. sso认证中心发现用户未登录,将用户引导至登录页面
  3. 用户输入用户名密码提交登录申请
  4. sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌
  5. sso认证中心带着令牌跳转会最初的请求地址(系统1)
  6. 系统1拿到令牌,去sso认证中心校验令牌是否有效
  7. sso认证中心校验令牌,返回有效,注册系统1
  8. 系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源
  9. 用户访问系统2的受保护资源
  10. 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
  11. sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌
  12. 系统2拿到令牌,去sso认证中心校验令牌是否有效
  13. sso认证中心校验令牌,返回有效,注册系统2
  14. 系统2使用该令牌创建与用户的局部会话,返回受保护资源

   当用户登录成功时,会与SSO认证中心及各个子系统建立会话,用户与SSO认证中心建立的会话俗称为全局会话,用户与各个子系统创建的会话称为局部会话,局部会话创建后,用户可以访问子系统的受保护的资源,通过sso认证中心,全局会话和局部会话有如下关系:

  1. 局部会话存在,那么全局会话一定存在
  2. 全局会话存在,局部会话不一定存在
  3. 全局会话销毁,局部会话一定销毁

2、 注销

   单点登录自然需要单点注销。一个系统进行注销,那么所有系统都将进行注销。下图将进行说明:在这里插入图片描述   SSO认证中心一直监听全局会话状态,一旦全局会话销毁,那么监听器将通知所有注册系统执行注销操作。
   下面将上图进行解释说明:

  1. 用户向系统1发起注销请求
  2. 系统1根据用户与系统1建立的会话id拿到令牌,向sso认证中心发起注销请求
  3. sso认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的系统地址
  4. sso认证中心向所有注册系统发起注销请求
  5. 各注册系统接收sso认证中心的注销请求,销毁局部会话
  6. sso认证中心引导用户至登录页面

四、部署图

   单点登录涉及sso认证中心与众子系统,子系统与sso认证中心需要通信以交换令牌、校验令牌及发起注销请求,因而子系统必须集成sso的客户端,sso认证中心则是sso服务端,整个单点登录过程实质是sso客户端与服务端通信的过程,用下图描述在这里插入图片描述

五、实现

1、总体描述

   我先总体介绍下我所实现的内容,这个应用群中包含有四个系统,分别为登录系统,主页系统,VIP系统和购物车系统。大致思路为:用户访问任意一个系统受保护资源时,会进行判断是否有访问令牌(是否登录),如果登录了则允许访问,如果未登录则直接拦截进行跳转至登录页面,进行登录,然后输入用户名和密码进行验证,如果正确,则生成令牌,分发给各个子系统,然后会进行跳转到刚刚用户所在的系统,然后验证其令牌,如果令牌正确,则可以进行访问受保护的系统资源。代码大致如下,创建的工程为gradle工程,使用的是template,大家也可以改成maven工程和前后端分离的项目。在这里插入图片描述
   gradle的配置代码如下所示:
在这里插入图片描述

buildscript {repositories {mavenLocal()mavenCentral()}ext{springBootVersion = '2.1.3.RELEASE'}dependencies {classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"}}subprojects {group 'com.sso'version '1.0-SNAPSHOT'apply plugin: 'java'apply plugin: 'io.spring.dependency-management'apply plugin: 'org.springframework.boot'repositories {mavenLocal()mavenCentral()}dependencies {compile 'org.springframework.boot:spring-boot-starter-web'annotationProcessor 'org.projectlombok:lombok:1.18.2'compileOnly 'org.projectlombok:lombok:1.18.2'compile 'org.springframework.boot:spring-boot-starter-thymeleaf'}
}

2、登录系统(sso-login)

在这里插入图片描述LoginController.java代码如下图所示:
   注意:此代码未进入数据库,模拟数据和进行验证,此子系统端口号为9000,记得在yml中进行配置端口号。

package com.sso.login.controller;import com.sso.login.utils.LoginCacheUtil;
import com.sso.pojo.User;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;/*** @Author: 闫高岭同志* @Date: 2020/9/13  21:45* @Version 1.0*/
@Controller
@RequestMapping("/login")
public class LoginController {//模拟用户数据private static Set<User> dbUsers;static {dbUsers = new HashSet<>();dbUsers.add(new User(0,"zhangsan","zhangsan"));dbUsers.add(new User(1,"lisi","lisi"));dbUsers.add(new User(2,"wangwu","wangwu"));}@PostMappingpublic String doLogin(User user , HttpSession session , HttpServletResponse response){System.out.println("4444444:"+user);//记录从哪个页面跳转的网址String target = (String) session.getAttribute("target");//模拟从数据库中通过登录的用户名和密码去查找数据库中的用户Optional<User> first = dbUsers.stream().filter(dbUser -> dbUser.getUsername().equals(user.getUsername()) &&dbUser.getPassword().equals(user.getPassword())).findFirst();//判断用户是否登录if (first.isPresent()){//保存用户登录信息//随机生成token,也就是令牌String token = UUID.randomUUID().toString();Cookie cookie = new Cookie("TOKEN", token);//解决跨域问题,注意127.0.0.1地址映射问题cookie.setDomain("codeshop.com");response.addCookie(cookie);//将信息存储在loginUser中LoginCacheUtil.loginUser.put(token,first.get());}else {//登录失败session.setAttribute("msg","用户名或密码错误");return "login";}//重定向到target地址return "redirect:"+target;}@GetMapping("info")@ResponseBodypublic ResponseEntity<User> getUserInfo(String token){if (!StringUtils.isEmpty(token)){User user = LoginCacheUtil.loginUser.get(token);return ResponseEntity.ok(user);}else {return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);}}
}

ViewController.java代码入下图所示:

package com.sso.login.controller;import com.sso.login.utils.LoginCacheUtil;
import com.sso.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession;/*** @Author: 闫高岭同志* @Date: 2020/9/13  21:48* @Version 1.0*/
//页面跳转逻辑
@Controller
@RequestMapping("/view")
public class ViewController {/*** 跳转到登录页面* @return*/@GetMapping("/login")//target可能为空,用@RequestParam注解去设置,cookie也是这种情况private String toLogin(@RequestParam(required = false,defaultValue = "") String target, HttpSession session, @CookieValue(required = false,value = "TOKEN") Cookie cookie){//如果target为空,则设置成主页网址,最后往主页进行跳转if (StringUtils.isEmpty(target)){target = "http://www.codeshop.com:9010";}if (cookie != null){//如果是已经登录的用户再次访问登录系统时,就要重定向String value = cookie.getValue();User user = LoginCacheUtil.loginUser.get(value);if (user != null){return "redirect:"+target;}}//重定向地址session.setAttribute("target",target);return "login";}
}

工具类如图所示:
在这里插入图片描述登录子系统启动类:
在这里插入图片描述user.java实体类如图所示:
在这里插入图片描述登录页面HTML如图所示:
在这里插入图片描述

2、主页面系统(sso-main)

主页面系统总架构:
   端口号是9010,记得到配置文件中进行更改哦!
在这里插入图片描述ViewController.java代码如图所示:

package com.sso.main.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession;
import java.util.Map;/*** @Author: 闫高岭同志* @Date: 2020/10/12  11:13* @Version 1.0*/
@Controller
@RequestMapping("/view")
public class ViewController {@Autowiredprivate RestTemplate restTemplate;private final String LOGIN_INFO_ADDRESS = "http://login.codeshop.com:9000/login/info?token=";@GetMapping("/index")public String toIndex(@CookieValue(required = false ,value = "TOKEN")Cookie cookie, HttpSession session){if (cookie != null){String token = cookie.getValue();//判断是否登录if (!StringUtils.isEmpty(token)){//取出登录用户且且存入进sessionMap result = restTemplate.getForObject(LOGIN_INFO_ADDRESS + token, Map.class);session.setAttribute("loginUser",result);}}return "index";}
}

启动类代码如图所示:
   注意这里采用的是Spring中的RestTemplate模板类,大家可以自行百度。

在这里插入图片描述主页面显示如下图所示:
在这里插入图片描述

3、VIP系统

系统总体架构如图所示:
   子系统端口号为9011,记得在配置文件更改哦。
在这里插入图片描述viewController.java代码如图所示:

package com.sso.vip.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession;
import java.util.Map;/*** @Author: 闫高岭同志* @Date: 2020/10/12  11:22* @Version 1.0*/
@Controller
@RequestMapping("/view")
public class ViewController {@Autowiredprotected RestTemplate restTemplate;private final String USER_INFO_ADDRESS = "http://login.codeshop.com:9000/login/info?token=";@GetMapping("/index")public String toIndex(@CookieValue(required = false,value = "TOKEN") Cookie cookie,HttpSession session) {if (cookie != null){String token = cookie.getValue();if (!StringUtils.isEmpty(token)){Map result = restTemplate.getForObject(USER_INFO_ADDRESS + token, Map.class);session.setAttribute("loginUser",result);}}return "index";}
}

启动类(vipapp.java)如图所示:

package com.sso.vip;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;/*** @Author: 闫高岭同志* @Date: 2020/10/12  11:20* @Version 1.0*/
@SpringBootApplication
public class VipApp {public static void main(String[] args) {SpringApplication.run(VipApp.class,args);}@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}

index.html页面如图所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head><meta charset="UTF-8"><title>Vip</title>
</head>
<body><h1>欢迎来到VIP系统</h1><span><a th:if="${session.loginUser == null}" href="http://login.codeshop.com:9000/view/login?target=http://vip.codeshop.com:9011/view/index">登录</a><a th:if="${session.loginUser != null}" href="#">退出</a></span><p th:unless="${session.loginUser == null}"><span style="color : red;" th:text="${session.loginUser.username}">已登录</span></p>
</body>
</html>

4、购物车系统(sso-cart)

   总体概括如下图所示:
在这里插入图片描述viewController.java如图所示:

package com.sso.cart.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession;
import java.util.Map;/*** @Author: 闫高岭同志* @Date: 2020/10/12  11:32* @Version 1.0*/
@Controller
@RequestMapping("view")
public class ViewController {@Autowiredprotected RestTemplate restTemplate;private final String USER_INFO_ADDRESS = "http://login.codeshop.com:9000/login/info?token=";@GetMapping("index")public String toIndex(@CookieValue(required = false,value = "TOKEN") Cookie cookie,HttpSession session){if (cookie != null){String token = cookie.getValue();if (!StringUtils.isEmpty(token)){Map result = restTemplate.getForObject(USER_INFO_ADDRESS+token, Map.class);session.setAttribute("loginUser",result);}}return "index";}
}

CartApp.java启动类如下图所示:

package com.sso.cart;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;/*** @Author: 闫高岭同志* @Date: 2020/10/12  11:24* @Version 1.0*/
@SpringBootApplication
public class CartApp {public static void main(String[] args) {SpringApplication.run(CartApp.class,args);}@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}

cart页面(index.html)如图所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head><meta charset="UTF-8"><title>Cart</title>
</head>
<body><h1>欢迎来到Cart页面</h1><span><a th:if="${session.loginUser == null}" href="http://login.codeshop.com:9000/view/login?target=http://cart.codeshop.com:9012/view/index">登录</a><a th:if="${session.loginUser != null}" href="#">退出</a></span><p th:unless="${session.loginUser == null}"><span style="color : red;" th:text="${session.loginUser.username}"></span>已登录</p>
</body>
</html>

好的,单点登录到此结束,单点退出还没实现,后期有时间的话会进行实现单点退出,思路也就是销毁cookie就行,大家可以先进行试试。
与人方便,与己方便
加油,奥利给


http://chatgpt.dhexx.cn/article/GV1YnsRj.shtml

相关文章

单点登录(原理与代码)

文章目录 一、单点登录简介SSO 原理&#xff08;单点登录的过程&#xff09;SSO 实现技术SSO 常见方案 二、手写单点登录系统架构&#xff08;代码篇&#xff09;三、单点登录详介&#xff08;原理篇&#xff09;1.登录2.注销单点登陆的具体实现:1.sso-client拦截未登录请求2.s…

单点登录设计原理

本文以某新闻单位多媒体数据库系统为例&#xff0c;提出建立企业用户认证中心&#xff0c;实现基于安全策略的统一用户管理、认证和单点登录&#xff0c;解决用户在同时使用多个应用系统时所遇到的重复登录问题。 随着信息技术和网络技术的迅猛发展&#xff0c;企业内部的应用…

单点登录SSO的原理

思考: web系统早已从久远的单系统发展成为如今由多系统组成的应用群&#xff0c;面对如此众多的系统&#xff0c;用户难道要一个一个登录、然后一个一个注销吗&#xff1f; 当然不是,web系统由单系统发展成多系统组成的应用群&#xff0c;复杂性应该由系统内部承担&#xff0c…

单点登录原理与代码实现

GitHub&#xff1a;https://github.com/sheefee/simple-sso 一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构&#xff0c;http作为通信协议。http是无状态协议&#xff0c;浏览器的每一次请求&#xff0c;服务器会独立处理&#xff0c;不与之前或之后的…

单点登录的实现原理

转自&#xff1a;https://www.cnblogs.com/UliiAn/p/3803042.html https://blog.csdn.net/javaloveiphone/article/details/52439613 单点登录在现在的系统架构中广泛存在&#xff0c;他将多个子系统的认证体系打通&#xff0c;实现了一个入口多处使用&#xff0c;而在架构单…

单点登录原理与实现

用 10 张图给你说明白单点登录原理与实现 欢迎来到&#xff0c;德莱联盟&#xff01; 今天盟主给你们讲一讲单点登录&#xff0c;还有它的具体实现。 一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构&#xff0c;http作为通信协议。http是无状态协议&…

什么是单点登录?如何实现?

一、是什么 单点登录&#xff08;Single Sign On&#xff09;&#xff0c;简称为 SSO&#xff0c;是目前比较流行的企业业务整合的解决方案之一 SSO的定义是在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统 SSO 一般都需要一个独立的认证中…

SSO单点登录原理详解

本文主要对SSO单点登录与CAS、OAuth2.0两种授权协议的关系和原理进行详细说明。 1. 基础概念 术语解释 SSO&#xff0d;Single Sign On&#xff0c;单点登录 TGT&#xff0d;Ticket Granting Ticket&#xff0c;用户身份认证凭证票据 ST&#xff0d;Service Ticket&#xf…

10.单点登录原理及JWT实现

单点登录原理及JWT实现 一、单点登录效果 首先我们看通过一个具体的案例来加深对单点登录的理解。案例地址&#xff1a;https://gitee.com/xuxueli0323/xxl-sso?_fromgitee_search 把案例代码直接导入到IDEA中 然后分别修改下server和samples中的配置信息 在host文件中配置 …

单点登录SSO的实现原理

单点登录SSO&#xff08;Single Sign On&#xff09;说得简单点就是在一个多系统共存的环境下&#xff0c;用户在一处登录后&#xff0c;就不用在其他系统中登录&#xff0c;也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁&#xff0c;例如…

单点登录原理及实现

一&#xff0c;背景 单点登录顾名思义就是在多个应用系统中&#xff0c;只需要登录一次&#xff0c;就可以访问其他相互信任的应用系统&#xff0c;免除多次登录的烦恼。比如我们登录了百度账号&#xff0c;再去百度百科&#xff0c;百度文库就不需要再次登录了。 二&#xf…

CGAL:学习CGAL

背景 CGAL是一个非常有用的库&#xff0c;但是学习起来非常痛苦。为此&#xff0c;我们计划通过一些小的demo&#xff0c;逐渐学习CGAL的使用方法。目前&#xff0c;由于我们还缺少对CGAL的整体把握&#xff0c;所以demo没有连贯性&#xff0c;且难度飘忽不定。不过随着我们的…

CGAL例程:点云数据三维重建

作者&#xff1a;西蒙吉罗多 链接&#xff1a;CGAL 5.4 - Manual: Surface Reconstruction from Point Cloudshttps://doc.cgal.org/latest/Manual/tuto_reconstruction.html 目录 2 我应该使用哪种算法&#xff1f; 3 管道概览 4 读取点云数据 5 点云预处理 5.1 异常值…

CGAL编译与配置

从来没有自己编译过第三方库&#xff0c;每次看到cmake上那些红色的错误就头疼&#xff0c;从来都是伸手党&#xff0c;不过这次没有要到编译好的CGAL&#xff0c;只能硬着头皮自己来。当编译完看到自己的例子跑通&#xff0c;才发现并没有想象中的复杂。 (此方法在win7和win1…

CGAL的使用

1 C++类的知识 因为CGAL是用C++实现的,所以需要先了解一下C++编程。C++是面向对象的编程,这也是C++对C语言改进的最重要的部分。C++也被叫做是"带类的 C"。简单讲一下类的构成,成员函数以及对象的定义和使用。 1.1 C++类的构成 首先从C的结构体说起。C中的结构体我想…

cgal配置以及一些资料

Win7下VS2008编译CGAL3.9 &#xff08;转&#xff1a;http://blog.csdn.net/wsh6759/article/details/6977847&#xff09; CGAL是比较经典的计算几何库&#xff0c;算法经典&#xff0c;稳定高效。 本文介绍编译CGAl情况&#xff0c; 前期准备&#xff1a; BOOST&#x…

CGAL学习记录

CGAL学习记录 前言CGAL 介绍CGAL Linux安装CGAL Windos安装CGAL 安装错误及解决办法CGAL 安装后测试CGAL I/O读写 FunctionsCGAL OFF数据格式CGAL OFF STL相互转换CGAL 表面细化CGAL 表面平滑CGAL 表面补洞CGAL 自相交检测CGAL 提取中心线 前言 原先使用vtk有些小地方不是很理…

CGAL Cookbook --CGAL简介

##前言 ## 接触CGAL已经有半年了&#xff0c;从最初的厌恶&#xff08;对于一个初学者来说&#xff0c;CGAL确实有点难度&#xff0c;它要求初学者有一定基础&#xff09;到后来的喜欢。现在觉得CGAL简直完美极了&#xff0c;虽然它存在一些BUG但是这并不妨碍我爱上CGAL。它的…

[CGAL] CGAL的编译与使用

文章目录 方法一&#xff1a;自己安装依赖库安装Boost安装CGAL安装Qt编译示例在VS中使用CGAL库引用boost引用gmp引用CGALHelloworld 报错处理在cmake配置时报错&#xff1a;未能找到Boost编译示例&#xff0c;未找到GMP编译Mesh_3例子报错&#xff1a;未能找到Eigen3编译demo/P…

CGAL学习之路(三):CGAL读写点云

文章目录 1 CGAL创建点云1.1 insert方式1.2 迭代器方式 2 CGAL读点云2.1 读取XYZ点云2.2 读取PLY点云2.3 ifstream读取XYZ \ PLY点云 3 CGAL输出点坐标3.1 输出点云所有坐标3.2 输出某一点的坐标3.3 输出XYZ坐标 4 CGAL保存点云&#xff08;XYZ | PLY&#xff09;5 添加法向量字…