dubbox跨域请求、Cookie

标签: Dubbox 跨域 Cookie
7人阅读 评论(0) 收藏 举报
分类:

Dubbox配置CORS服务来解决跨域问题,这里不涉及jsonp跨域方式,一般服务端接口返回的数据都不是jsonp形式。

1、创建CorsResponseFilter类

package com.neusoft.filter;

import com.neusoft.util.PropertiesUtils;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MultivaluedMap;
import java.io.IOException;
import java.util.List;

/**
 * @author zhouzk
 * @ClassName: CorsResponseFilter
 * @Description: rest跨域
 * @date 2018/4/16 18:43
 */
public class CorsResponseFilter implements ContainerResponseFilter {

	public static final String ALLOWED_METHODS = "GET, POST, PUT, DELETE, OPTIONS, HEAD";
	public final static int MAX_AGE = 30 * 60;
	public final static String DEFAULT_ALLOWED_HEADERS = "origin,accept,content-type";

	public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
		String memberCrossDomain = PropertiesUtils.getProperty("member.cross.domain");
		final MultivaluedMap<String, Object> headers = responseContext.getHeaders();
		headers.add("Access-Control-Allow-Origin", memberCrossDomain);
		headers.add("Access-Control-Allow-Headers", getRequestedHeaders(requestContext));
		headers.add("Access-Control-Allow-Credentials", "true");
		headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS);
		headers.add("Access-Control-Max-Age", MAX_AGE);
		headers.add("x-responded-by", "cors-response-filter");
	}

	private String getRequestedHeaders(ContainerRequestContext responseContext) {
		List<String> headers = responseContext.getHeaders().get("Access-Control-Request-Headers");
		return createHeaderList(headers);
	}

	private String createHeaderList(List<String> headers) {
		if (headers == null || headers.isEmpty()) {
			return DEFAULT_ALLOWED_HEADERS;
		}
		StringBuilder retVal = new StringBuilder();
		for (int i = 0; i < headers.size(); i++) {
			String header = (String) headers.get(i);
			retVal.append(header);
			retVal.append(',');
		}
		retVal.append(DEFAULT_ALLOWED_HEADERS);
		return retVal.toString();
	}
}

2、在rest接口配置filter(cors)

<dubbo:protocol name="rest" port="8888" threads="1000" contextpath="services" server="tomcat" accepts="2000" extension="com.neusoft.filter.CorsResponseFilter"/>

3、response添加Cookie

	private static Boolean setCookie(String cookieKey, String cookieVal){
		HttpServletResponse httpServletResponse = (HttpServletResponse) RpcContext.getContext().getResponse();
		if(StringUtils.isBlank(cookieKey)){
			return false;
		}
		Cookie cookie = new Cookie(cookieKey,cookieVal);
		cookie.setPath("/");
		cookie.setMaxAge(3600*24*30);
		cookie.setDomain( "java.neusoft.com");
		cookie.setSecure(false);
		cookie.setHttpOnly(false);
		httpServletResponse.addCookie(cookie);
		return true;
	}

4、前端请求实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.js"></script>
    <script src="//cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
</head>
<body>
    <div class="container">
        <form>
            用户名:<input name="username" id="username" value="123">
            <br/>
            密码<input name="pwd" id="pwd" value="456">
            <br/>
            <button type="button" value="登录" onclick="doLogin()" >登录</button>
        </form>
    </div>
</body>
<script type="text/javascript">
    function doLogin() {
        var data = JSON.stringify({username:$('#username').val(),pwd:$('#pwd').val()});
        console.log(data)
        $.ajax({
            url:'http://java.neusoft.com:8888/services/member/doLoginByWeb',
            type:'POST',
            data:data,
            contentType: "application/json;charset=UTF-8",
            dataType:'json',    //返回的数据格式:json
            xhrFields:{withCredentials:true},
            crossDomain: true,
            success:function(data, status, xhr){
                console.log(data)
                var username = $.cookie('username'); // 读取 cookie
                if(username !='' && username!=undefined){
                    console.log('Cookie中的用户名:'+username)
                }
            },
            error:function(xhr,textStatus){
                console.log('错误')
                console.log(xhr)
                console.log(textStatus)
            },
            complete:function(){
                console.log('结束')
            }
        })
    }
