在使用
$.ajax({
url:'http://127.0.0.1:8081/rest/ccxxx/xxxx',
type:'POST',
dataType:"json",
contentType:"application/json",
data:JSON.stringify({wechatId:1}),
crossDomain:true,
async:false,
cache:false,
success:function(data){
},
error:function(data){
}
});
}
請求時,瀏覽器返回了以options格式請求服務端403的錯誤。
查閱資料得知,
當contentType設置為三個常用的格式以外的格式,如“application/json”時,會先發送一個試探的OPTIONS類型的請求給服務端。在這時,單純的在業務接口response添加Access-Control-Allow-Origin 由於還沒有走到所以不會起作用。
解決方案:
在服務端增加一個攔截器
用於處理所有請求並加上允許跨域的頭
CommonInterceptor.java
/**
* 請求攔截器,處理跨域問題
*
*/
public class CommonInterceptor implements HandlerInterceptor {
private List<String> excludedUrls;
public List<String> getExcludedUrls() {
return excludedUrls;
}
public void setExcludedUrls(List<String> excludedUrls) {
this.excludedUrls = excludedUrls;
}
/**
*
* 在業務處理器處理請求之前被調用 如果返回false
* 從當前的攔截器往回執行所有攔截器的afterCompletion(),
* 再退出攔截器鏈, 如果返回true 執行下一個攔截器,
* 直到所有的攔截器都執行完畢 再執行被攔截的Controller
* 然后進入攔截器鏈,
* 從最后一個攔截器往回執行所有的postHandle()
* 接着再從最后一個攔截器往回執行所有的afterCompletion()
*
* @param request
*
* @param response
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept");
return true;
}
// 在業務處理器處理請求執行完成后,生成視圖之前執行的動作
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
/**
*
* 在DispatcherServlet完全處理完請求后被調用
* 當有攔截器拋出異常時,
* 會從當前攔截器往回執行所有的攔截器的afterCompletion()
*
* @param request
*
* @param response
*
* @param handler
*
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
}
applicationContext.xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.xxx.ccc.vvv.CommonInterceptor">
<property name="excludedUrls">
<list>
<value>/</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>