SpringMvc+ajax跨域請求時,出現options型別的請求並返回403的解決方案
阿新 • • 發佈:2019-01-29
在使用
[javascript] view plain copy- $.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){
- }
- });
- }
查閱資料得知,
當contentType設定為三個常用的格式以外的格式,如“application/json”時,會先發送一個試探的OPTIONS型別的請求給服務端。在這時,單純的在業務介面response新增Access-Control-Allow-Origin 由於還沒有走到所以不會起作用。
解決方案:
在服務端增加一個攔截器
用於處理所有請求並加上允許跨域的頭
- CommonInterceptor.java
- /**
- * 請求攔截器,處理跨域問題
- * @author huangjinkai
- *
- */
- 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:mappingpath="/**"/>
- <beanclass="com.xxx.ccc.vvv.CommonInterceptor">
- <propertyname="excludedUrls">
- <list>
- <value>/</value>
- </list>
- </property>
- </bean>
- </mvc:interceptor>
- </mvc:interceptors>
攔截器程式碼參考
http://blog.csdn.net/u013292160/article/details/51769374
配置完成後重啟伺服器再次請求就可以看到瀏覽器會發送兩個請求 並且均為200OK