首页 > 解决方案 > 是否可以互相翻译 ServerHttpRequest 和 HttpServletRequest

问题描述

我现在正在使用spring cloud gateway,从spring can gateway过滤器中我可以得到这样的ServerHttpRequest来源org.springframework.http.server

ServerHttpRequest request = (ServerHttpRequest) exchange.getRequest();

但是公共库函数只接受HttpServletRequest包中的javax.servlet.http,是否可以翻译这两种类型的对象?还是我必须编写具有不同类型参数的重载函数?我应该用相同的功能实现两次吗?顺便说一句,这是我的公共职能:

public static void handleLoginCheck(HttpServletRequest httpServletRequest) {
    AutoHeaderInfoRequest autoHeaderInfoRequest = AuthUtil.getAutoHeaderInfoRequest(httpServletRequest);
    if (autoHeaderInfoRequest.getAccessToken() == null) {
        throw ServiceException.NOT_LOGGED_IN_EXCEPTION;
    }
    if (!AuthUtil.verifyAccessToken(autoHeaderInfoRequest.getAccessToken())) {
        throw GlobalException.ACCESS_TOKEN_INVALID_EXCEPTION;
    }
    setRequestGlobalHeader(autoHeaderInfoRequest);
}

这个函数和所有调用的函数都使用HttpServletRequest.

标签: javaspring

解决方案


根据 Spring Docs:

ServerHttpRequest接口实现是基于 HttpServletRequest接口的。


在继续之前需要注意两点:

  1. ServerWebExchange.getRequest()回报而org.springframework.http.server.reactive.ServerHttpRequest不是org.springframework.http.server.ServerHttpRequest。否则,你会得到java.lang.ClassCastException. 所以,修改你的代码。

  2. HttpServletRequest从这里返回是相当不可能的,org.springframework.http.server.reactive.ServerHttpRequest而且也是org.springframework.http.server.reactive.ServletServerHttpServlet一个私人班级,在这种情况下无济于事。以前,考虑到org.springframework.http.server.ServletServerHttpServlet我的方法是不好的。Spring 团队也不推荐在 webflux 应用程序中使用 servlet。


您必须重载公共方法并修改与 this 关联的方法调用:

public static void handleLoginCheck(ServerHttpRequest request) {
    HttpHeaders headers = request.getHeaders();
    if (headers.get("access_token") == null) {
        throw ServiceException.NOT_LOGGED_IN_EXCEPTION;
    }
    if (!AuthUtil.verifyAccessToken(headers.get("access_token"))) {
        throw GlobalException.ACCESS_TOKEN_INVALID_EXCEPTION;
    }
    setRequestGlobalHeader(headers);
}

有关更多信息,请参阅文档。


推荐阅读