问题描述:在使用前后端分离的情况下,前端访问后端时会出现跨域问题

解决方式:

1.设置跨域

1)、单个控制器方法CORS注解

在单个方法中加入注解@CrossOrigin。

2)、整个控制器启用CORS注解

在整个控制器上添加注解@CrossOrigin,其中origins为跨域的Url链接,maxAge为允许跨域的时间。

3)、全局CORS配置(在ResourcesConfig重写addCorsMappings方法)

2.获得跨域参数 

    原因:跨域时实际上发送了两次请求,第一次为OPTIONS请求,第二次才是实际的GET/POST请求

  • OPTIONS请求中,不会携带请求头的参数,所以在拦截器上获取的请求头为空,自定义拦截器拦截成功
  • 第一次求情不能通过,就无法获得第二次的请求了(例如get/post等)
  • 只有第二次的请求带参数

    解决:

        1.处理第一次的请求

在拦截器中,如果请求为OPTION,则直接忽略:

1 String method = request.getMethod();
2 //判断是否是OPTIONS请求,如果是则忽略
3 if(HttpMethod.OPTIONS.toString().equals(method)){
4 return true;
5 }

2.获取参数

1).addInterceptors拦截

WebMvcConfigurer中有addInterceptors拦截方法

@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
@Resource
private VersionInterceptor versionInterceptor;
@Resource
private DeviceInterceptor deviceInterceptor;
//自定义拦截器
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(versionInterceptor).addPathPatterns("/**");
registry.addInterceptor(deviceInterceptor).addPathPatterns("/**");
} }

         实现DeviceInterceptor方法,获取参数

@Component
public class DeviceInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
//跳过请求为OPTION的请求
String method = request.getMethod();
//判断是否是OPTIONS请求
if(HttpMethod.OPTIONS.toString().equals(method)){
return true;
} //以参数device为例
String device = ServletUtil.getHeader(request, HeadConstant.DEVICE, CharsetUtil.UTF_8);
if(StringUilts.isEmpty(device)){
response.setContentType("application/json; charset=utf-8");
response.getWriter().print(JSONUtil.toJsonStr("请求参数不正确"));
return false;
}
return true;
}
}

  2)多滤器例子

//filterName:过滤器名字,   urlPatterns:拦截的url,/*是都拦截
@WebFilter(filterName = "tokenFilter", urlPatterns = {"/*"})
//注入容器,没有这个注解,过滤器无效
@Component
public class TokenFilter implements Filter {
/**
* 用于测试
*/
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss SSS"); @Override
public void init(FilterConfig config) throws ServletException {
log.info("过滤器TokenFilter初始化");
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse; // 响应标头指定 指定可以访问资源的URI路径
String origin = request.getHeader("Origin");
response.setHeader("Access-Control-Allow-Origin", origin);
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
// 设置 受支持请求标头(自定义 可以访问的请求头 例如:Token)
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization,token,Origin,Content-Type,Accept");
// 指示的请求的响应是否可以暴露于该页面。当true值返回时它可以被暴露
response.setHeader("Access-Control-Allow-Credentials", "true"); /**
* 发送两次请求
* 第一次是 request.getMethod()=OPTIONS
* 第二次 request.getMethod()=GET/POST。。。
* 如果是OPTIONS请求则放行
*/
if (HttpMethod.OPTIONS.toString().equals(request.getMethod())){
chain.doFilter(servletRequest, servletResponse);
} System.out.println("-----------------------------------------------");
System.out.println("到达过滤器,时间:" + simpleDateFormat.format(new Date()));
System.out.println("请求头中的Authorization:" + request.getHeader("Authorization"));
System.out.println("请求URL:" + request.getRequestURL());
System.out.println("请求方式:" + request.getMethod()); chain.doFilter(servletRequest,servletResponse);
} @Override
public void destroy() {
log.info("过滤器TokenFilter销毁");
} }

