Java 前后端分离部署方式

当前前后端分离被广泛使用,如springboot,springcloud,react,vue 等;但是你会发现跨域请求很烦人。什么时候出现跨域?当前端和后端分别部署在不同端口的web服务器上时就会出现跨域;先来看一个例子

<script>
function login(){
	$.ajax({
		type : 'POST',
		url : 'http://192.168.1.100:8080/demo-app/login.do',
		dataType : 'text',
		success : function(result) {
			alert(result)
			window.location = "user.html";
		},
		error : function() {
			alert("出错了");
		}
	});	
}
</script>

前端和后端分别部署在8081和8080,因此前端请求后端,肯定是以http://xxx.xxx.xxx的方式请求。但是此时浏览器会报错

Access-Control-Allow-Origin就是跨域请求,由于浏览器的同源安全策略,只允许请求当前域的资源,而对其他域的资源表示不信任,例如:ajax请求地址(http://192.168.1.100:8080) 与当前打开的前端地址(http://192.168.1.100:8081)不一致,就会出现跨域请求报错;注意:http和https不一致也是属于跨域请求,如何解决?需要在前后端添加跨域代码

//前端以jquery为例
<script>
function login(){
	$.ajax({
		type : 'POST',
		url : 'http://192.168.1.100:8080/demo-app/login.do',
		xhrFields: {
			withCredentials: true //跨域时携带cookie
		},
		dataType : 'text',
		success : function(result) {
			alert(result)
			window.location = "user.html";
		},
		error : function() {
			alert("出错了");
		}
	});	
}
</script>
//后端以java代码为例
if("http://192.168.1.100:8081".equals(request.getHeader("Origin"))) { //如果请求源匹配则允许跨域
	response.setHeader("Access-Control-Allow-Origin", "http://192.168.1.100:8081"); //允许跨域
	response.setHeader("Access-Control-Allow-Credentials", "true"); //允许携带cookie
}


response.setHeader("Access-Control-Allow-Origin", "*"); //允许所有请求源跨域
//当Access-Control-Allow-Origin为*时,是不允许携带cookie的,
//即使设置了Access-Control-Allow-Credentials为true,浏览器也不会发送cookie

一般不建议使用这种方式跨域!那么该怎么配呢?

配置方式一:部署在同一个tomcat端口下

<script>
function login(){
	$.ajax({
		type : 'POST',
		url : '/demo-app/login.do',
		dataType : 'text',
		success : function(result) {
			window.location = "user.html";
		},
		error : function() {
			alert("出错了");
		}
	});	
}
</script>

由于是部署在同一端口下,url : '/demo-app/login.do' 这么写是完全没问题的,这是一个相对路径,最终请求会把当前前端访问地址http://192.168.1.100:8080/demo-web/login.html截取请求域(也就是http://192.168.1.100:8080),然后和url拼接在一起(http://192.168.1.100:8080/demo-app/login.do)进行请求,正好这个地址就是后端能够访问得到的地址,所以请求域相同(http://192.168.1.100:8080),就不是跨域,同时sessionid正常携带,请看下图

配置方式二:前端部署在nginx,后端部署在tomcat

#nginx配置
server {
    listen       3000;            #监听端口3000
    server_name  192.168.1.100;

    #前端部署在G盘上
    location  / {
        root G:/demo-web; 
    }

    #后端部署在tomcat8080端口上的
    location  /demo-app/ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.1.100:8080; 
    }
}
//前端代码
<script>
function login(){
	$.ajax({
		type : 'POST',
		url : '/demo-app/login.do',
		dataType : 'text',
		success : function(result) {
			alert(result)
			window.location = "user.html";
		},
		error : function() {
			alert("出错了");
		}
	});	
}
</script>

此时前端的访问地址为:http://192.168.1.100:3000/login.html 

 配置方式三:前端部署在tomcat,后端部署在tomcat,两个tomcat端口是不一样的

#nginx配置
server {
    listen       5000;               #监听端口5000
    server_name  192.168.1.100;

    #前端部署在tomcat8081端口
    location  /demo-web/ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.1.100:8081; 
    }

    #后端部署在tomcat8080端口
    location  /demo-app/ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.1.100:8080; 
    }
}
//前端代码
<script>
function login(){
	$.ajax({
		type : 'POST',
		url : '/demo-app/login.do',
		dataType : 'text',
		success : function(result) {
			alert(result)
			window.location = "user.html";
		},
		error : function() {
			alert("出错了");
		}
	});	
}
</script>

此时前端访问地址应使用nginx配置的http://192.168.1.100:5000/demo-web/login.html,报文就不演示了,肯定是可行的。

配置方式四:前端部署在tomcat,后端部署在tomcat,两个tomcat端口是不一样的,nginx配置跨域规则

#nginx配置
server {
    listen       7000;                #监听端口7000
    server_name  192.168.1.100;

    #后端部署在tomcat8080端口
    location  /demo-app/ {
        add_header 'Access-Control-Allow-Origin' 'http://192.168.1.100:8082';   #设置跨域请求源
        add_header 'Access-Control-Allow-Credentials' 'true';                   #允许携带cookie
        #对于json请求还需要添加其他配置,后续再说
        #https://www.cnblogs.com/dengpengbo/p/15171256.html
        #https://blog.csdn.net/dkmilk/article/details/106687987

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.1.100:8080; 
    }
}
//前端配置
<script>
function login(){
	$.ajax({
		type : 'POST',
		url : 'http://192.168.1.100:7000/demo-app/login.do', //这里设置nginx配置的地址
		dataType : 'text',
		xhrFields: {
			withCredentials: true     //携带cookie
		},
		success : function(result) {
			alert(result)
			window.location = "user.html";
		},
		error : function() {
			alert("出错了");
		}
	});	
}
</script>

此次前端访问地址为:http://192.168.1.100:8082/demo-web/login.html

参考资料:跨域资源共享 CORS 详解 - 阮一峰的网络日志

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java前后端分离是一种常见的架构模式,它将端和后端的开发分离,使得两者可以独立开发、测试和部署。以下是实现Java前后端分离的一般步骤: 1. 定义接口:首先,后端需要共同定义接口,即后端交互的数据格式和接口规范。可以使用类似Swagger的工具来定义和生成接口文档。 2. 端开发:端开发人员使用HTML、CSS和JavaScript等技术开发用户界面,通过Ajax或其他方式调用后端接口获取数据。 3. 后端开发后端开发人员使用Java等后端技术开发业务逻辑和数据处理部分,并提供RESTful API或其他方式的接口供端调用。 4. 接口对接:端通过调用后端提供的接口来获取数据或提交请求。可以使用类似Axios或Fetch等工具来发送HTTP请求。 5. 跨域处理:由于前后端分离时,端和后端可能运行在不同的域名或端口下,需要处理跨域请求。可以在后端配置允许跨域访问的设置,或使用反向代理服务器如Nginx进行跨域代理。 6. 测试与调试:后端可以独立进行测试和调试。端可以使用类似Postman或浏览器插件来测试后端接口的返回数据,后端可以使用单元测试框架如JUnit来进行接口测试。 7. 部署与发布:后端可以独立进行部署和发布。端可以将静态资源(HTML、CSS、JavaScript等)部署到Web服务器上,后端可以将Java应用部署到应用服务器上。 通过Java前后端分离的架构模式,可以提高开发效率、降低耦合度,并且使得后端团队可以并行开发,更好地实现功能需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值