zoukankan      html  css  js  c++  java
  • SpringMvc+ajax跨域请求时,出现options类型的请求并返回403的解决方案

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

      

  • 相关阅读:
    利用vector声明二维数组及获取行数和列数
    链表翻转
    关于一段测试代码的知识点补习
    初探二叉搜索树
    排序系列之——再叙堆排序
    Top k 问题
    哈希表及其冲突与排解
    进程互斥与同步
    基础算法之几种排序算法
    进程的描述、状态及控制
  • 原文地址:https://www.cnblogs.com/cfas/p/9414901.html
Copyright © 2011-2022 走看看