SPRING BOOT跨域访问处理
尊重原创:http://blog.csdn.net/ruiguang21/article/details/77878933
- 问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家可能是考虑到前后端分离,前端后端服务器不在一台机器上,出现这种跨域访问的情况。正常情况下本地访问是没有问题,但是遇到这种非同一台服务器的情况下,就会报错Access-Control-Allow-Origin。具体报错内容不记得了。
- 问题解决方案一:采用添加拦截器的方式对请求添加跨域访问的头,允许跨域访问。
包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; 公共 类 CommonInterceptor 扩展HandlerInterceptorAdapter { 私人 最终 静态 记录器记录器= Logger.getLogger(CommonInterceptor。类); @覆盖
公共 布尔 preHandle(HttpServletRequest请求,HttpServletResponse响应,对象处理程序)抛出异常{
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” );
返回 true ;
} @覆盖
公共 无效postHandle(HttpServletRequest请求,
HttpServletResponse响应,对象处理程序,
ModelAndView modelAndView)抛出Exception {logger.debug
( “================================== postHandle” );
} @覆盖
public void afterCompletion(HttpServletRequest request,
HttpServletResponse响应,对象处理程序,Exception ex)
抛出Exception {
logger.debug( “================================== afterCompletion” );
}
}- 上面是拦截器内容,下面是对拦截器的配置。
包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
@组态
公共 类 WebMvcConfig 扩展WebMvcConfigurerAdapter { @覆盖
public void addInterceptors(InterceptorRegistry registry){
// TODO自动生成的方法存根
registry.addInterceptor(new CommonInterceptor())。addPathPatterns(“/ getDOC” );
} }
然后就可以在控制器中使用他了,下面是我的控制器
我们可以通过调用
这个方法来实现一个简单的方法来实现这个方法,这个方法可以
用来实现一个简单的方法来实现这个方法
。
BaseReturn baseReturn = new BaseReturn(); 字符串名称= mailEntity.getName();
String company = mailEntity.getCompany();
字符串部门= mailEntity.getDepartments();
String job = mailEntity.getJob();
String email = mailEntity.getEmail();
String phone = mailEntity.getPhone();
String doc = mailEntity.getDoc(); 尝试{
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(“文档不能为空!”);
}
}赶上(例外E1){
baseReturn.setCode(ReturnType.FAIL);
baseReturn.setMsg(e1.getMessage());
log.error(e1.getMessage());
返回基地返回;
} 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 = {
名称:名称,
公司:公司,
部门:部门,
工作:工作,
电子邮件:电子邮件,
电话:电话,
doc: '/ doc/ api.doc'
};
var type ='POST' ;
var url = Config.host + url;
$就({
url:url,
数据:JSON.stringify(params),
键入:type,
contentType: “application / json” ,
async:false ,
成功:函数(数据){
// TODO成功
},
错误:函数(数据){
// 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; $就({
url:url,
键入: 'get' ,
async:false ,
dataType: “jsonp” ,
jsonpCallback: “回调” ,
成功:功能(数据){
// TODO成功
},
错误:函数(数据){
// TODO失败
}
});
限制调用方式为get,数据类型为jsonp。后端也必须响应JSONPObject对象。
@ResponseBody
@RequestMapping(value =“/ getDOC”,method = RequestMethod.GET)
公共JSONPObject getDOC(HttpServletRequest请求,字符串回调){ 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” ); 尝试{
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(“文档不能为空!” );
}
} 捕获(例外E1){
baseReturn.setCode(ReturnType.FAIL);
baseReturn.setMsg(e1.getMessage());
log.error(e1.getMessage());
返回 新的JSONPObject(callback,baseReturn);
} MailEntity mailEntity = new MailEntity();
mailEntity.setCompany(公司);
mailEntity.setDepartments(部门);
mailEntity.setDoc(DOC);
mailEntity.setEmail(电子邮件);
mailEntity.setJob(工作);
mailEntity.setName(名称);
mailEntity.setPhone(电话); 尝试{
iMailClent.sendHtmlMail(mailEntity);
baseReturn.setCode(ReturnType.SUCCESS);
} 捕获(例外五){
e.printStackTrace();
baseReturn.setCode(ReturnType.FAIL);
baseReturn.setMsg( “发送邮件失败!” );
log.error(e.getMessage());
} 返回 新的JSONPObject(callback,baseReturn);
}
今天得到高人指点,原来有一种更加简便的方法,可以实现。不过原理肯定都是一样的,通过给请求添加消息头来设置跨域访问,这点是无疑的。新的解决办法就是给控制器或方法添加@CrossOrigin注解,具体详情请参考:http://spring.io/blog/2015/06/08/cors-support-in-spring-framework
@ResponseBody
@RequestMapping(value =“/ getDOC”,method = RequestMethod.POST)公共BaseReturn getDOC(@RequestBody MailEntity mailEntity,HttpServletRequest请求,HttpServletResponse响应,HttpSession httpSession){
@CrossOrigin // 使用注解方式添加跨域访问消息头 log.info( “执行控制器HomeController.getDOC”);
SPRING BOOT跨域访问处理的更多相关文章
- Spring Boot 跨域访问
如何在 Spring Boot 中配置跨域访问呢? Spring Boot 提供了对 CORS 的支持,您可以实现WebMvcConfigurer 接口,重写addCorsMappings 方法来添加 ...
- spring boot 跨域访问处理
问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家.可能是考虑到前后端分离,前端后端服务器不在一台机器上,出现这种跨域访问的情况.正常情况下本地访问是没有问题,但是遇到这种非 ...
- 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上添 ...
随机推荐
- [C#]获得WindowsForm上所有特定类型的控件
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...
- linux防火墙之 ufw
Usage: ufw COMMAND Commands: enable enables the firewall 开启ufw防火墙 disable disables the firewall 禁用防火 ...
- TCP/IP协议栈(三)——linux 向下的报文处理
应用程序连接服务器时,目的地套接字地址(端口号和IP地址)以参数形式传递给系统调用connect(tcp_v4_connect()).下面逐步介绍初始化该连接 检查内核路由表,查找给定目的地IP地址路 ...
- Java常用命令与参数设置
我介绍的JDK版本: 首先.介绍下JDK常用参数设置,如下是我个人环境的参数: -Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m 我们 ...
- JS中typeof和instanceof用法区别
typeof和instanceof都可以用来判断变量 1.typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果: number,boolean,string,functi ...
- Tomcat与SpringMVC结合分析(一)
关键字: Bootsrap,Catalina,Server,Service,Engine,Host,Context,Wrapper,Valve,Pipeline,ContextConfig,Servl ...
- angular4.0 路由守卫详解
在企业应用中权限.复杂页多路由数据处理.进入与离开路由数据处理这些是非常常见的需求. 当希望用户离开一个正常编辑页时,要中断并提醒用户是否真的要离开时,如果在Angular中应该怎么做呢? 其实Ang ...
- window.atob()与window.btoa()方法实现编码与解码
window.atob() 与window.btoa() WindowBase64.atob() 函数用来解码一个已经被base-64编码过的数据.你可以使用 window.btoa() 方法来编码一 ...
- curl -windows下接口通讯
1,下载curl -----url命令传输工具 2,配置curl环境变量 3,在cmd环境中使用 举例:curl -G http://xxxxxxx.com?+参数 使用:curl -G &quo ...
- Java学习笔记7---父类构造方法有无参数对子类的影响
子类不继承父类的构造方法,但父类的构造方法对子类构造方法的创建有影响.具体来说就是: ①.当父类没有无参构造方法时,子类也不能有无参构造方法:且必须在子类构造方法中显式以super(参数)的形式调用父 ...