Spring 注解面面通 之 @CrossOrigin 注解应用详解

https://blog.csdn.net/securitit/article/details/113251401

注意: springMVC的版本要在4.2或以上版本才支持

跨源资源共享(CORS),是由大多数浏览器实现的W3C规范,允许对跨域请求进行灵活授权,用来代替IFRAME或JSONP等非正规实现方式。

  @CrossOrigin是用来处理跨源资源共享(CORS)的注解。

  注解解析

  ① value:

    指定允许请求源列表,例如:value="http://example.com"。

    *表示允许来自任意请求源的请求。

    其值存储在响应标头Access-Control-Allow-Origin中。

    默认情况下,其值为*,允许来自任意请求源的请求。

    注意:CORS处理时,从Forwarded、X-Forwarded-Host、X-Forwarded-Port、X-Forwarded-Proto取请求源值。

  ② origins:

    value与origins含义相同,可以任选value和origins进行设置。

    value与origins若同时存在,两者的值需一致,否则启动时会出现异常。

Caused by: org.springframework.core.annotation.AnnotationConfigurationException: In annotation [org.springframework.web.bind.annotation.CrossOrigin] declared on public java.lang.String com.arhorchin.securitit.webannotations.CrossOriginController.crossOriginOrigins(java.util.Map) throws java.lang.Exception and synthesized from [@org.springframework.web.bind.annotation.CrossOrigin(maxAge=-1, methods=[], exposedHeaders=[], origins=[http://localhost:9299], allowedHeaders=[], value=[http://localhost:92991], allowCredentials=)], attribute 'origins' and its alias 'value' are present with values of [{http://localhost:9299}] and [{http://localhost:92991}], but only one is permitted.
1
  ③ allowedHeaders:

    指定允许实际请求标头列表,例如:allowedHeaders="Content-Type,Access-Token"。

    *表示允许实际请求带有任意标头。

    其值存储在响应标头Access-Control-Allow-Headers中。

    若为Cache-Control、Content-Language、Expires、Last-Modified、Pragma,则无需设置。

    默认情况下,其值为*,允许实际请求带有任意标头。

  ④ exposedHeaders:

    指定允许客户端(如浏览器)访问的响应标头列表,例如:exposedHeaders="Content-Length"。

    其值存储在实际CORS请求的响应头Access-Control-Expose-Headers中。

    默认情况下,只允许客户端访问:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。

​  ⑤ methods:

    指定允许请求的HTTP方法。

    默认情况下,允许请求的HTTP方法与@RequestMapping相同。

  ⑥ allowCredentials:

    指定其值,表示客户端(如浏览器)是否应将凭证(如Cookies)和跨域请求一起发送到服务器。

    其值存储在预处理响应标头Access-Control-Allow-Credentials中。

    注意:此选项与配置域建立了高级别的信任,由于公开敏感的信息(如Cookies或CSRF令牌),会增加Web应用程序受攻击的概率。

    默认情况下,此值不设置,因此不允许使用任何凭证。

  ⑦ maxAge:

    指定预处理响应的最大缓存期限,单位为秒。

    其值存储在预处理响应标头Access-Control-Max-Age中。

    其值设置合理可以有效减少客户端与服务器预处理请求的交互次数。

    其值为负,表示未定义。

    默认情况下,其值为1800秒(30分钟)。

  ⑧ DEFAULT_ORIGINS、DEFAULT_ALLOWED_HEADERS、DEFAULT_ALLOW_CREDENTIALS、DEFAULT_MAX_AGE:

    这些属性用于设置默认值,在Spring 5.0+版本中已废弃,由CorsConfiguration.applyPermitDefaultValues()方法来完成其功能。

  注解示例

  1) 建Controller,用来演示@CrossOrigin的使用方法。

package com.arhorchin.securitit.webannotations;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author Securitit.
 * @note 演示@CrossOrigin注解使用方法.
 */
@Controller
@RequestMapping("/WebAnnotations")
public class CrossOriginController {

    /**
     * logger.
     */
    private Logger logger = LoggerFactory.getLogger(CrossOriginController.class);

    /**
     * 未使用@CrossOrigin.
     */
    @ResponseBody
    @RequestMapping(
            value = "/UnCrossOrigin.do",
            method = RequestMethod.GET)
    public String unCrossOrigin(@RequestHeader Map requestHeaderMap) throws Exception {
        logger.info("@CrossOrigin use default value.");
        return "@CrossOrigin use default value.";
    }
    
    /**
     * 使用默认值的@CrossOrigin.
     */
    @ResponseBody
    @RequestMapping(
            value = "/CrossOrigin.do",
            method = RequestMethod.GET)
    @CrossOrigin
    public String crossOrigin(@RequestHeader Map requestHeaderMap) throws Exception {
        logger.info("@CrossOrigin use default value.");
        return "@CrossOrigin use default value.";
    }
    
    /**
     * 指定origins属性的@CrossOrigin.
     */
    @ResponseBody
    @RequestMapping(
            value = "/CrossOriginOrigins.do",
            method = RequestMethod.GET)
    @CrossOrigin(origins="http://localhost:9299")
    public String crossOriginOrigins(@RequestHeader Map requestHeaderMap) throws Exception {
        logger.info("@CrossOrigin with origins.");
        return "@CrossOrigin with origins.";
    }
    
    /**
     * 指定origins、allowedHeaders、exposedHeaders、allowCredentials属性的@CrossOrigin.
     */
    @ResponseBody
    @RequestMapping(
            value = "/CrossOriginOriginsAllowCredentials.do",
            method = RequestMethod.GET)
    @CrossOrigin(origins="http://localhost:9299", allowCredentials="true")
    public String crossOriginAllowedHeadersExposedHeadersAllowCredentials(@RequestHeader Map requestHeaderMap) throws Exception {
        logger.info("@CrossOrigin with origins、allowedHeaders、exposedHeaders、allowCredentials.");
        return "@CrossOrigin with origins、allowedHeaders、exposedHeaders、allowCredentials.";
    }

}

  2) 启动服务,使用端口9199。

  3) 使用《Spring 注解面面通 之 Http测试工具》中的工具页面,启动服务,使用端口9299。

  ① 访问http://localhost:9199/spring-annotations/WebAnnotations/UnCrossOrigin.do。

  ② 访问http://localhost:9199/spring-annotations/WebAnnotations/CrossOrigin.do。

  ③ 访问http://localhost:9199/spring-annotations/WebAnnotations/CrossOriginOrigins.do。

  总结

  Spring简化了@CrossOrigin开过过程中的配置,使得跨域请求处理更加便捷。
 

你可能感兴趣的:(Spring,java,spring,servlet)