首页 > 其他分享 >SpringMVC支持跨域访问详解

SpringMVC支持跨域访问详解

时间:2023-08-09 17:45:30浏览次数:39  
标签:Control 请求 SpringMVC 详解 import servlet response 跨域

跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求。这里有域名的不同,端口号的不同。
很多浏览器在发起跨域访问时是会询问用户是否需要发送该请求,或者干脆不发送跨域访问请求。(最好的办法是不使用ajax之类的,不要在前端发起跨域请求,在后台服务器发送该请求,可以使用Spring的RestTemplate)禁止跨域访问的原因是处于安全的考虑,但由的时候处于业务的需要,需要跨域访问。这里只讲解怎么处理服务端跨域的支持。

一、如果项目中使用的SpringMVC4.x以下,就需要对该请求配置Filter,设置请求头可支持跨域。使用方法:
1、web.xml配置

<!-- 跨域问题解决 -->
<filter>
    <filter-name>header</filter-name>
    <filter-class>com.foriseland.fsoa.pay.filter.HeaderFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>header</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

2、编写Filter拦截请求,添加跨域请求支持

package com.foriseland.fsoa.pay.filter;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 头部过滤器
 * @author 
 */
public class HeaderFilter implements Filter{
 
    public void destroy() {
        
    }
 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse) res;
        String originHeader = request.getHeader("Origin");
        response.setHeader("Access-Control-Allow-Origin", originHeader);
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");  
        response.setHeader("Access-Control-Max-Age", "0");  
        response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");  
        response.setHeader("Access-Control-Allow-Credentials", "true");  
        response.setHeader("XDomainRequestAllowed","1");   
        response.setHeader("XDomainRequestAllowed","1");   
        chain.doFilter(request, response);  
    }
 
    public void init(FilterConfig arg0) throws ServletException {
        
    }
}

 

二、如果项目中使用的SpringMVC4.x以上,那就简单了,从SpringMVC4.x开始,就增加了支持跨域访问。使用方法:
1、某个方法支持跨域访问
在方法上增加@CrossOrigin注解,如下:

@RequestMapping("/crossDomain2")  
@ResponseBody  
@CrossOrigin  
public String crossDomain2(HttpServletRequest req, HttpServletResponse res, String name){  
    ……  
    ……  
}

 

其中@CrossOrigin中的2个参数:

origins : 允许可访问的域列表

List of allowed origins, e.g. "http://domain1.com".   
These values are placed in the Access-Control-Allow-Origin header of both the pre-flight response and the actual response. "*" means that all origins are allowed.   
  
If undefined, all origins are allowed.

 

 

maxAge:飞行前响应的缓存持续时间的最大年龄(以秒为单位)。

The maximum age (in seconds) of the cache duration for pre-flight responses.   
This property controls the value of the Access-Control-Max-Age header in the pre-flight response.   
  
Setting this to a reasonable value can reduce the number of pre-flight request/response interactions required by the browser. A negative value means undefined.   
  
If undefined, max age is set to 1800 seconds (i.e., 30 minutes).
 

2、整个Controller都支持跨域访问,在类上面加上注解@CrossOrigin,如下:

@Controller  
@CrossOrigin  
public class TestController {  
    ……  
    ……  
}
 

3、自定义规则支持全局跨域访问,在spring-mvc.xml文件中配置映射路径,如下:

<mvc:cors>  
    <mvc:mapping path="/cross/*"/>  
</mvc:cors> 

如果整个项目所有方法都可以访问,则可以这样配置

<mvc:cors>    
    <mvc:mapping path="/**"/>    
</mvc:cors>

其中* 表示匹配到下一层

** 表示后面不管有多少层,都能匹配。

上面表示有/cross/路径的请求都支持跨域访问,也可以增加其它的,如下:


<mvc:cors>  
    <mvc:mapping path="/cross/**" allowed-origins="" max-age="2500"/>  
    <mvc:mapping path="/domain/**"/>  
</mvc:cors> 

请求路径有/cross/,方法示例如下:

