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. 转:C/C++程序员简历模板

    https://github.com/geekcompany/ResumeSample/blob/master/c.md 本简历模板由国内首家互联网人才拍卖网站「 JobDeer.com 」提供. ( ...

  2. ROS学习笔记(一)——软件版本的选择

    下面是Google的SLAM系统Cartographer对系统的要求: Cartographer对ROS版本要求: ROS Indigo 对Ubantu 的版本要求: 所以,综上所述: Ubantu ...

  3. excle表格生成网页

    用Dreamweaver可以方便生成和excle表格一样的代码. 复制excle,粘贴

  4. VB发送后台按键和组合键

    http://files.cnblogs.com/files/liuzhaoyzz/VB%E5%8F%91%E9%80%81%E5%90%8E%E5%8F%B0%E7%BB%84%E5%90%88%E ...

  5. 可靠UDP

    tcp为我们做了什么事情? 总得来说,tcp做了这几件事: 通过序列号和基于确认的超时重传机制,为上层提供了可靠的字节流服务: 通过滑动窗口.拥塞窗口提供了流量控制: 默认情况下,为了有效利用带宽,t ...

  6. asp.net Lodop实现批量打印

    1.列表(前台) <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="w_stu ...

  7. Ubuntu Server 安装桌面untiy

    1.安装 sudo apt-get install ubuntu-desktop sudo apt-get install unity sudo apt-get install unity-commo ...

  8. [转]C#中POST数据和接收的几种方式

    POST方式提交数据,一种众所周知的方式: html页面中使用form表单提交,接收方式,使用Request.Form[""]或Request.QueryString[" ...

  9. MD5加密代码

    import java.security.MessageDigest;public class MD5_tes { public final static String MD5(String s){ ...

  10. myhandle

    #ifndef my_handle_h #define my_handle_h #include <stdint.h> #include "mydef.h" #incl ...