1、项目背景
在企业开发过程中,有时候需要手动调用线上服务的接口,我们的服务是通过cookie来保存登录态的,且接口做了身份验证,此时有两种情况:
- 接口是GET类型,则可以直接在浏览器地址栏输入接口地址即可访问
- 接口是POST或其它类型,则不能在浏览器地址栏直接访问
对于情形2,有如下方式可以解决:
- 通过postman等HTTP客户端,但需要手动将cookie同步到postman中,如果cookie较多则非常麻烦(ps:postman其实是有插件可以同步cookie的,但本质还是要做同步)
- 写一个js脚本,脚本中可用fetch方法发起网络请求,浏览器运行该脚本。由于是在浏览器中发起请求的,因此不需要同步cookie,但会受到浏览器同源政策的限制,该方法需要依赖服务端作跨域配置
综上所述,目前还没有一个十全十美的方法,于是我又调研了一下chrome插件(chrome扩展)是否有发起跨域请求的能力。
带着半信半疑的心态,首先我找到官方文档仔细阅读后,然后按照官方文档上的教程写了一个demo,运行后发现果然可以绕过浏览器同源政策发起跨域请求并自动携带cookie,基于这一核心能力自己也实现了一个模仿postman的HTTP Client chrome插件,既可以满足工作需要,又能提升自己的技术。
2、准备好服务端接口
服务端使用Spring Boot框架搭建,并编写了分别接收三种类型请求体的接口,分别是form-data、x-www-form-urlencoded和raw(Content-Type:application/json),另外还提供了一个可以新增cookie或修改cookie value的接口,有cookie才能测试chrome扩展发出的网络请求是否能自动携带cookie。
服务端接口如下所示:
ChromeController.java
package com.bobo.springbootbaseservice.chrome;
import com.bobo.springbootbaseservice.common.Json;
import com.google.common.collect.ImmutableMap;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
@RequestMapping("/chrome")
@RestController
public class ChromeController {
private static final Logger log = LoggerFactory.getLogger(ChromeController.class);
@GetMapping("/setCookie")
public void setCookie(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "city",required = false) String city,
@RequestParam(value = "company",required = false) String company){
if(!StringUtils.isEmpty(city)){
response.addCookie(new Cookie("city", city));
}
if(!StringUtils.isEmpty(company)){
response.addCookie(new Cookie("company", company));
}
}
@PostMapping("/jsonReq")
public Map<String,String> jsonReq(HttpServletRequest request,
@RequestParam(value = "username",required = false) String username,
@RequestParam(value = "date",required = false) String date,
@RequestBody(required = false) ChromeDto chromeDto){
return ImmutableMap.of(
"cookies",componentCookie(request),
"queryParams",String.format("username=%s&date=%s",username,date),
"requestBody",Json.serialization(chromeDto)
);
}
@PostMapping("/formUrlencodedReq")
public Map<String,String> formUrlencodedReq(HttpServletRequest request,
@RequestParam(value = "username",required = false) String username,
@RequestParam(value = "date",required = false) String date,
@RequestParam(value = "source",required = false) String source,
@RequestParam(value = "msg",required = false) String msg){
return ImmutableMap.of(
"cookies",componentCookie(request),
"queryParams",String
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 模仿postman自研的HTTP Client Chrome插件,可绕过浏览器同源政策发起跨域请求
发表评论 取消回复