1. 问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家。可能是考虑到前后端分离,前端后端服务器不在一台机器上,出现这种跨域访问的情况。正常情况下本地访问是没有问题,但是遇到这种非同一台服务器的情况下,就会报错 Access-Control-Allow-Origin 。具体报错内容不记得了。
  2. 问题解决方案一:采用添加拦截器的方式对请求添加跨域访问的头,允许跨域访问。
    package 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; public class CommonInterceptor extends HandlerInterceptorAdapter { private final static Logger logger = Logger.getLogger(CommonInterceptor.class); @Override
    public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
    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");
    return true;
    } @Override
    public void postHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler,
    ModelAndView modelAndView) throws Exception {
    logger.debug("==================================postHandle");
    } @Override
    public void afterCompletion(HttpServletRequest request,
    HttpServletResponse response, Object handler, Exception ex)
    throws Exception {
    logger.debug("==================================afterCompletion");
    }
    }

    上面是拦截器内容,下面是对拦截器的配置。

    package 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
    @Configuration
    public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override
    public void addInterceptors(InterceptorRegistry registry) {
    // TODO Auto-generated method stub
    registry.addInterceptor(new CommonInterceptor()).addPathPatterns("/getDOC");
    } }

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

    @ResponseBody
    @RequestMapping(value="/getDOC",method=RequestMethod.POST)
    public BaseReturn getDOC(@RequestBody MailEntity mailEntity, HttpServletRequest request, HttpServletResponse response, HttpSession httpSession){
    log.info("excute controllor HomeController.getDOC");
    BaseReturn baseReturn = new BaseReturn();

    String name = mailEntity.getName();
    String company = mailEntity.getCompany();
    String departments = mailEntity.getDepartments();
    String job = mailEntity.getJob();
    String email = mailEntity.getEmail();
    String phone = mailEntity.getPhone();
    String doc = mailEntity.getDoc();

    try {
    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("文档不能为空!");
    }
    } catch (Exception e1) {
    baseReturn.setCode(ReturnType.FAIL);
    baseReturn.setMsg(e1.getMessage());
    log.error(e1.getMessage());
    return baseReturn;
    }

    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 = {
    name:name,
    company:company,
    departments:departments,
    job:job,
    email:email,
    phone:phone,
    doc:'/doc/api.doc'
    }; var type = 'POST';
    var url = Config.host + url; $.ajax({
    url : url,
    data : JSON.stringify(params),
    type : type,
    contentType : "application/json",
    async : false,
    success : function(data) {
    //TODO 成功
    },
    error : function(data) {
    //TODO 失败
    }
    });
  3. 问题解决方案二:使用 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; $.ajax({
    url : url,
    type : 'get',
    async : false,
    dataType : "jsonp",
    jsonpCallback : "callback",
    success : function(data) {
    //TODO 成功
    },
    error : function(data) {
    //TODO 失败
    }
    });

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

    @ResponseBody
    @RequestMapping(value="/getDOC",method=RequestMethod.GET)
    public JSONPObject getDOC(HttpServletRequest request,String callback){ 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"); try {
    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("文档不能为空!");
    }
    } catch (Exception e1) {
    baseReturn.setCode(ReturnType.FAIL);
    baseReturn.setMsg(e1.getMessage());
    log.error(e1.getMessage());
    return new JSONPObject(callback, baseReturn);
    } MailEntity mailEntity = new MailEntity();
    mailEntity.setCompany(company);
    mailEntity.setDepartments(departments);
    mailEntity.setDoc(doc);
    mailEntity.setEmail(email);
    mailEntity.setJob(job);
    mailEntity.setName(name);
    mailEntity.setPhone(phone); try {
    iMailClent.sendHtmlMail(mailEntity);
    baseReturn.setCode(ReturnType.SUCCESS);
    } catch (Exception e) {
    e.printStackTrace();
    baseReturn.setCode(ReturnType.FAIL);
    baseReturn.setMsg("发送邮件失败!");
    log.error(e.getMessage());
    } return new JSONPObject(callback, baseReturn);
    }
  4. 今天得到高人指点,原来有一种更加简便的方法,可以实现。不过原理肯定都是一样的,通过给请求添加消息头来设置跨域访问,这点是无疑的。新的解决办法就是给controller或方法添加 @CrossOrigin 注解,具体详情请参考:http://spring.io/blog/2015/06/08/cors-support-in-spring-framework
    @ResponseBody
    @RequestMapping(value="/getDOC",method=RequestMethod.POST)
    @CrossOrigin //使用注解方式添加跨域访问消息头
    public BaseReturn getDOC(@RequestBody MailEntity mailEntity, HttpServletRequest request, HttpServletResponse response, HttpSession httpSession){
    log.info("excute controllor HomeController.getDOC");

    就这么多了吧,在网上看到还有添加过滤器的,当然都是差不多的做法。

spring boot 跨域访问处理的更多相关文章

  1. Spring Boot 跨域访问

    如何在 Spring Boot 中配置跨域访问呢? Spring Boot 提供了对 CORS 的支持,您可以实现WebMvcConfigurer 接口,重写addCorsMappings 方法来添加 ...

  2. SPRING BOOT跨域访问处理

    尊重原创:http://blog.csdn.net/ruiguang21/article/details/77878933 问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家 ...

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

    一.同源策略 同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 什么是源 源[orig ...

  4. spring boot跨域设置

    定义 跨域是指从一个域名的网页去请求另一个域名的资源 跨域背景 限制原因 如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题 为什么要跨域 公司内部有多个不 ...

  5. spring boot跨域问题

    跨域是指不同域名之间相互访问.跨域,指的是浏览器不能执行其他网站的脚本.它是浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制.也就是如果在A网站中,我们希望使用Ajax来获得B网站 ...

  6. spring boot 跨域请求

    场景 网站localhost:56338要访问网站localhost:3001的服务 在网站localhost:3001中增加CORS相关Java Config @Configuration @Ord ...

  7. SpringBoot 优雅配置跨域多种方式及Spring Security跨域访问配置的坑

    前言 最近在做项目的时候,基于前后端分离的权限管理系统,后台使用 Spring Security 作为权限控制管理, 然后在前端接口访问时候涉及到跨域,但我怎么配置跨域也没有生效,这里有一个坑,在使用 ...

  8. Spring Boot跨域解决方案

    一.什么是跨域 为保证浏览器的安全,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,这称之为同源策略,如果一个请求地址里的协议.域名.端口号都相同,就属于同源.依据浏览器同源策略,非同源脚 ...

  9. spring boot跨域问题的简便解决方案

    刚学spring boot的时候被跨域问题拦住好久,最终好不容易从网上抄了别人的极端代码才解决. 但是前些天看一同事的代码时,发现spring boot中用注解就可以解决. 在controller上添 ...

随机推荐

  1. GCC for Win32开发环境介绍

    http://blog.csdn.net/VisionCat/article/details/711693 http://blog.csdn.net/VisionCat/article/categor ...

  2. git hub

    如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:git stashgit pullgit stash pop然后可以使用git diff -w +文件名 来确认代码自动合并的情况 ...

  3. union内嵌struct用法

      // union内嵌struct用法 // 众所周知,union为联合体,struct为结构体.下面根据实例谈谈用法   #include <stdio.h>   #include & ...

  4. 如何透过HTC Vive拍摄Mixed Reality (混合现实)影片

    https://www.vive.com/cn/forum/1706?extra=page%3D1 也许你是一位开发者,想为自己的HTC Vive游戏制作酷炫的宣传片:或者你是游戏主播,想为观众带来高 ...

  5. 阿里云docker

    https://cr.console.aliyun.com docker 安装mysql image sudo docker pull  mysql docker  运行 mysql docker r ...

  6. 迷茫的it男,我该何去何从

    从去年7月份毕业,一直到现在已经快一年了.准确的说,我已经是工作两年的人了.第一份工作是HIS工程人员,主要负责医院系统部署维护实施工作,当初之所以找实施,也是迫不得已,退而求其次的想法,当时还是在校 ...

  7. 51nod 1181 质数中的质数(质数筛法)

    题目链接:51nod 1181 质数中的质数(质数筛法) #include<cstdio> #include<cmath> #include<cstring> #i ...

  8. google书签找回

    解决办法: 1.查找google文件夹,win7为例子:C:\Users\ZhangSan\AppData\Local\Google\Chrome\User Data 找到这个文件夹,ZhangSan ...

  9. 面向对象的高级编程&IO编程

    1.给类对象绑定的函数,只对这个对象生效, 而对类绑定的对象, 所有的对象都可以调用. 栗子: def set_score(self, score): self.score = score s.set ...

  10. 一个会Flash的人来说CSS3

    以前在上大学的时候学过Flash,而且以前做一些网页效果都是用的Flash,现在才知道以前我所用的方法是有多麻烦.在学过CSS3之后,我发现以前要用Flash写半天的效果,现在用几句CSS3代码就搞定 ...