SPRING BOOT跨域访问处理

尊重原创:http://blog.csdn.net/ruiguang21/article/details/77878933

  1. 问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家可能是考虑到前后端分离,前端后端服务器不在一台机器上,出现这种跨域访问的情况。正常情况下本地访问是没有问题,但是遇到这种非同一台服务器的情况下,就会报错Access-Control-Allow-Origin。具体报错内容不记得了。
  2. 问题解决方案一:采用添加拦截器的方式对请求添加跨域访问的头,允许跨域访问。
  3. 包com.meicloud.interceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.log4j.Logger;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    公共 类 CommonInterceptor 扩展HandlerInterceptorAdapter {
    
        私人 最终 静态   记录器记录器= Logger.getLogger(CommonInterceptor。类);
    
        @覆盖
        公共 布尔 preHandle(HttpServletRequest请求,HttpServletResponse响应,对象处理程序)抛出异常{
            logger.info( “添加跨域访问头配置,Access-Control-Allow-Origin:*” );
            // 跨域访问CORS
            response.addHeader(“Access-Control-Allow-Origin”,“*” );
            response.addHeader( “Access-Control-Allow-Methods”,“POST,GET,OPTIONS,PUT,DELETE,HEAD” );
            response.addHeader( “Access-Control-Allow-Headers”,“S_ID,content-type” );
            response.addHeader( “Access-Control-Max-Age”,“3600000” );
            response.addHeader( “Access-Control-Allow-Credentials”,“true” );
    
            // 让请求,不被缓存,
            response.setHeader(“Cache-Control”,“no-cache” );
            response.setHeader( “Cache-Control”,“no-store” );
            response.setHeader( “Pragma”,“no-cache” );
            response.setDateHeader( “Expires”,0 );
            logger.debug
            ( “================================== preHandle” );
            返回 true ;
        }
    
        @覆盖
        公共 无效postHandle(HttpServletRequest请求,
                HttpServletResponse响应,对象处理程序,
                ModelAndView modelAndView)抛出Exception {logger.debug
            ( “================================== postHandle” );
        }
    
        @覆盖
        public  void afterCompletion(HttpServletRequest request,
                HttpServletResponse响应,对象处理程序,Exception ex)
                抛出Exception {
            logger.debug( “================================== afterCompletion” );
        }
    }
    

      

  4. 上面是拦截器内容,下面是对拦截器的配置。
包com.meicloud.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.meicloud.interceptor.CommonInterceptor;

@ComponentScan
@组态
公共 类 WebMvcConfig 扩展WebMvcConfigurerAdapter {

    @覆盖
    public  void addInterceptors(InterceptorRegistry registry){
         // TODO自动生成的方法存根
        registry.addInterceptor(new CommonInterceptor())。addPathPatterns(“/ getDOC” );
    }

}

  然后就可以在控制器中使用他了,下面是我的控制器

我们可以通过调用
这个方法来实现一个简单的方法来实现这个方法,这个方法可以
用来实现一个简单的方法来实现这个方法
。
BaseReturn baseReturn = new BaseReturn(); 

字符串名称= mailEntity.getName();
String company = mailEntity.getCompany();
字符串部门= mailEntity.getDepartments();
String job = mailEntity.getJob();
String email = mailEntity.getEmail();
String phone = mailEntity.getPhone();
String doc = mailEntity.getDoc(); 

