VUE+php跨域session问题

本文深入探讨VUE与PHP跨域环境下Session与Cookie的处理方式,解析浏览器自动处理Cookie机制,以及如何通过配置允许跨域请求携带Cookie,确保身份认证信息正确传递。

VUE+php跨域session问题

闲来无事,公司又处于下滑期,于是就自学了vue.js,但是作为初学者,遇到很多问题,这里要感谢我的Big Brother @Dires.t帮助我许多,因此解决了问题,好了言归正传!

cookie

首先必须明确一点,存储cookie是浏览器提供的功能。cookie 其实是存储在浏览器中的纯文本,浏览器的安装目录下会专门有一个 cookie 文件夹来存放各个域下设置的cookie。

当网页要发http请求时,浏览器会先检查是否有相应的cookie,有则自动添加在request header中的cookie字段中。这些是浏览器自动帮我们做的,而且每一次http请求浏览器都会自动帮我们做。这个特点很重要,因为这关系到“什么样的数据适合存储在cookie中”。

存储在cookie中的数据,每次都会被浏览器自动放在http请求中,如果这些数据并不是每个请求都需要发给服务端的数据,浏览器这设置自动处理无疑增加了网络开销;但如果这些数据是每个请求都需要发给服务端的数据(比如身份认证信息),浏览器这设置自动处理就大大免去了重复添加操作。所以对于那设置“每次请求都要携带的信息(最典型的就是身份认证信息)”就特别适合放在cookie中,其他类型的数据就不适合了。

但在 localStorage 出现之前,cookie被滥用当做了存储工具。什么数据都放在cookie中,即使这些数据只在页面中使用而不需要随请求传送到服务端。当然cookie标准还是做了一些限制的:每个域名下的cookie 的大小最大为4KB,每个域名下的cookie数量最多为20个(但很多浏览器厂商在具体实现时支持大于20个)。

跨域请求中 cookie

默认情况下,在发生跨域时,cookie 作为一种凭据信息是不会被传送到服务端的。必须要进行额外设置才可以,这里给大家推荐一篇关于阮一峰的跨域资源共享 CORS 详解

php跨域session

session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。

session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。 但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。

当发生跨域请求使用session是,浏览器不会加上cookie,从而使服务器无法读取该cookie下对应的session;那么我们的PHP页面就需要加上:

header('Access-Control-Allow-Origin:http://127.0.0.1:8080');//表示接受http://127.0.0.1:8080的请求
header('Access-Control-Allow-Credentials:true');//表示是否允许发送Cookie

另一方面,开发者必须在AJAX请求中打开withCredentials属性

//jquery写法
$.ajax({
     data:param,
     url:url,
     type:"get",
     dataType: 'json',
     xhrFields:{
         withCredentials:true
     },
     success:function(res){
     	_this.spans = res;
     }
 })   
//axios写法
axios.post('http://101.132.138.141:8888/service/pageUsers', objectToForm({
        'currentPage': '1',
        'pageSize': '10',
        'token': '7e987daa-6c84-46d2-be26-f345dfaed8a7',
    }), {
        withCredentials: true
    })
    .then(function(res) {
    
    })
    .catch(function(err) {
    
    });

完结。。。。。

最后附上一些参考资料:
1、你真的会使用XMLHttpRequest吗?
2、跨域资源共享 CORS 详解

