使用HttpServletRequest或RequestContextHolder或@RequestHeader获取http请求头信息

这篇具有很好参考价值的文章主要介绍了使用HttpServletRequest或RequestContextHolder或@RequestHeader获取http请求头信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录:392

场景:在微服务中获取http请求头信息方式,可以在代码中注入HttpServletRequest;可以使用Spring的RequestContextHolder,可以使用@RequestHeader注解。

版本:JDK 1.8,SpringBoot 2.6.3,springCloud 2021.0.1

1.使用HttpServletRequest获取请求头信息

1.1在微服务的Controller层获取请求头

本质就是使用注解@Autowired注入HttpServletRequest接口的实现对象。

@RestController
@RequestMapping("/hub/example/city")
@RefreshScope
@Slf4j
public class CityController {
  // 注入HttpServletRequest
  @Autowired
  private HttpServletRequest request;
  @PostMapping("/queryCityByCityId")
  public ResultObj<CityDTO> queryCityByCityId(String cityId) {
    // 从请求头取信息
    log.info("cityCode = " + request.getHeader("cityCode"));
    return ResultObj.data(200, new CityDTO(), "执行成功");
  }
}

1.2在微服务的其它类获取请求头

在微服务Service、Dao、或者其它类中,只要有@RestController、@Controller、@Service、@Component、@Repository等注解的类中,都可以注入HttpServletRequest方式获取请求头信息。

2.使用RequestContextHolder获取请求头信息

2.1关于RequestContextHolder

org.springframework.web.context.request.RequestContextHolder,是Spring获取请求上下文工具类。此类提供的静态方法可以获取请求头信息。

2.2使用RequestContextHolder

RequestAttributes reqAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) reqAttributes).getRequest();
String cityCode = request.getHeader("cityCode");

2.2使用场景

在任何Spring加载的类中均可以使用此类。

3.使用RequestContextHolder获取请求头信息

3.1关于@RequestHeader

org.springframework.web.bind.annotation.RequestHeader,spring注解。

3.2使用@RequestHeader

RestController
@RequestMapping("/hub/example/city")
@RefreshScope
@Slf4j
public class CityController {
  @PostMapping("/queryCityByCityId")
  public ResultObj<CityDTO> queryCityByCityId(@RequestParam("cityId") String cityId, @RequestHeader String cityNo) {
    log.info("cityNo = " + cityNo);
    return ResultObj.data(200, new Date(), "执行成功");
  }
}

3.3使用@RequestHeader时,OpenFeign接口需适当调整

使用@RequestHeader注解看上去很方便,一个注解解决。

但是,使用@RequestHeader时,OpenFeign接口需适当调整。

比如:

@FeignClient(contextId = "cityFeignService",
        value = "hub-example-301-nacos",
        fallbackFactory = CityFeignServiceFallbackFactory.class,
        configuration = {FeignConfiguration.class})
public interface CityFeignService {
  @PostMapping("/hub-301-nacos/hub/example/city/queryCityByCityId")
  ResultObj<CityDTO> queryCityByCityId(@RequestParam("cityId")String cityId);
}

4.关于Spring的HttpHeaders请求头对象

4.1HttpHeaders定义的属性

全称:org.springframework.http.HttpHeaders。

