java - 是否可以互相翻译 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
.
解决方案
根据 Spring Docs:
ServerHttpRequest
接口实现是基于HttpServletRequest
接口的。
在继续之前需要注意两点:
ServerWebExchange.getRequest()
回报而org.springframework.http.server.reactive.ServerHttpRequest
不是org.springframework.http.server.ServerHttpRequest
。否则,你会得到java.lang.ClassCastException
. 所以,修改你的代码。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);
}
有关更多信息,请参阅文档。
推荐阅读
- javascript - 打开出现日历的功能
- ruby-on-rails - 如何将 Rails 根路由设置为 README.md?
- python - 将 Python 游戏结果存储在 .txt 文件中直到下一个程序运行?(Python 3.8)
- mongodb - 获取子数组的不同值作为附加属性
- python - Django REST framework api root 为空
- sql - 在最常见的列表中查找值的排名
- r - 如何在 R 中计算 maxDrawdown
- java - 如何打开gmail应用程序,而不是消息发送屏幕?
- python - 如何从 Python 中的文本文件中删除第一个空格?
- wpf - 如何在 XAML 中使用实例化为资源的对象