第一步:问题原因
@Log4j2
public class CorsInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//这里可以不加,但是其他语言开发的话记得处理options请求
/**
* 非简单请求是对那种对服务器有特殊要求的请求,
* 比如请求方式是PUT或者DELETE,或者Content-Type字段类型是application/json。
* 都会在正式通信之前,增加一次HTTP请求,称之为预检。浏览器会先询问服务器,当前网页所在域名是否在服务器的许可名单之中,
* 服务器允许之后,浏览器会发出正式的XMLHttpRequest请求
*/
if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
return true;
}
//表示接受任意域名的请求,也可以指定域名 * 代表全部 这里要注意,如果request.getHeader("origin")为空,会报错。
String origin = request.getHeader("origin");
// ----------------------看这里-------------------------就是这里已经加了异常处理。
if(StringUtils.isEmpty(origin)){
log.error("此请求的origin={},默认为【*】,已经自动设置为【*】",origin);
origin = "*";
}
response.setHeader("Access-Control-Allow-Origin", origin);
//该字段可选,是个布尔值,表示是否可以携带cookie
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "*");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
第二步:解决方案
- 解决方案有两种,第一种就是在拦截器里面做判断。第二种是在MvcMock请求的时候加上origin的值。
/**
* 类描述:
*
* @author superMan
* @date 2021/5/14 09:51
*/
@Log4j2
@SpringBootTest(classes = {QcpApplication.class}) // 启动整个springBoot工程
@RunWith(SpringRunner.class)
public class AuthUserTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Autowired
private AuthUserService authUserService;
@Test
public void loginServiceTest(){
AuthUser user = new AuthUser();
user.setTelephone("13211112222");
user.setPassword("123456");
HashMap<String, String> res = authUserService.login(user);
log.error(res);
}
@Before
public void setupMockMvc(){
log.error("setupMockMvc");
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
@Transactional //开启事务功能
@Rollback // 事务回滚,默认是true
public void loginControllerTest() throws Exception {
HashMap<String,String> hm = new HashMap<>();
hm.put("email","33337@qq.com");
hm.put("password","1123123");
ResultActions resultActions = mockMvc.perform(
MockMvcRequestBuilders
.post("/api/v1/pri/user/login")
// ----------------------------看这里------------------------------
.header("origin","*")
.contentType(MediaType.APPLICATION_JSON)
.content(JSON.toJSONString(hm))
.accept(MediaType.APPLICATION_JSON)
);
// 设置响应值编码,否则中文会乱码。
resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8");
resultActions.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.jsonPath("$.code").value("20000"));
}
}