Java项目跨域问题解决方案总结
来源:互联网 发布:汤珈铖 知乎 编辑:程序博客网 时间:2024/06/05 21:16
做过跨系统的一般都会遇到跨域获取数据的问题,本人也是遇到了很多次。今天就来罗列一下解决跨域的几种解决方式和具体的方法。
1.在控制层(Controller)方法中加入一行
response.setHeader(
"Access-Control-Allow-Origin"
,
"*"
);
代表当前接口返回的数据支持跨域,*代表所有域名访问方都可以获取数据,也可以指定具体域名。
这种方式比较不友好,每个方法都要加一行代码。
2.Jsonp方式,比较常用的一种方法。ajax请求的时候为jsonp方式,增加callback参数。此方法只支持GET方式请求。
首先添加一个类集成MappingJackson2HttpMessageConverter 并复写writeInternal方法,添加jsonp返回支持。
代码如下:
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonProcessingException;
public class CallbackMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
// 做jsonp的支持的标识,在请求参数中加该参数
private String callbackName;
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
// 从threadLocal中获取当前的Request对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
String callbackParam = request.getParameter(callbackName);
if(StringUtils.isEmpty(callbackParam)){
// 没有找到callback参数,直接返回json数据
super.writeInternal(object, outputMessage);
}else{
JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
try {
String result =callbackParam+"("+super.getObjectMapper().writeValueAsString(object)+");";
IOUtils.write(result, outputMessage.getBody(),encoding.getJavaName());
}
catch (JsonProcessingException ex) {
throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
}
}
}
public String getCallbackName() {
return callbackName;
}
public void setCallbackName(String callbackName) {
this.callbackName = callbackName;
}
}
然后在mvc配置文件中加入:
<!-- MVC注解驱动 -->
<mvc:annotation-driven>
<!-- 采用自定义方案 -->
<mvc:message-converters>
<!-- 定义文本转化器 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg index="0" value="UTF-8"/>
</bean>
<!-- 定义json转化器,支持json跨域 -->
<bean class="xxx.util.spring.exetend.converter.json.CallbackMappingJackson2HttpMessageConverter">
<!-- 跨域请求中的请求参数名 -->
<property name="callbackName" value="callback"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
如果有多个message-converters需要写在一个annotation-driven里面,否则后面的无法生效。
配置完成后,页面获取数据添加callback参数就会走跨域的方法,不加就走正常流程。(ajax指定jsonp类型会自动追加callback参数)
3.注解方式解决跨域问题。
在Controller中加入@CrossOrigin注解。
@CrossOrigin(origins = "*", maxAge = 3600,methods={RequestMethod.POST})
跟第一种方法一样origins可以指定具体的域名,也可以指定请求方法,这个方法是整个Controller类全局的,会覆盖掉方法中指定的请求方法。
并且methods必须指定,不然会报错。
个人比较推荐这种方式。
- Java项目跨域问题解决方案总结
- java项目乱码问题解决方案
- Sun VisualVM项目 开源Java问题解决方案
- JAVA WEB项目中文乱码问题解决方案
- 跨域问题解决方案
- 跨域问题解决方案
- 跨域问题解决方案
- 跨域问题解决方案
- Unity5.x 项目升级过程中常见问题解决方案总结
- 近期问题解决方案总结
- JS跨域问题解决方案
- Ajax跨域问题解决方案
- Ajax跨域问题解决方案
- webview跨域问题解决方案
- nodejs跨域问题解决方案
- ajax跨域问题解决方案
- js 跨域问题解决方案
- ajax跨域问题解决方案
- MoviePy 数据动态可视化 图像转动态图或者视频
- NCO3.0连接SAP报错处理Could not load file or assembly 'sapnco' or one of its dependencies
- 在 MVVM 中使用 RACSubject 可以非常方便地实现统一的错误处理逻辑
- POJ3522 Slim Span(kruskal)
- 7-spring源码3.2.18解读+spring技术内幕(关于BeanDefinition的注册)
- Java项目跨域问题解决方案总结
- codeforces821 C(栈操作)
- malloc/free用法
- 内存释放和作用域销毁
- eclipse打不开android源码
- 高通8909平台AEC测试方法总结
- 类加载器
- 启发式算法(Heuristic Algorithm)
- linux下的shell 快捷键