尝试{
if(name == null || name.equals(“”)){
throw new CommenException(“姓名不能为空!
}
if(email == null || email.equals(“”)){
throw new CommenException(“Email不能为空!”);
}
if(phone == null || phone.equals(“”)){
throw new CommenException(“电话号码不能为空!”);
}
if(doc == null || doc.equals(“”)){
throw new CommenException(“文档不能为空!”);
}
}赶上(例外E1){
baseReturn.setCode(ReturnType.FAIL);
baseReturn.setMsg(e1.getMessage());
log.error(e1.getMessage());
返回基地返回;
} 

try {
// iMailClent.sendMail(mailEntity);
iMailClent.sendHtmlMail(mailEntity);
baseReturn.setCode(ReturnType.SUCCESS);
catch(Exception e){
e.printStackTrace();
baseReturn.setCode(ReturnType.FAIL);
baseReturn.setMsg( “发送邮件失败!”);
log.error(e.getMessage());
} 

return baseReturn;
}

  接下来是前端的调用,前端采用ajax post请求

var params = {
                          名称:名称,
                          公司:公司,
                          部门:部门,
                          工作:工作,
                          电子邮件:电子邮件,
                          电话:电话,
                          doc: ‘/ doc/ api.doc‘
                  };

var type =‘POST‘ ;
var url = Config.host + url;

$就({
        url:url,
        数据:JSON.stringify(params),
        键入:type,
        contentType: “application / json” ,
        async:false ,
        成功:函数(数据){
             // TODO成功
        },
        错误:函数(数据){
             // TODO失败
        }
    });

问题解决方案二:使用JSONP来实现跨域访问,直接上代码,前端代码为:

url =‘http:// localhost:9999 / getDOC‘+‘?name =‘+ params.name
             +‘&company =‘+ params.company
             +‘&departments =‘+ params.departments +‘&job =‘+ params.job
             +‘&email =‘+ params.email +‘&phone =‘+ params.phone +‘&doc =‘
            + params.doc;

$就({
        url:url,
        键入: ‘get‘ ,
        async:false ,
        dataType: “jsonp” ,
        jsonpCallback: “回调” ,
        成功:功能(数据){
            // TODO成功
        },
        错误:函数(数据){
            // TODO失败
        }
    });

  限制调用方式为get,数据类型为jsonp。后端也必须响应JSONPObject对象。

@ResponseBody
    @RequestMapping(value =“/ getDOC”,method = RequestMethod.GET)
    公共JSONPObject getDOC(HttpServletRequest请求,字符串回调){

        BaseReturn baseReturn = new BaseReturn();

        String name = request.getParameter(“name” );
        String company = request.getParameter(“company” );
        String departments = request.getParameter(“departments” );
        String job = request.getParameter(“job” );
        String email = request.getParameter(“email” );
        String phone = request.getParameter(“phone” );
        String doc = request.getParameter(“doc” );

        尝试{
             if(name == null || name.equals(“” )){
                 throw  new CommenException(“姓名不能为空!” );
            }
            if(email == null || email.equals(“” )){
                 throw  new CommenException(“Email不能为空!” );
            }
            if(phone == null || phone.equals(“” )){
                 throw  new CommenException(“电话号码不能为空!” );
            }
            if(doc == null || doc.equals(“” )){
                 throw  new CommenException(“文档不能为空!” );
            }
        } 捕获(例外E1){
            baseReturn.setCode(ReturnType.FAIL);
            baseReturn.setMsg(e1.getMessage());
            log.error(e1.getMessage());
            返回 新的JSONPObject(callback,baseReturn);
        }

        MailEntity mailEntity = new MailEntity();
        mailEntity.setCompany(公司);
        mailEntity.setDepartments(部门);
        mailEntity.setDoc(DOC);
        mailEntity.setEmail(电子邮件);
        mailEntity.setJob(工作);
        mailEntity.setName(名称);
        mailEntity.setPhone(电话);

        尝试{
             iMailClent.sendHtmlMail(mailEntity);
            baseReturn.setCode(ReturnType.SUCCESS);
        } 捕获(例外五){
            e.printStackTrace();
            baseReturn.setCode(ReturnType.FAIL);
            baseReturn.setMsg( “发送邮件失败!” );
            log.error(e.getMessage());
        }

        返回 新的JSONPObject(callback,baseReturn);
    }

  今天得到高人指点,原来有一种更加简便的方法,可以实现。不过原理肯定都是一样的,通过给请求添加消息头来设置跨域访问,这点是无疑的。新的解决办法就是给控制器或方法添加@CrossOrigin注解,具体详情请参考:http://spring.io/blog/2015/06/08/cors-support-in-spring-framework

@ResponseBody
    @RequestMapping(value =“/ getDOC”,method = RequestMethod.POST)公共BaseReturn getDOC(@RequestBody MailEntity mailEntity,HttpServletRequest请求,HttpServletResponse响应,HttpSession httpSession){
    @CrossOrigin // 使用注解方式添加跨域访问消息头

        log.info( “执行控制器HomeController.getDOC”);

  

原文地址:https://www.cnblogs.com/xiaohouzai/p/8313080.html

时间: 2024-11-09 12:18:57

SPRING BOOT跨域访问处理的相关文章

spring boot跨域请求访问配置以及spring security中配置失效的原理解析

一.同源策略 同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 什么是源 源[origin]就是协议.域名和端口号.例如:http://www.baidu.com:80这个URL. 什么是同源 若地址里面的协议.域名和端口号均相同则属于同源. 是否是同源的判断 例如判断下面的URL是否与 http://www.a.com/test/index.html 同源 http://www.a

Spring Boot跨域问题解决方案

@Configurationpublic class CorsConfig { @Bean public FilterRegistrationBean corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(

Spring Boot 2中对于CORS跨域访问的快速支持

原文:https://www.jianshu.com/p/840b4f83c3b5 目前的程序开发,大部分都采用前后台分离.这样一来,就都会碰到跨域资源共享CORS的问题.Spring Boot 2 对此提供了很好的解决方法. 更多CORS介绍,请看这里: CORS介绍 1.注解实现 在Spring Boot 2中,提供了注解的方式来对CORS跨域访问进行支持. 1.1 在方法上注解 可以将@CrossOrigin注解在方法上.这样该方法可以被跨域访问. 在方法上标注 1.2 在Controll

第20章—跨域访问(CORS)

spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxiaohang/springboot 本次练习在之前第17章-前端分页(Bootstrap-Table)基础上进行. 一.为什么 对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出现. 针对跨域问题,我们可能第一个想到的解决方案就是jsonp,并且以前处理跨

ajax跨域访问及其解决方案

用ajax方式请求别的网站,就会发生跨域请求问题, XMLHttpRequest cannot load http://google.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://run.jsbin.io' is therefore not allowed access. 编一个服务器端servlet测试一下 @RequestMapping("/

Spring处理跨域请求

[nio-8080-exec-8] o.s.web.cors.DefaultCorsProcessor        : Skip CORS processing: request is from same origin 一次正常的请求 最近别人需要调用我们系统的某一个功能,对方希望提供一个api让其能够更新数据.由于该同学是客户端开发,于是有了类似以下代码. @RequestMapping(method = RequestMethod.POST, value = "/update.json&q

解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题

问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, 既然每次请求都是一个新的会话, 那我们去获取session的时候自然就是null了. 解决办法如下: 环境: vue 2.0 springboot 2.1.6 一.前端部分 1.  在vue引入axios的位置添加以下代码 import axios from 'axios' axios.defau

iframe跨域访问

js跨域是个讨论很多的话题.iframe跨域访问也被研究的很透了. 一般分两种情况: 一. 是同主域下面,不同子域之间的跨域: 同主域,不同子域跨域,设置相同的document.domian就可以解决; 父页访问子页,可以document.getElementById("myframe").contentWindow.document来访问iframe页面的内容:如果支持contentDocument也可以直接document.getElementById("myframe&

跨域访问和同源策略

因为在同一个浏览器窗口中能够同时打开多个网站的页面,而且它们都处于同一个会话中,如果不禁止跨域访问则会造成用户隐私数据泄露和登录身份冒用的问题,所以浏览器会使用同源策略限制跨域访问. 在浏览器中,通过JS代码访问不同域名下的URL或者iframe时,会被禁止访问.而不是通过JS代码进行的跨域访问不存在跨域问题!比如跨域加载图片,引用JS文件,下载各种文件,使用iframe跨域嵌入其他网站的页面都是可以的. 跨域访问被禁止有时会给应用开发带来阻碍,但在符合特定条件时也有相应的方法在保证安全的情况下