public static final String ACCEPT = "Accept";
public static final String ACCEPT_CHARSET = "Accept-Charset";
public static final String ACCEPT_ENCODING = "Accept-Encoding";
public static final String ACCEPT_LANGUAGE = "Accept-Language";
public static final String ACCEPT_PATCH = "Accept-Patch";
public static final String ACCEPT_RANGES = "Accept-Ranges";
public static final String ACCESS_CONTROL_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials";
public static final String ACCESS_CONTROL_ALLOW_HEADERS = "Access-Control-Allow-Headers";
public static final String ACCESS_CONTROL_ALLOW_METHODS = "Access-Control-Allow-Methods";
public static final String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin";
public static final String ACCESS_CONTROL_EXPOSE_HEADERS = "Access-Control-Expose-Headers";
public static final String ACCESS_CONTROL_MAX_AGE = "Access-Control-Max-Age";
public static final String ACCESS_CONTROL_REQUEST_HEADERS = "Access-Control-Request-Headers";
public static final String ACCESS_CONTROL_REQUEST_METHOD = "Access-Control-Request-Method";
public static final String AGE = "Age";
public static final String ALLOW = "Allow";
public static final String AUTHORIZATION = "Authorization";
public static final String CACHE_CONTROL = "Cache-Control";
public static final String CONNECTION = "Connection";
public static final String CONTENT_ENCODING = "Content-Encoding";
public static final String CONTENT_DISPOSITION = "Content-Disposition";
public static final String CONTENT_LANGUAGE = "Content-Language";
public static final String CONTENT_LENGTH = "Content-Length";
public static final String CONTENT_LOCATION = "Content-Location";
public static final String CONTENT_RANGE = "Content-Range";
public static final String CONTENT_TYPE = "Content-Type";
public static final String COOKIE = "Cookie";
public static final String DATE = "Date";
public static final String ETAG = "ETag";
public static final String EXPECT = "Expect";
public static final String EXPIRES = "Expires";
public static final String FROM = "From";
public static final String HOST = "Host";
public static final String IF_MATCH = "If-Match";
public static final String IF_MODIFIED_SINCE = "If-Modified-Since";
public static final String IF_NONE_MATCH = "If-None-Match";
public static final String IF_RANGE = "If-Range";
public static final String IF_UNMODIFIED_SINCE = "If-Unmodified-Since";
public static final String LAST_MODIFIED = "Last-Modified";
public static final String LINK = "Link";
public static final String LOCATION = "Location";
public static final String MAX_FORWARDS = "Max-Forwards";
public static final String ORIGIN = "Origin";
public static final String PRAGMA = "Pragma";
public static final String PROXY_AUTHENTICATE = "Proxy-Authenticate";
public static final String PROXY_AUTHORIZATION = "Proxy-Authorization";
public static final String RANGE = "Range";
public static final String REFERER = "Referer";
public static final String RETRY_AFTER = "Retry-After";
public static final String SERVER = "Server";
public static final String SET_COOKIE = "Set-Cookie";
public static final String SET_COOKIE2 = "Set-Cookie2";
public static final String TE = "TE";
public static final String TRAILER = "Trailer";
public static final String TRANSFER_ENCODING = "Transfer-Encoding";
public static final String UPGRADE = "Upgrade";
public static final String USER_AGENT = "User-Agent";
public static final String VARY = "Vary";
public static final String VIA = "Via";
public static final String WARNING = "Warning";
public static final String WWW_AUTHENTICATE = "WWW-Authenticate";
public static final HttpHeaders EMPTY = new ReadOnlyHttpHeaders(new LinkedMultiValueMap());
private static final Pattern ETAG_HEADER_VALUE_PATTERN = Pattern.compile("\\*|\\s*((W\\/)?(\"[^\"]*\"))\\s*,?");
private static final DecimalFormatSymbols DECIMAL_FORMAT_SYMBOLS;
private static final ZoneId GMT;
private static final DateTimeFormatter DATE_FORMATTER;
private static final DateTimeFormatter[] DATE_PARSERS;
final MultiValueMap<String, String> headers;

4.2HttpMethod定义的enum属性

全称:org.springframework.http.HttpMethod。

public enum HttpMethod {
  GET,
  HEAD,
  POST,
  PUT,
  PATCH,
  DELETE,
  OPTIONS,
  TRACE;
}

以上,感谢。

2023年3月24日文章来源地址https://www.toymoban.com/news/detail-686112.html

