spring boot 跨域访问处理
- 问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家。可能是考虑到前后端分离,前端后端服务器不在一台机器上,出现这种跨域访问的情况。正常情况下本地访问是没有问题,但是遇到这种非同一台服务器的情况下,就会报错 Access-Control-Allow-Origin 。具体报错内容不记得了。
- 问题解决方案一:采用添加拦截器的方式对请求添加跨域访问的头,允许跨域访问。
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 失败
}
}); - 问题解决方案二:使用 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);
} - 今天得到高人指点,原来有一种更加简便的方法,可以实现。不过原理肯定都是一样的,通过给请求添加消息头来设置跨域访问,这点是无疑的。新的解决办法就是给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 跨域访问处理的更多相关文章
- Spring Boot 跨域访问
如何在 Spring Boot 中配置跨域访问呢? Spring Boot 提供了对 CORS 的支持,您可以实现WebMvcConfigurer 接口,重写addCorsMappings 方法来添加 ...
- SPRING BOOT跨域访问处理
尊重原创:http://blog.csdn.net/ruiguang21/article/details/77878933 问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家 ...
- spring boot跨域请求访问配置以及spring security中配置失效的原理解析
一.同源策略 同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 什么是源 源[orig ...
- spring boot跨域设置
定义 跨域是指从一个域名的网页去请求另一个域名的资源 跨域背景 限制原因 如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题 为什么要跨域 公司内部有多个不 ...
- spring boot跨域问题
跨域是指不同域名之间相互访问.跨域,指的是浏览器不能执行其他网站的脚本.它是浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制.也就是如果在A网站中,我们希望使用Ajax来获得B网站 ...
- spring boot 跨域请求
场景 网站localhost:56338要访问网站localhost:3001的服务 在网站localhost:3001中增加CORS相关Java Config @Configuration @Ord ...
- SpringBoot 优雅配置跨域多种方式及Spring Security跨域访问配置的坑
前言 最近在做项目的时候,基于前后端分离的权限管理系统,后台使用 Spring Security 作为权限控制管理, 然后在前端接口访问时候涉及到跨域,但我怎么配置跨域也没有生效,这里有一个坑,在使用 ...
- Spring Boot跨域解决方案
一.什么是跨域 为保证浏览器的安全,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,这称之为同源策略,如果一个请求地址里的协议.域名.端口号都相同,就属于同源.依据浏览器同源策略,非同源脚 ...
- spring boot跨域问题的简便解决方案
刚学spring boot的时候被跨域问题拦住好久,最终好不容易从网上抄了别人的极端代码才解决. 但是前些天看一同事的代码时,发现spring boot中用注解就可以解决. 在controller上添 ...
随机推荐
- redhat samba匿名登录服务器搭建
smb服务器只需要yum install samba 安装起,并修改配置文件就可以匿名使用了. smb配置文件,这里允许匿名登录.红色部分代表我共享出来文件夹参数code [root@localh ...
- js做计算器
js文档: function count(){ var a var txt1=document.getElementById("txt1").value;//获取第一个输入框的值 ...
- React-redux-webpack项目总结之用到的Es6基本语法
地址:http://blog.csdn.net/lsgqjh/article/details/53454627 http://www.cnblogs.com/hujunzheng/p/6133648. ...
- 使用vs中的发布功能发布asp.net core项目时遇到ERROR_CERTIFICATE_VALIDATION_FAILED错误
今天将VS2015编制的一个asp.net core项目发布到服务器进行测试,使用的是vs中主菜单"生成"中的"发布"功能. 遇到了一个错误,在网上反复检索尝试 ...
- stopping NetworkManager daemon failed
1 初次安装NetworkManager时发现,无法将这个服务关闭 2 上网找了一圈,也没找到原因 3 重启服务器后就能正常关闭了 4 将该服务删除重装也能正常关闭 5 下回重装系统时再观察一下
- [转]IE8兼容Object.keys
转自:http://blog.sina.com.cn/s/blog_6d63cf160102vbsg.html 只需要加入 var DONT_ENUM = "propertyIsEnumer ...
- H5瀑布流如何实现
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 转:spl_autoload_register与autoload的区别详解
转:http://www.poluoluo.com/jzxy/201306/209614.html spl_autoload_register(PHP 5 >= 5.1.2)spl_autolo ...
- http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html(转载)(原作者:AstralWind)
Python正则表达式指南 本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优 ...
- WEB安全性测试
SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令 ...