read方法中调用的response对象是父类BaseController的一个成员变量.

spring默认bean的生命周期Score为singleton单例模式.

当多线程并发使用同一bean, 并使用bean中的同一成员变量时会有问题. 比如下例中的成员变量response

以下是服务端跨域代码.

@Controller
@Scope("request")
@RequestMapping("/CrossDomain")
public class CrossDomainController extends BaseController { @RequestMapping("/read")
@ControllerLog(description = "跨域请求")
public void read(@RequestParam Map<String, Object> params) throws IOException {
String url = (String) params.get("url");
if(BlankUtil.isNotEmpty(url)) {
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost(url);
// 设置请求的header
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
// 设置请求的参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
for (String key : params.keySet()) {
nvps.add(new BasicNameValuePair(key, String.valueOf(params.get(key))));
}
httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
// 执行请求
HttpResponse httpResponse = httpClient.execute(httpPost);
String result = EntityUtils.toString(httpResponse.getEntity(), "utf-8");
if("xml".equalsIgnoreCase(String.valueOf(params.get("type")))) {
response.setContentType("text/xml; charset=UTF-8");
}
try {
System.err.println("---------->" + String.valueOf(params.get("type")) + result.length());
PrintWriter out = response.getWriter();
out.write(result);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} }

修改Bean的生命周期scope配置为request或prototype即可.

JS代码(请求Java后台得到远程服务器xml文本内容,  然后在js端转换成xmldoc对象)

function crossDomainloadXmlFile(config) {
var doc = null;
Ext.Ajax.request({
url : config.url, // 请求地址
params : config.params, // 请求参数
timeout: config.timeout || 30000,
async : false,//同步请求
method : 'post', // 方法
callback : function(options, success, response) {
if(!success) {
if(top.checkTimeoutAndRelogin(response.status)) {
top.Ext.MessageBox.alert('错误提示', response.message);
}
return;
}
console.log('crossDomainloadXmlFile:' + response.responseText)
doc = parseXmlString(response.responseText);
}
});
return doc;
} function parseXmlString(xmlString) {
var doc;
if (window.ActiveXObject) {
doc = new ActiveXObject("Microsoft.XMLDOM");
doc.setProperty("SelectionLanguage", "XPath");
doc.async = false;
doc.loadXML(xmlString);
}
// load XML string code for Mozilla, Firefox, Opera, etc.
else {
var parser = new DOMParser();
doc = parser.parseFromString(xmlString, "text/xml");
} return doc.documentElement;
}

EXT组件:

/**
* Created by huangbaidong on 2016/6/30.
* 简单数据字典通用Store,
* 外部调用传入参数dictionaryId作为过滤条件.
* 使用案例:
store: Ext.create('app.component.sys.dictionary.SimpleDictionaryXmlStore', {
dictionaryId : 1
})
*/
Ext.define('app.component.sys.dictionary.SimpleDictionaryXmlStore', {
extend: 'Ext.data.XmlStore',
storeId :'simpleDictionaryStore',
dictionaryId : 0,
constructor : function(config) {
var me = this;
Ext.apply(config, {
fields: [{
name: 'id',
mapping: '@id'
}, {
name: 'name',
mapping: '@name'
}, {
name: 'dictionaryId',
mapping: '@dictionaryId'
}],
data:(function(){
var array = [];
Ext.each(top.simpleDictionaryStore.getData().items, function(item) {
if(item.data.dictionaryId == config.dictionaryId) {
array.push(item);
}
})
return array;
})()
});
app.component.sys.dictionary.SimpleDictionaryXmlStore.superclass.constructor.call(this, config);
}
});
/**
* 跨域获取数据字典, 并缓存为全局单例Store
* @type {Ext.data.Store}
*/
top.simpleDictionaryStore = Ext.create('Ext.data.Store', {
autoLoad : true,
fields: [{
name: 'id',
mapping: '@id'
}, {
name: 'name',
mapping: '@name'
}, {
name: 'dictionaryId',
mapping: '@dictionaryId'
}],
proxy: {
type: 'ajax',
url: '../CrossDomain/read',
reader: {
type: 'xml',
record: 'simpleDictionary',
idProperty: '@id',
totalRecords: '@total'
},
extraParams:{//服务端跨域处理
url: DICTIONARY_URL,
type : 'xml'
}
}
});

spring ext 跨域的更多相关文章

  1. spring boot跨域请求访问配置以及spring security中配置失效的原理解析

    一.同源策略 同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 什么是源 源[orig ...

  2. SpringBoot 优雅配置跨域多种方式及Spring Security跨域访问配置的坑

    前言 最近在做项目的时候,基于前后端分离的权限管理系统,后台使用 Spring Security 作为权限控制管理, 然后在前端接口访问时候涉及到跨域,但我怎么配置跨域也没有生效,这里有一个坑,在使用 ...

  3. spring boot 跨域访问处理

    问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家.可能是考虑到前后端分离,前端后端服务器不在一台机器上,出现这种跨域访问的情况.正常情况下本地访问是没有问题,但是遇到这种非 ...

  4. spring boot跨域设置

    定义 跨域是指从一个域名的网页去请求另一个域名的资源 跨域背景 限制原因 如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题 为什么要跨域 公司内部有多个不 ...

  5. SPRING BOOT跨域访问处理

    尊重原创:http://blog.csdn.net/ruiguang21/article/details/77878933 问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家 ...

  6. spring boot跨域问题

    跨域是指不同域名之间相互访问.跨域,指的是浏览器不能执行其他网站的脚本.它是浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制.也就是如果在A网站中,我们希望使用Ajax来获得B网站 ...

  7. spring boot 跨域请求

    场景 网站localhost:56338要访问网站localhost:3001的服务 在网站localhost:3001中增加CORS相关Java Config @Configuration @Ord ...

  8. 关于Spring MVC跨域

    1.Sping MVC 3.X跨域 关于跨域问题,主要用的比较多的是cros跨域. 详细介绍请看https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Ac ...

  9. spring mvc 跨域问题。。。解决

    官方推荐方式: http://spring.io/blog/2015/06/08/cors-support-in-spring-framework 方式1: $.ajax({ //前台:常规写法.注意 ...

随机推荐

  1. JSP-Servlet的工作流程

    Servlet基础 1.Servlet概述 JSP的前身就是Servlet.Servlet就是在服务器端运行的一段小程序.一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问 ...

  2. inet_ntoa、 inet_aton、inet_addr

    inet_addr()   简述:将一个点间隔地址转换成一个in_addr. #include <winsock.h> unsigned long PASCAL FAR inet_addr ...

  3. ASP.NET MVC Razor语法

    ASP.NET MVC Razor语法 (一) 关于_ViewStart.cshtml文件     使用Razor模板引擎的话,会自动生成一个_ViewStart.cshtml文件.事实上,_View ...

  4. 关于Windows下安装mongodb和加入Windows系统启动项

    .首先:在http://www.mongodb.org/downloads官网下载最新的win版本的mongodb下载包(我下载到d盘) .加压缩,修改文件夹名字为mongodb,建立放数据库文件夹w ...

  5. MySQL创建一个用户,指定一个数据库 授权

    Mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 hail mysql -u root -ppassworduse mysql;insert into user(h ...

  6. oracle 中的trunc()函数及加一个月,一天,一小时,一分钟,一秒钟方法

    返回处理后的数据,不同于round()(对数值进行四舍五入处理),该函数不对指定小数前或后的数值部分进行舍入处理. 语法:trunc(number[,decimals]) 其中,number为待做处理 ...

  7. Eclipse中使用tomcat 8服务器初级教程

    Eclipse中使用tomcat容器时,经常遇到的问题是启动不成功,输入localhost:8080报404,本文就是教大家破解这个问题.(不过这是很初级的问题了,大牛勿喷) 步骤 1 Window- ...

  8. Roslyn词法分析器初使用

    需:install-package:Microsoft.CodeAnalysis ];         NamespaceDeclarationSyntax NameSpaceDeclaration  ...

  9. [译]git commit

    git commit git commit命令提交stage区的快照到项目历史中去(HEAD). 被提交的快照被认为是一个项目的安全版本. Git不会修改他们, 除非你显示的要求了. 和git add ...

  10. VBA 表格操作2 表格复制

    office excel文件有工作簿,里面存放一张张表,表的名字叫做标签名,簿名就是我们常见的的文件名,簿的类型有"一簿一表"与"一簿多表". 完成将多张表合并 ...