到了这里,关于使用HttpServletRequest或RequestContextHolder或@RequestHeader获取http请求头信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RequestContextHolder跨线程获取不到requests请求对象的解决方法

    最近在做一个项目,有个比较耗时的操作是启用线程进行异步操作,当时在启用的线程时,突然发现子线程无法获取父线程中的HttpServletRequest请求对象,因为是第一次遇到这种问题,所以记录一下解决方案。 在这里,我们简单模拟一下出现的问题。我们首先编写一个简单的

    2024年02月13日
    浏览(30)
  • @RequestHeader使用

      请求头参数的设置 在Postman的 Headers 中添加请求头参数,不过貌似不能加中文

    2024年02月13日
    浏览(21)
  • SpringBoot异步任务获取HttpServletRequest

    在使用框架日常开发中需要在controller中进行一些异步操作减少请求时间,但是发现在使用@Anysc注解后会出现Request对象无法获取的情况,本文就此情况给出完整的解决方案 @Anysc注解会开启一个新的线程,主线程的Request和子线程是不共享的,所以获取为null 在使用springboot的自定

    2024年02月21日
    浏览(40)
  • import javax.servlet.http.HttpServletRequest;HttpServletRequest request多处标红报错,如何解决?

    在做动态网页开发是,一不留神 javax.servlet.http.HttpServletRequest;HttpServletRequest request满屏标红报错。看下图   这是因为项目缺少两个jar依赖,分别是jsp-api.jar和servlet-api.jar ,我们按照如下操作导入即可快速解决。 右键项目--》Properties--》Java Build Path--》Libraries--》Add External JAR

    2024年02月12日
    浏览(33)
  • HttpServletRequest核心方法以及获取请求参数

    一. 展示HttpServletRequest中一些重要方法 当Tomcat 通过 Socket API 读取 HTTP 请求(字符串), 并且按照 HTTP 协议的格式把字符串解析成HttpServletRequest 对象. 创建一个ShowRequest类 通过 smart Tomcat 部署程序并在浏览器中通过URL http://127.0.0.1:8080/0310/ShowRequest访问, 可以看到如下结果: 由于 Que

    2024年02月16日
    浏览(25)
  • 【SpringBoot】获取HttpServletRequest的三种方式

    线程安全 缺点: 每个方法都需要写一遍 线程安全 在 Spring 中, DemoRequestController 的 scope 是 singleton (单例),也就是说在整个 web 系统中,只有一个 DemoRequestController ;但是其中注入的 request 却是线程安全的,原因在于:使用这种方式,当 Bean (本例的 DemoRequestController )初始化

    2024年02月12日
    浏览(35)
  • ServerHttpRequest 和 HttpServletRequest区别以及获取IP

    1区别 根据Spring Docs: ServerHttpRequest 接口实现基于 HttpServletRequest 接口。 一个名为 ServletServerHttpRequest 的类实现了 ServerHttpRequest 接口,它还有公共方法 getServletRequest() 来获取实际的 HttpServletRequest 在使用springboot的websocket时,我们需要获取url中的参数往往需要装换: 在网关接口中

    2024年02月12日
    浏览(33)
  • javax.servlet.http.HttpServletRequest.getHttpServletMapping()Ljavax/servlet/http/HttpServletMapping

    出现此类错误 需要检查各子项目中pom文件是否引用了重复的javax.servlet-api maven依赖导致。 如果项目是单体项目,检查是否引用org.springframework-spring-web依赖,必须移除掉移除嵌入式tomcat插件 检查controller层是否地址无误,本人是controller的接口不知道怎么删除掉了,导致一直出现

    2024年02月12日
    浏览(39)
  • SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式

    仅仅适用在controller方法上。当Spring接收到HTTP请求时,会寻找一个合适的方法来处理该请求。如果该方法参数上标注了@RequestMapping或@Get、@Post等注解,Spring就会将HttpServletRequest对象注入到该参数中。 适用于所有的bean 通过调试可以看到,注入的Reques是一个代理类,而这个被代

    2024年02月19日
    浏览(34)
  • Spring BOOT:javax.servlet.http.HttpServletRequest异常

     Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalStateException: No primary or single unique constructor found for interface javax.servlet.http.HttpServletRequest] with root cause                  用SpringBoot做验证码的时候,需要用HttpServletReque

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包