在上一次Angularjs的调试之后又遇到新的问题,开始不跨域,后来考虑分布式部署,不可能不跨域,最后终于搞定,在上一章后续介绍了,在服务端添加头文件,不会加的同学们可以看下上一次讲解。
那么切入主题,就说说新问题吧,用户在登录的时候一般使用的是post方式,服务器获取数据验证以后,把常用数据存入session,生成token,然后把sessionid和token加到response-header的cookie中发送给客户端,之后的所有请求客户端需要带着这两个参数来服务器进行验证,并获取数据。
新的问题就是客户端在登录以后再次访问不会吧之前发送的session和token带着返回给服务端,这样就会导致每次操作验证不通过,重新生成token和sessionid,这样就无法继续往下进行了。
于是查了很多地方找到了客户端需要加入一个字段
withCredentials:true
只有加了这个字段才会接收发送带来的cookie,具体作用是什么大家就问度娘吧。还可以设置成全局的,这个就大家自己查吧。
$http({
url:'http://10.65.102.51:8080/v1/login/',
method:'POST',
withCredentials: true,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
params:{
"email": $scope.login.email, "pwd": $scope.login.pwd
}
}).success(function(data,header,config,status){
//响应成功
if ( data.Code=="200" ) {
$state.go('app.dashboard');
}else{
$scope.authError = '密码或者邮箱不正确';
}
}).error(function(data,header,config,status){
//处理响应失败
alert("服务器无响应");
});
客户端发送处都加上就可以了吗,回答是不行,回到前面,依然要在服务端加上头标签:
this.Ctx.ResponseWriter.Header().Add("Access-Control-Allow-Credentials", "true") //返回数据格式是json这样才可以,然后测试发现还是不行,服务器无法响应,后来又翻到。。。。
在一开始说的跨域头中
Access-Control-Allow-Origin
设置的是*,允许所有跨域访问,这样是不行的了,要想使用上面的头,必须把*换成制定host,为了开发方便,我就在配置文件中定义了port,统一8080,然后每个请求到来的时候获取一下他的ip然后拼接成http:127.0.0.1:8080然后赋值给Access-Control-Allow-Origin头文件,然后这样就能不同的客户端跨域请求端口必须配置8080端口,这样就能成功发送返回了。