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上添 ...
随机推荐
- 自动生成.py文件头部的C语言小程序
每次都 vi xxx.py 然后再打 #!/usr/bin/env python 等等的程序头信息感觉有点麻烦,于是便想着写一个小程序自动生成这些头信息了,顺便在 ~/.bashrc 里写入 alia ...
- IntrospectorCleanupListener作用
<!--web.xml--><listener> <listener-class>org.springframework.web.util.Introspector ...
- springMVC+mybatis+spring整合案例
1.web.xml a:配置spring监听,使web容器在启动时加载spring的applicationContext.xml <listener> <listener-class ...
- java 计算 1到10 的 阶层的和(采用递归的方法)
package hibernate; public class t { public static void main(String[] args) { System.out.println(jiec ...
- [CentOS 7] 安装nginx
下载对应当前系统版本的nginx包(package) # wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-cent ...
- C#中 Request, Request.params , Request.querystring , Request.Form 区别 与联系用法
C#中 Request, Request.params , Request.querystring , Request.Form 区别 与联系用法? Request.params , Request ...
- Java Integer(-128~127)值的==和equals比较产生的思考
最近在项目中遇到一个问题,两个值相同的Integer型值进行==比较时,发现Integer其中的一些奥秘,顺便也复习一下==和equals的区别,先通过Damo代码解释如下: System.out.p ...
- 原生javascript实现省市区三级联动
腾讯IP分享计划(http://ip.qq.com/)有个现成的三级联动功能,查看源码后发现可以直接使用其单独的JS文件(http://ip.qq.com/js/geo.js). 分析后发现自己需要写 ...
- 不断弹出svchost.exe错误框
同事的一台电脑,xp系统,启动后就弹出svchost错误的对话框,不论确定还是取消,关闭后立刻又弹出. 打开任务管理器,尝试对一些后安装的软件结束进程,结束一个,关闭一次,看看结束哪一个,关闭后不再弹 ...
- ZACC_DOCUMENT
method if_ex_acc_document~change. data: wa_extension type bapiparex, ext_value() type c, wa_accit ty ...