世界兜兜转转,近期又回到了毕业时接触的java项目了。 从.net到java,似乎一切又是新的,记录一些工作中遇到的问题。
应用程序跨域时,前端发现POST数据一直返回415错误。调查后发现是跨域问题导致。那么怎么解决呢?
有两种方式,一种是前端请求方式改变,另一种是后端处理改变。
1. 先说前端改变:
<script>
$(document).ready(function(){
var url = "http://10.32.212.22:8080/Test/AddTask";
var objArray = [{"errorType":"errorCode","errorValue":"FXD300070"},{"errorType":"Title","errorValue":"继续支付金额有误"}];
var data = {
"jobName":"GeneralJob2017",
"appId":"720203;720206;720207;",
"interval":"180",
"level":"error",
"jobType":"1"//,
//"errorDetails":objArray
};
//data.errorDetails = JSON.stringify(objArray) //data里面又包含数组参数时,请用JSON.stringify
$.ajax({
url:url,
type:'post',
dataType: "jsonp", //注意这里是JSONP, 不是JSON
data: data, //JSON.stringify放这里试
success:function(data){
alert(data);
},
error:function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}});
});
</script>
2. 后端
设置CORSFilter请求过滤,重写其中方法,这样前端可以直接以JSON格式dataType请求
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
httpResponse.addHeader("Access-Control-Allow-Origin", "*");
filterChain.doFilter(servletRequest, servletResponse);
}
以上两种方式已经解决基本解决了问题,那么,对于后端怎么处理前端post过来的参数呢?
对于第一种JSONP传递的参数,可以和处理GET时一样
Server端获取参数和Get方式一样:
public String getPostParameters(HttpServletRequest req) {
Map<String, String[]> mapP = req.getParameterMap();
JSONObject obj = JSONObject.fromObject(mapP);
return obj.toString();
}
对于第二种后端通过
CORSFilter处理,前端通过JSON格式dataType请求,后面可以通过以下两种方式处理参数
public String getPostParams(HttpServletRequest request) {
String queryString = "";
Map<String, String[]> params = request.getParameterMap();
params.toString();
for (String key : params.keySet()) {
String[] values = params.get(key);
for (int i = 0; i < values.length; i++) {
String value = values[i];
queryString = key;
queryString += key + "=" + value + "&";
}
}
queryString = queryString.substring(0, queryString.length() - 1);
return queryString;
}
另外也可以创建一个类,然后
把
POST
过来的参数转化为类:
JSONObject object = JSONObject.fromObject(parameterStr);
ParameterClass c = (ParameterClass) object.toBean(object,ParameterClass .class);
好了,到此这问题都解决了,写的可能信息不全,对于参考资料未标注,因为只作为自己遇到问题解决方案的一个记录。