c# vue 跨域get post cookie等问题

背景介绍:

  开发微信公共号时前后端分离,后台用C#开发,前端使用vue框架,数据采用axios传输



具体问题:

  1:前后端分离造成的跨域访问问题

  2:跨域后cookie传输和设置问题



解决方案:

  1:使用jsonp作为数据传输的方式,前端和后端配合解决跨域问题

  2:通过设置webconfig配合axios.js解决cookie传输(get、set)



具体方案:

  问题一:

 1:controller

    /// <summary>
        /// get
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        public JsonpResult Text(int ID)
        {
            return this.Jsonp(ID);
        }
        /// <summary>
        /// post
        /// </summary>
        /// <param name="jsonp"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonpResult TextJsonpHttp(string jsonp)
        {
            return this.Jsonp(jsonp);
        }

  2:JsonpResult

 /// <summary>
    /// Controller控制器类的扩展方法,即:Controller控制器下扩展一个Jsonp方法,这个方法带一个object类型的参数
    /// </summary>
    public static class ControllerExtension
    {
        public static JsonpResult Jsonp(this Controller controller, object data)
        {
            JsonpResult result = new JsonpResult()
            {
                Data = data,
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
            return result;
        }
    }
    public class JsonpResult : JsonResult
    {
        public static readonly string JsonpCallbackName = "MoDoPMS";//js中设置的jsonp
        public static readonly string CallbackApplicationType = "application/json";
        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new AccessViolationException("context");
            }

            if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) //如果不允许来自客户端的Get请求,并且请求类型是Get
            {
                throw new AccessViolationException();
            }
            var response = context.HttpContext.Response;
            if (!string.IsNullOrEmpty(ContentType)) //这个ContentType是获取或设置内容的类型。它是JsonResult类中的一个属性
            {
                response.ContentType = ContentType; //设置响应内容的类型
            }
            else
            {
                response.ContentType = CallbackApplicationType; //设置响应内容的类型
            }
            if (ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;//设置响应内容的编码
            }

            if (Data != null) //这个Data是JsonResult类中的一个属性
            {
                string buffer;
                var request = context.HttpContext.Request;
                JsonSerializerSettings settings = new JsonSerializerSettings();
                settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                if (request[JsonpCallbackName] != null) //获取回调函数名称
                {
                    buffer = String.Format("{0}({1})", request[JsonpCallbackName], JsonConvert.SerializeObject(Data, Formatting.None, settings));//首先根据callback获取获取函数名,然后传入json字符串作为函数参数
                }
                else
                {
                    buffer = JsonConvert.SerializeObject(Data, settings);//首先根据callback获取获取函数名,然后传入json字符串作为函数参数
                }
                response.Write(buffer);
            }
        }
    }

  3:vue中axios.js

var url="/Wechat/JsonP/GetVueBranchList";
this.$http({
        method: ‘get‘,
        dataType: "jsonp",
      jsonp: "MoDoPMS",//jsonp接口参数
      timeout: 10000,//超时
      url: url,
    })
    .then(function(response){

    });

get

  axios.post(‘/Wechat/JsonP/PostVueLogin‘, qs.stringify({loginphone:_this.phone,loginpwd:_this.password}))
        .then(response => {
          console.log(response);
          let instance = Toast(response.data.Message);
            setTimeout(() => {
              instance.close();
              _this.$router.push({name: response.data.Url});
            }, 1000);
        })
        .catch(err => {
          console.log(err);
        });

post

  get与post均可使用axios.js

  4:配置项web.config

  <system.webServer>
<httpProtocol>
      <customHeaders>

        <add name="Access-Control-Allow-Origin" value="*" /><!--解决跨域问题-->
        <add name="Access-Control-Allow-Methods" value="POST,GET" /><!--解决提交方式问题-->
      </customHeaders>
    </httpProtocol>
  </system.webServer>

web.config

 



 问题二:

 1:web.config中配置项

 

 2:vue-main.js中

  axios.defaults.withCredentials = true//解决cookie问题

 3:axios请求

 4:http header

 得到结论,在跨域的情况下使用 axios,首先需要配置 axios 的 withCredentials 属性为 true。然后服务器还需要配置响应报文头部的 Access-Control-Allow-Origin 和 Access-Control-Allow-Credentials 两个字段,Access-Control-Allow-Origin 字段的值需要为确定的域名,而不能直接用 ‘*’ 代替,Access-Control-Allow-Credentials 的值需要设置为 true。前端和服务端两边都配置完善之后就可以正常进行跨域访问以及携带 cookie 信息了。