java跨域问题解决的更多相关文章

  1. django 前端请求跨域问题解决

    django 前端请求跨域问题解决 笔者之前在做django-restful-api开发的时候,在前端请求页面发送请求的时候直接出现301,域名重定向的问题,经过一番查阅资料,终于得到了非常完美的解决 ...

  2. Vue项目在开发环境跨域和生成环境部署跨域问题解决

    一.在dev环境下的跨域问题解决1.项目使用的是axios请求网络,将baseUrl修改为/api (这里是使用webpack提供的代理功能将/api代理成目标接口host) axios.defaul ...

  3. FastAdmin 关于跨域问题解决

    FastAdmin 关于跨域问题解决 之前很久之前收集到社区的问题. https://forum.fastadmin.net/thread/277 今天又有人问到,无法打开,估计是网络问题. 以下为完 ...

  4. vue跨域问题解决(生产环境)

    vue跨域问题解决(使用webpack打包的) 配置代理:(config下index.js文件) module.exports = { dev: { env: require('./dev.env') ...

  5. ajax请求ashx跨域问题解决办法

    ajax请求ashx跨域问题解决办法 https://blog.csdn.net/windowsliusheng/article/details/51583566 翻译windowsliusheng  ...

  6. vue中axios访问Java后端跨域问题解决

    问题背景: 前后端分离,前端选用Vue,后端选用Java,vue编译出的静态页面采用ngix发布,在前端访问后端时出现跨域问题. 解决方法: 跨域的问题解决方法有好多种,这里是通过服务端解决,以下是代 ...

  7. java 跨域

    jsonp做前端跨域需要服务器的支持的,造成json字符串前缀 var a=...或者 a[].... 实在有点麻烦,故还是后台跨域取数据好了 package com.pro.domain; impo ...

  8. web项目中的跨域问题解决方法

    一种是JSONP 一种是 CORS. 在客户端Javascript调用服务端接口的时候,如果需要支持跨域的话,需要服务端支持. JSONP的方式就是服务端对返回的值进行回调函数包装,他的优点是支持众多 ...

  9. Java跨域设置

    Access-Control-Allow-Origin 为允许哪些Origin发起跨域请求. 这里设置为"*"表示允许所有,通常设置为所有并不安全,最好指定一下. Access-C ...

  10. Java跨域问题的处理详解

    1,JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题? 答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策 ...

随机推荐

  1. java代码整洁之道

    package Day01;import org.junit.Test;import java.text.NumberFormat;import java.util.Scanner;public cl ...

  2. JS逆向实战3——AESCBC 模式解密

    爬取某省公共资源交易中心 通过抓包数据可知 这个data是我们所需要的数据,但是已经通过加密隐藏起来了 分析 首先这是个json文件,我们可以用请求参数一个一个搜 但是由于我们已经知道了这是个json ...

  3. 在CentOS7下安装Oracle11教程

    前言 安装oracle时,发现网上的文章总是缺少一些信息,导致安装不顺利,因为我对一些文章进行了整合,用以备忘. Oracle安装 首先下载linux版本的oracle安装文件,然后通过XFTP上传到 ...

  4. 洛谷 P3201 梦幻布丁 题解

    (这篇题解可能没什么营养,主要是记录一下我用map乱搞启发式合并的神奇做法) 首先我们知道,我们肯定要用一堆集合维护每一种数当前的位置,并支持合并和数连续出现的段数两种操作 我发现这个东西并不好搞,但 ...

  5. 【深入浅出 Yarn 架构与实现】2-3 Yarn 基础库 - 服务库与事件库

    一个庞大的分布式系统,各个组件间是如何协调工作的?组件是如何解耦的?线程运行如何更高效,减少阻塞带来的低效问题?本节将对 Yarn 的服务库和事件库进行介绍,看看 Yarn 是如何解决这些问题的. 一 ...

  6. Django更换数据库和迁移数据方案

    前言 双十一光顾着买东西都没怎么写文章,现在笔记里还有十几篇半成品文章没写完- 今天来分享一下 Django 项目切换数据库和迁移数据的方案,网络上找到的文章方法不一,且使用中容易遇到各类报错,本文根 ...

  7. JavaScrip基础学习笔记(一)

    一.三元表达式 1.1 什么是三元表达式 由三元运算符组成的式子我们称为三元表达式 1.2 语法结构 条件表达式 ? 表达式1 : 表达式2 1.3 执行思路 如果表达式为结果真 则返回表达式1的值, ...

  8. JAVA 用分苹果来理解本题

    思路 其实这是一道非常经典的分苹果问题:有m个一样的苹果和n个一样的盘子,把苹果放盘子里,每个盘子允许0-m个苹果,求问有多少种分法? 与本题的共通之点在于,输入的正整数可以看成m个苹果,拆分出的加数 ...

  9. selenium被某些网页检测不允许正常访问、登录等,解决办法

    网站通过什么方式检测 function b() { return "$cdc_asdjflasutopfhvcZLmcfl_"in u || d.webdriver } 通过上方的 ...

  10. i春秋xss平台

    点开是个普普通通的登录窗口,没有注册,只有登录,抓住包也没获取什么有用的信息,看了看dalao的wp才知道怎么做,首先抓包然后修改参数的定义来让其报错,pass原本的应该为整数,pass[]=就可以让 ...