gpt4 book ai didi

spring - 如何在 Spring Boot 中测试 CORS?当我在 MockMvcBuilders 中尝试时,它总是返回 200,尽管 Origin 是错误的

转载 作者:行者123 更新时间:2023-12-05 04:09:05 25 4
gpt4 key购买 nike

下面的测试(我包括了两个类以查看其中一个是否可以工作)都没有调用 Controller 的问题。我希望它因 CORS 问题而被拒绝,因为我没有添加任何 CORS 配置。 (然后我想使用 CORS 配置进行测试并通过)。

如何强制 CORS 失败?

第一次尝试:

import com.testing.Application;
import com.testing.config.ControllerConfig;
import com.testing.controller.MyController;
import com.testing.dto.TestDateResponse;
import com.testing.exception.GlobalExceptionHandler;
import com.testing.service.TestService;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.ConfigurableWebApplicationContext;

import java.time.LocalDate;

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
public class TestCORS
{
@Autowired
private ConfigurableWebApplicationContext context;

private MockMvc mockMvc;
private ObjectMapper objectMapper;

@InjectMocks
private MyController myController;

@Autowired
private RestTemplate restTemplate;

@Before
public void setup()
{
//Initialize our injected mocks
MockitoAnnotations.initMocks(this);

//Create a controller
myController = new MyController( new TestService(), restTemplate );

//Create an environment for it
mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.dispatchOptions(true)
.build();

//Create our marshaller
objectMapper = new ObjectMapper();
}

/**
* Tests that we fail when trying to access cross origin
* @throws Exception if json unmarshaller cannot parse the response
*/
@Test
public void testValidRequest() throws Exception
{
String request = "{\"asOfDate\":\"20170210\"}";

//Call to test a date
ResultActions actions = mockMvc.perform(
post("/v1/testdate")
.contentType(MediaType.APPLICATION_JSON)
.content(request)

//CORS HEADERS
.header("Access-Control-Request-Method", "DELETE")
.header("Origin", "https://evil.com")
);

actions.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8));

TestDateResponse response = objectMapper.readValue(actions.andReturn().getResponse().getContentAsString(), TestDateResponse.class);
assertThat(response, notNullValue());
// verify date has returned back correctly
assertThat(response.getRetDate(), equalTo(LocalDate.of(2017, 02, 10)));
}
}

第二次尝试:

import com.testing.config.ControllerConfig;
import com.testing.controller.MyController;
import com.testing.dto.TestDateResponse;
import com.testing.exception.GlobalExceptionHandler;
import com.testing.service.TestService;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.client.RestTemplate;

import java.time.LocalDate;

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ControllerConfig.class})
public class TestCORS
{
private MockMvc mockMvc;
private ObjectMapper objectMapper;
private MyController myController;

@Autowired
private RestTemplate restTemplate;

@Before
public void setup()
{
//Initialize our injected mocks
MockitoAnnotations.initMocks(this);

//Create a controller
myController = new MyController( new TestService(), restTemplate );

//Create an environment for it
mockMvc = MockMvcBuilders.standaloneSetup(myController)
.setControllerAdvice(new GlobalExceptionHandler())
.build();

//Create our marshaller
objectMapper = new ObjectMapper();
}

/**
* Tests that we fail when trying to access cross origin
* @throws Exception if json unmarshaller cannot parse the response
*/
@Test
public void testValidRequest() throws Exception
{
String request = "{\"asOfDate\":\"20170210\"}";

//Call to test a date
ResultActions actions = mockMvc.perform(
post("/v1/testdate")
.contentType(MediaType.APPLICATION_JSON)
.content(request)

//CORS HEADERS
.header("Access-Control-Request-Method", "GET")
.header("Origin", "http://www.someurl.com")
);
actions.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8));

TestDateResponse response = objectMapper.readValue(actions.andReturn().getResponse().getContentAsString(), TestDateResponse.class);
assertThat(response, notNullValue());
// verify date has returned back correctly
assertThat(response.getRetDate(), equalTo(LocalDate.of(2017, 02, 10)));
}
}

最佳答案

CORS 不是那样工作的。

要检查 CORS,必须对 URL 进行预检调用。这不是 POST,而是针对具有 CORS header 的相同 URL 的 OPTIONS 请求。

通过该调用,无论是否允许实际调用(针对 DELETE),您都将收到 CORS 响应。

类似的东西应该可以工作:

    ResultActions actions = mockMvc.perform(
options("/v1/testdate")
.contentType(MediaType.APPLICATION_JSON)
//CORS HEADERS
.header("Access-Control-Request-Method", "DELETE")
.header("Origin", "https://evil.com")
);

然后简单地断言预期的响应头。

关于spring - 如何在 Spring Boot 中测试 CORS?当我在 MockMvcBuilders 中尝试时,它总是返回 200,尽管 Origin 是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46677740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com