在使用 $.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>