@RequestMapping("/cross/crossDomain")  
@ResponseBody  
public String crossDomain(HttpServletRequest req, HttpServletResponse res, String name){  
    ……  
    ……  
}
 原文:https://codeleading.com/article/92111657889/

标签:Control,请求,SpringMVC,详解,import,servlet,response,跨域
From: https://www.cnblogs.com/xiaoliu66007/p/17617529.html

相关文章

  • ajax 跨域 如果在head里面加了参数需要在 nginx add_header 里面添加
    server{listen80;server_nameyourdomain.com;location/{#允许跨域请求add_header'Access-Control-Allow-Origin''*';add_header'Access-Control-Allow-Methods''GET,POST,OPTIONS'......
  • 【Spring | 事件监听详解】
    上篇Spring事件监听概述对Spring事件监听的机制有了个基本的了解。本篇来详细的解读下Spring的事件监听机制。(事件监听详解)ApplicationEvent  ApplicationEvent最重要的子类是ApplicationContextEvent抽象类,ApplicationContextEvent是spring容器Context生命周期......
  • 详解inline-block
    曾几何时,display:inline-block已经深入「大街小巷」,随处可见「display:inline-block;*display:inline;*zoom:1;」这样的代码。如今现代浏览器已经全面支持这个属性值了,上面的代码只是为了兼容IE6、7而已。那么你真的了解inline-block了吗?本文将带你深入剖析该属性值的前世......
  • 本地内存跟踪NMT详解
    \本地内存跟踪NMT详解​1.Overview为什么java程序消耗的内存,远超-Xms、-Xmx的限制?因为各种原因,或是为了进行某些优化,JVM会额外分配内存。这些额外的分配,会导致java程序占用的内存,超出-Xmx的限制。本文档列举了通常情况下,JVM会分配哪几部分内存,以及各部分调整大小的方法。......
  • Apache HttpComponents Client详解
     ApacheHttpComponentsClient(也称为HttpClient)是一个开源的Java库,用于发送HTTP请求并处理HTTP响应。它提供了一组易于使用的API,用于构建和执行HTTP请求,并处理请求和响应的各个方面,如URL处理、请求头、请求体、响应状态、响应内容等。下面是一些关于使用ApacheHttpComponentsCl......
  • Apache HttpComponents Client详解
     ApacheHttpComponentsClient(也称为HttpClient)是一个开源的Java库,用于发送HTTP请求并处理HTTP响应。它提供了一组易于使用的API,用于构建和执行HTTP请求,并处理请求和响应的各个方面,如URL处理、请求头、请求体、响应状态、响应内容等。下面是一些关于使用ApacheHttpComponentsCl......
  • Apache HttpComponents Client详解
    ​ ApacheHttpComponentsClient(也称为HttpClient)是一个开源的Java库,用于发送HTTP请求并处理HTTP响应。它提供了一组易于使用的API,用于构建和执行HTTP请求,并处理请求和响应的各个方面,如URL处理、请求头、请求体、响应状态、响应内容等。下面是一些关于使用ApacheHttpCompone......
  • Apache HttpComponents Client详解
    ​ ApacheHttpComponentsClient(也称为HttpClient)是一个开源的Java库,用于发送HTTP请求并处理HTTP响应。它提供了一组易于使用的API,用于构建和执行HTTP请求,并处理请求和响应的各个方面,如URL处理、请求头、请求体、响应状态、响应内容等。下面是一些关于使用ApacheHttpCompone......
  • visual studio 2022社区版安装图文详解
    0.社区版免费,功能够用1.官网下载VisualStudio2022IDE-适用于软件开发人员的编程工具(microsoft.com) 2.安装    等待   等待  安装成功会出现下面界面:  你有账号可以登录,没有可以创建,也可以选择暂时跳过此项。如果选择登录。 输入......
  • 硬盘SMART检测参数详解[转]
    一、SMART概述      要说Linux用户最不愿意看到的事情,莫过于在毫无警告的情况下发现硬盘崩溃了。诸如RAID的备份和存储技术可以在任何时候帮用户恢复数据,但为预防硬件崩溃造成数据丢失所花费的代价却是相当可观的,特别是在用户从来没有提前考虑过在这些情况下的应对措施时......