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上添 ...
随机推荐
- zsh下 home end 键失效的解决办法
我的环境是 centos 6.5 x64 安装 oh my zsh 后,home end 键失效,解决办法为在 .zshrc 里添加设置如下 #Rebind HOME and END to do th ...
- 01.JavaScript 面向对象精要--原始类型和引用类型
一.什么是类型 JavaScript 虽然没有类的概念.但依然存在两种类型:原始类型和应用类型. 原始类型保存为简单的数据值,引用类型则保存为对象,其本质是指向内存位置 的引用.也就是说:原始值被直接 ...
- SAP公司间采购订单关联交货单报表源代码(自己收藏)
SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF } ...
- 搜集资料&安装环境
开始入坑DSP,芯片是TI的TMS320C6678,硬件平台为TI官方的TMS320C6678L开发板. 官方给的资料有很多,各种用户手册.软件支持包,眼花缭乱.先尝试把开发环境搭起来,跑个Hello ...
- Scrapy--1安装和运行
1.Scrapy安装问题 一开始是按照官方文档上直接用pip安装的,创建项目的时候并没有报错, 然而在运行 scrapy crawl dmoz 的时候错误百粗/(ㄒoㄒ)/~~比如: ImportEr ...
- js页面跳转(含框架跳转)整理
js方式的页面跳转1.window.location.href方式 <script language="javascript" type="text/java ...
- Linux教程:Bash技巧,让chmod只修改某个目录下文件夹或者文件的权限
用Linux的人都知道chmod -R 可以修改一个文件夹下的所有文件和文件夹的权限,但是这也存在着一个很大的弊端,那就是修改的是所有的文件和文件夹的权限,如果我只想修改文件或文件夹的权限该怎么办呢? ...
- flume坑之channel.transactionCapacity和HdfsSink.batchSize
不说过程了,直接说结果!一对相连接的channel-HdfsSink,无意间配置如下:...agent.channels.common-channel.transactionCapacity=10.. ...
- it转行了
国庆节后毅然的辞职了,辞职的还发生一些不愉快的事情,原来希望好去好来却不慌而散.接着便开始找工作,有过工作经验,找工作是容易些,不像刚毕业那会什么企业都没人要.因为实在是对it没感觉,所以找的都是销售 ...
- gulp教程之gulp-minify-css
简介: 使用gulp-minify-css压缩css文件,减小文件大小,并给引用url添加版本号避免缓存.重要:gulp-minify-css已经被废弃,请使用gulp-clean-css,用法一致. ...