class Session { //mysql的主机地址 const db_host = "localhost"; //需要第三方指定ip地址 //数据库用户名 const db_user = "root"; //需要第三方指定自己的用户名 //数据库密码 const db_pwd = ""; //需要第三方指定自己的库据库密码 //数据库 const db_name = "thinkphp"; //需要第三方指定数据库 //数据库表 const db_table = "tbl_session"; //需要第三方指定数据表 //mysql-handle private $db_handle; //session-lifetime private $lifeTime; function open($savePath, $sessName) { // get session-lifetime $this--->lifeTime = get_cfg_var("session.gc_maxlifetime"); // open database-connection $db_handle = @mysql_connect(self::db_host, self::db_user, self::db_pwd); $dbSel = @mysql_select_db(self::db_name, $db_handle); // return success if(!$db_handle || !$dbSel) return false; $this->db_handle = $db_handle; return true; } function close() { $this->gc(ini_get('session.gc_maxlifetime')); // close database-connection return @mysql_close($this->db_handle); } function read($sessID) { // fetch session-data $res = @mysql_query("SELECT session_data AS d FROM ".self::db_table." WHERE session_id = '$sessID' AND session_expires > ".time(), $this->db_handle); // return data or an empty string at failure if($row = @mysql_fetch_assoc($res)) return $row['d']; return ""; } function write($sessID, $sessData) { // new session-expire-time $newExp = time() + $this->lifeTime; // is a session with this id in the database? $res = @mysql_query("SELECT * FROM ".self::db_table." WHERE session_id = '$sessID'", $this->db_handle); // if yes, if(@mysql_num_rows($res)) { // ...update session-data @mysql_query("UPDATE ".self::db_table." SET session_expires = '$newExp', session_data = '$sessData' WHERE session_id = '$sessID'", $this->db_handle); // if something happened, return true if(@mysql_affected_rows($this->db_handle)) return true; } else // if no session-data was found, { // create a new row @mysql_query("INSERT INTO ".self::db_table." ( session_id, session_expires, session_data) VALUES( '$sessID', '$newExp', '$sessData')", $this->db_handle); // if row was created, return true if(@mysql_affected_rows($this->db_handle)) return true; } // an unknown error occured return false; }
<think>好的,我现在需要帮助用户找到一个与SuiteCRM类似,但使用Vue.js和Java技术栈的解决方案或框架。用户之前询问了SuiteCRM的技术栈,现在希望寻找类似的组合,但使用Vue和Java。首先,我需要回顾SuiteCRM的技术特点,然后分析Vue和Java的常见组合,看看有哪些框架或项目符合要求。 SuiteCRM主要基于PHP,后端使用MySQL,前端使用传统的HTML/CSS/JavaScript,结合Smarty模板引擎,以及一些jQuery和Bootstrap。现在用户想要用Vue.js作为前端,Java作为后端,所以需要找到类似CRM系统,但技术栈换成了Vue和Java的组合。 首先,我应该考虑Java后端常用的框架,比如Spring Boot,这是Java领非常流行的后端框架,适合构建RESTful API。Vue.js作为前端框架,通常与Spring Boot结合使用,形成前后端分离的架构。这样的组合在现代Web开发中很常见,但具体是否有类似SuiteCRM的现成解决方案呢? 可能需要寻找开源或商业的CRM系统,使用Vue和Java开发。比如,查看GitHub上的项目,搜索关键词如“CRM Vue Java”或类似。根据用户提供的引用,用户可能已经看过一些项目,比如wikift,但wikift的开发语言是Java、TypeScript、JavaScript,可能前端用了Vue吗?不过用户提供的引用[1]提到wikift是Apache-2.0协议,但描述里没有明确是否使用Vue,可能需要进一步确认。此外,用户提到的v-charts是基于Vue2.0的图表组件,可能相关,但属于前端组件,不是完整的CRM系统。 另外,用户引用中提到Babel和TypeScript,可能是在强调前端构建工具,但这对寻找Java+Vue的CRM系统帮助不大。引用[3]是关于ABAP的,可能不相关,可以忽略。 接下来,我需要考虑是否有知名的开源CRM系统使用Vue和Java。如果没有现成的,可能需要组合不同的框架来构建。比如,使用Spring Boot作为后端,Vue作为前端,结合其他中间件如MySQL,Redis等,类似于SuiteCRM的架构但替换技术栈。 可能用户希望有一个完整的解决方案,而不仅仅是框架组合,所以需要推荐具体的项目或模板。例如,是否有基于Spring Boot和Vue的CRM系统?或者是否有类似的ERP/CRM开源项目? 另外,用户可能希望了解如何从零开始构建这样的系统,因此需要给出技术栈建议,包括前端、后端、数据库、部署工具等,类似于之前对SuiteCRM的详细分类。 需要注意的是,用户可能希望解决方案尽可能接近SuiteCRM的功能,如客户管理、销售自动化、营销工具等,因此需要确保推荐的框架或组合能够支持这些功能,或者有扩展性来实现。 总结可能的步骤: 1. 检查是否有现成的Vue+Java CRM系统。 2. 如果没有,推荐使用Spring Boot + Vue的前后端分离架构,构建类似SuiteCRM的系统。 3. 提供技术栈各层的具体建议,包括框架、工具、集成方式等。 4. 参考用户提供的引用,看是否有相关项目或工具可以整合,比如v-charts用于图表展示,Babel/TypeScript用于前端构建。 5. 确保回答结构清晰,分点说明,并附上相关问题,帮助用户进一步探索。</think>### Vue.js + Java 技术栈的类 SuiteCRM 解决方案 结合 Vue.js(前端)与 Java(后端)构建 CRM 系统,虽然没有完全对标 SuiteCRM 的现成开源产品,但可通过以下技术组合实现相似功能架构: --- #### 一、**推荐技术栈组合** | 层级 | 技术选型 | 对标 SuiteCRM 功能 | |---------------|--------------------------------------------------------------------------|----------------------------------------| | **前端框架** | Vue 3 + TypeScript | 动态交互界面(替换 jQuery/Smarty) | | **UI 组件库** | Element Plus / Ant Design Vue | 快速构建企业级界面(类似 Bootstrap) | | **状态管理** | Pinia | 复杂数据流管理(对标 PHP 业务逻辑层) | | **后端框架** | Spring Boot 3 + Jakarta EE | 高并发 API 服务(替代 PHP 核心) | | **ORM 层** | MyBatis-Plus / Hibernate | 数据库操作抽象(类似 SuiteCRM 的 SQL) | | **数据库** | PostgreSQL(ACID 兼容性优于 MySQL) | 关系型数据存储 | | **图表组件** | V-Charts(基于 ECharts 的 Vue 封装)[^1] | 数据可视化模块 | | **权限控制** | Spring Security + OAuth2 | 多角色权限系统 | | **工作流引擎**| Activiti / Flowable | 自动化流程管理 | --- #### 二、**可复用开源项目参考** 1. **JeeSite (Vue + Spring Boot)** - 企业级快速开发平台,内置权限管理和工作流模块 - 支持代码生成器,可快速定制 CRM 功能[^2] ```bash # 集成示例(pom.xml) <dependency> <groupId>com.jeesite</groupId> <artifactId>jeesite-module-crm</artifactId> <version>4.1.5</version> </dependency> ``` 2. **RuoYi-Vue** - 基于 Spring Boot + Vue 的权限管理系统 - 提供客户管理模块原型,支持动态表单扩展[^3] 3. **SmartAdmin (前端 Vue + 后端 Java)** - 包含 SaaS 多租户支持,适合构建定制化 CRM - 集成 Sentinel 实现接口级流量控制 --- #### 三、**关键架构设计建议** 1. **前后端分离** - 使用 OpenAPI 3.0 规范定义接口,配合 Swagger UI 实现实时文档 - 通过 JWT Token 实现认证(替代 SuiteCRM 的 Session 机制) 2. **模块化扩展** ```java // 自定义 CRM 模块示例(Spring Boot Starter) @Configuration public class CrmAutoConfiguration { @Bean public CustomerService customerService() { return new CustomerServiceImpl(); } } ``` 3. **性能优化** - 二级缓存:Redis 缓存热点数据(如客户信息) - 查询优化:MyBatis-Plus 分页插件 + 索引优化 - 异步处理:Spring @Async 注解处理批量操作 --- #### 四、**迁移 SuiteCRM 功能的实践路径** 1. **数据迁移** - 使用 Apache NiFi 将 MySQL 数据同步到 PostgreSQL - 转换 Smarty 模板为 Vue 单文件组件(.vue) 2. **功能对标开发** - 利用 BPMN 2.0 实现 SuiteCRM 的 Workflow 模块 - 通过 WebSocket 实现实时通知(替代 SugarCRM 的轮询机制) 3. **生态集成** - 使用 Spring Integration 对接 Zapier/Outlook - 集成 Elasticsearch 实现高级搜索功能 --- ### 相关问题 1. **如何评估 Vue + Spring Boot 技术栈在 CRM 场景下的性能瓶颈?** 2. **有哪些现成的开源组件可以直接复用于客户管理模块开发?** 3. **在微服务架构下如何设计 CRM 系统的模块拆分策略?** 4. **Java 后端如何实现 SuiteCRM 中的动态字段扩展功能?** [^1]: V-Charts 官方文档 - 图表配置指南 [^2]: JeeSite 社区版功能说明 [^3]: RuoYi 项目 GitHub 仓库最佳实践
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值