</script>
</html>

5、本地host修改,没SwitchHost可以到系统盘下修改hosts文件,自行百度。

6、测试结果


7、完整案例代码已上传,点击下载。

查看评论

Dubbox跨域请求、Cookie设置

  • 2018年04月16日 22:23
  • 66KB
  • 下载

跨域请求带cookie的解决方案

参考:http://blog.sina.com.cn/s/blog_87b9bbc70102vg18.html          cookie一般情况下是没法跨域的,甚至POST请求一般情况下都是无...
  • sysuzjz
  • sysuzjz
  • 2016-06-02 14:12:39
  • 7571

ajax 跨域请求以及跨域cookie提交

ajax在跨域时,会遇到2个问题,阻碍我们的一些需求。 1、在浏览器提交一个ajax请求时,如果是跨域的,那么不会携带 cookie ,那么导致的问题就是,一些放在cookie中的身份信息就没法提交,...
  • u013047803
  • u013047803
  • 2016-05-09 20:20:51
  • 7141

Ajax跨域请求COOKIE无法带上的解决办法

原生ajax请求方式: var xhr = new XMLHttpRequest(); xhr.open("POST", "http://xxxx.com/demo/b/index.php",...
  • u012841509
  • u012841509
  • 2016-08-02 15:40:27
  • 1110

【已解决】携带cookies的跨域访问

跨域的解决方案网上跨域的解决方案有很多,但是比较新一点有两种,一个是jsonp,一个是cors。 cors比jsonp还要新一些,本文所述都是基于cors的。但是jsonp可以在不支持cors的浏览...
  • Dcatfly
  • Dcatfly
  • 2016-12-10 16:19:28
  • 5835

AngularJS实现cookie跨域

前后端分离被越来越多的公司重视利用,然后带来的最棘手的问题就是,用户信息应如何保存。 一、场景描述 以Java为后台,AngluarJS做前端为例进行描述:当用户在界面登录时,需把用户信息(如...
  • ligang2585116
  • ligang2585116
  • 2015-04-01 14:46:22
  • 4798

Django配置Ajax跨域调用/设置Cookie

背景前段时间感觉自己使用Hexo搭建的个人独立博客使用起来颇为无力(大抵是多说关服的原因),遂萌生出了自己给自己定制一个博客的想法,恰巧又赶上了学校的“软件课程设计”,要求做一个基于数据库的软件,于是...
  • qq_30242609
  • qq_30242609
  • 2017-06-28 23:24:13
  • 1504

js网络请求跨域问题汇总(携带cookie)

js网络请求跨域问题汇总(携带cookie) 前端程序使用extjs写,在本地测试,发送请求到服务器时,发现存在跨域的问题,c...
  • qq272342889
  • qq272342889
  • 2018-02-25 17:11:06
  • 116

HTML5 App 跨域请求 携带cookie

最近在弄一个html5 app 的项目,因为此项目是前期开发,暂时用html app。使用的是HBuilder为IDE;前端框架为mui;后端为.NET;刚开始我一直在做后端的业务,将业务代码编写并测...
  • ReturningProdigal
  • ReturningProdigal
  • 2017-07-02 23:51:54
  • 547

zepto跨域ajax无法带cookie的问题

在A域的代码中,用zepto的ajax方法去向B域请求数据。同时,我们希望把B域的cookie也随请求带过去,代码如下$.ajax({ url: 'B', type: 'GET', ...
  • ForeverCjl
  • ForeverCjl
  • 2017-02-27 17:32:58
  • 1883
    个人资料
    等级:
    访问量: 2549
    积分: 314
    排名: 24万+
    文章存档
    最新评论