spring - 如何在 HandlerInterceptor 中更改 HttpServletRequest 的标头值?
问题描述
所以如下我必须更改(覆盖)请求中一个标头的值。我有实现 HandlerInterceptor 的自定义拦截器。我尝试过使用 HttpServletRequestWrapper,我已经覆盖了 getHeader、getHeaders 和 getHeaderNames 方法来返回新值,但它似乎不起作用,或者我使用它的方式错误。有谁知道如何实现这一目标?我真的不想使用过滤器,它只用于一个特定的控制器,而不是每个请求。
所以我尝试过,这里是包装器:
static class RequestHeaderOverwriteWrapper extends HttpServletRequestWrapper {
private final String newHeader;
RequestHeaderOverwriteWrapper(final HttpServletRequest request, final String header) {
super(request);
this.newHeader = header;
}
@Override
public String getHeader(final String name) {
if (newHeader != null && "Header-To-Change".equals(name)) {
return newHeader;
}
return super.getHeader(name);
}
@Override
public Enumeration<String> getHeaders(final String name) {
if (newHeader != null && "Header-To-Change".equals(name)) {
return new IteratorEnumeration(Collections.singletonList(newHeader).iterator());
}
return super.getHeaders(name);
}
@Override
public Enumeration<String> getHeaderNames() {
final List<String> headerNames = new ArrayList<>();
final Enumeration<String> superHeaderNames = super.getHeaderNames();
while (superHeaderNames.hasMoreElements()) {
headerNames.add(superHeaderNames.nextElement());
}
if (newHeader != null && !headerNames.contains("Header-To-Change")) {
headerNames.add("Header-To-Change"); //this header needs to be present, its value has to be overridden
}
return new IteratorEnumeration(headerNames.iterator());
}
而且我不确定在 Interceptor, preHandle 方法中调用它:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//here the RequestHeaderOverwriteWrapper has to be used, but what is the correct way to make it work??
return true;
}
解决方案
这个问题是很久以前提出的,所以如果有人有同样的问题,我会在这里发布答案:你不能做我用拦截器尝试过的事情,他们不能改变现有标题的值,所以你必须使用过滤器和 RequestWrapper 就像我发布的问题一样。
推荐阅读
- php - opencart admin 中要求的页面级权限
- javascript - Ext JS 2.3 - 显示字段中的先前值 - 就像浏览器自动填充选择但不同
- r - R - ggplot() - 如何在绘图轴上对级别进行分组以表示对比假设
- entity-framework - 向 EntityFramework 项目添加迁移时出错
- webpack - 使用 Webpack 从 css 解析绝对路径
- vba - 使用 VBA 链接来自不同工作表的单元格
- ruby - 从 ruby 类运行 fastlane action 产生
- go - 有没有办法显示 Go 包的依赖关系图?
- javascript - 对于嵌套在彼此内部的循环
- server - 基于云或服务器的连接,用于在用户设备上显示来自服务器或云服务的数据