原文地址:https://www.cnblogs.com/zhaokunbokeyuan256/p/8214974.html

时间: 2024-10-29 01:12:42

c# vue 跨域get post cookie等问题的相关文章

ajax 跨域无法携带cookie 解决办法

ajax 跨域无法携带cookie,需要用到session,终于完美结局 xhrFields: { withCredentials: true }, 添加这个可能是大家都会做的一件事 但是添加上了之后就出现了另外一个问题 The 'Access-Control-Allow-Origin' header contains the invalid value 'Origin'. Origin ...... 2.服务器server端要配置Access-Control-Allow-Credentials

聊一下,前后分离后带来的跨域访问和cookie问题

在谈前后分离前,我们先看看什么是前后一体的.当我们用javaweb开发网站时,最终我们渲染的jsp或者springthymeleaf.我们的页面其实是WEB-INFO或者templates下.当用户请求我们的xxx页面资源其实并不是请求的真正的页面,而是经过我们controller处理完,产生modelAndView后,在找到视图解析器,最终把数据放到视图中,然后response才把视图通过流传输给客户端.在这种开发环境中,我们请求的页面实际是在web容器中的,自然是本域访问. 如果我们将htm

跨域请求传递Cookie问题

问题描述 前后端完全分离的项目,前端使用Vue + axios,后端使用SpringMVC,容器为Tomcat. 使用CORS协议解决跨域访问数据限制的问题,但是发现客户端的Ajax请求不会自动带上服务器返回的Cookie:JSESSIONID. 导致每一个Ajax请求在服务端看来都是一个新的请求,都会在服务端创建新的Session(在响应消息头中设置Set-Cookie:JSESSIONID=xxx). 而在项目中使用了Shiro框架,用户认证的信息是放在Session中的,由于客户端不会把J

vue 跨域简记

0.服务端设置 app.use(function(req, res, next){ //设置跨域访问 res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild'); res.header('Acce

php &amp; vue 跨域问题解决方案

方案1:在服务端配置指定的域名 (注:在vue中无需设置:'Access-Control-Allow-Origin'如果为*则依然会报错,必须得是指定的域名) /** * 设置能访问的域名 * * @var array */ static public $originarr = [ 'http://lc.vue.com:82', // 前端本地测试域名 'http://127.0.0.1:82', // 前端本地测试域名 'http://localhost:8066', // 前端本地测试域名

【原】fetch跨域请求附带cookie(credentials)

HTTP访问控制 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS 解决跨域的方式有很多种,本文介绍"跨域请求附带发送cookie" 一.测试环境 前提:后台使用apache+php实现.apache设置多个虚拟主机,设置方式参考:http://www.cnblogs.com/sivkun/p/7347978.html 在http://a.sivkun.com域中/cors-cookie/目录下有

使用 P3P 规范让 IE 跨域接受第三方 cookie

前两天帮同事处理一个 js 跨域问题,使用 jsonp 跨域提交用户名密码请求,实现自动登录第三方网站,即 SSO(single-sign-on) 单点登录,一处登录处处登录.在 Chrome 下没问题,IE 却不行.查看 HTTP 的几个来回,发现登录请求是成功的,问题出在第三方网站返回的 cookie (session id) IE 并没有接受,下一次发送请求时根本没有带上 cookie,说明之前的 Set-Cookie 指令没有效果,所以怎么也登录不了.查了一下,有人使用 iframe 内

关于jsonp跨域过程中 cookie中的值一直为null的原因

今天技术交流群里的小伙伴一直被一个问题而困扰,就是写入cookie里面的值 再次进行请求时 cookie 就为空了 他被问题纠结了一天  我也好奇了一天 终于在快下班的时候 他解决掉了 下面我来收一个渔翁之利 上图啦: 这个是他ajax请求的跨域 这是在ashx一般处理程序中写的读写cookie的操作 这就是问题所在 ,代码没有问题  但是cookie里第二次就是获取不到了捏 最后他给出的解决方案就是 在ashx刚开始的时候 加上 context.Response.AddHeader("P3P&

ajax跨域调试和cookie问题

在之前项目中,web前端ajax的跨域访问api接口都是通过设置Data-type="jsonp"来解决的. 新项目中为了安全起见,把用户敏感信息和api接口验证都放在HttpRequest Header的Authorization中, 但是发现一个蛋疼的问题,使用Data-type="jsonp"来进行跨域访问,Header中Authorization的内容无法发送出去. 为了解决这个问题只能使用Data-type="json",并在本地用ng