Struts 2拦截器响应标头未设置

问题描述 投票:0回答:1

Struts 2.5.18

我遇到了在Struts 2拦截器中设置标头而客户端没有收到标头的问题。我在另一个Struts 2项目中使用完全相同的拦截器而没有问题。

我偶然发现这个帖子How can I configure HTTP Response Headers in a Struts2 Interceptor?有同样的问题并通过切换获得ServletActionContext.getResponse()的响应从调用上下文invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE)得到它来解决它

这最终得到了相同的标题结果仍然没有被发送回浏览器。我使用开发人员工具来监视响应标头,但它不存在。

此外,我在响应中调用setHeader()后立即调试消息,以查看响应是否包含使用containsHeader()的新标头。 containsHeader()导致FALSE,就像setHeader根本不工作一样。

有没有人对响应对象可能发生的事情有任何建议? intercept()方法如下

public String intercept(ActionInvocation invocation) throws Exception {
    String result = invocation.invoke();
    Boolean hasValidationErrors = Boolean.FALSE;
    Object action = invocation.getAction();
    if(action instanceof ValidationAware) {
        ValidationAware validationAware = (ValidationAware) action;
        hasValidationErrors = validationAware.hasErrors();

    }

    HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE);
    response.setHeader(VALIDATION_FLAG_HEADER_NAME, String.valueOf(hasValidationErrors));

    if (log.isDebugEnabled()) log.debug("Does response contain new header? " + response.containsHeader(VALIDATION_FLAG_HEADER_NAME));

    return result;
}

更新:应用Dave修复后的工作代码

  public String intercept(ActionInvocation invocation) throws Exception {

        invocation.addPreResultListener((actionInvocation, resultCode) -> {
            // perform operation necessary before Result execution
            Boolean hasValidationErrors = Boolean.FALSE;
            Object action = invocation.getAction();
            if(action instanceof ValidationAware) {
                ValidationAware validationAware = (ValidationAware) action;
                hasValidationErrors = validationAware.hasErrors();

            }

            HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE);
            response.setHeader(VALIDATION_FLAG_HEADER_NAME, String.valueOf(hasValidationErrors));

            if (log.isDebugEnabled()) log.debug("Does response contain new header? " + response.containsHeader(VALIDATION_FLAG_HEADER_NAME));

        });

        return invocation.invoke();
    }
java struts2 struts2-interceptors
1个回答
1
投票

您在调用invoke之后设置了标头,此时响应已经呈现。

来自https://struts.apache.org/core-developers/writing-interceptors.html

请记住,在调用结果之后(例如,在JSP被渲染之后),将返回invoke,这使得它非常适合像开放式会话视图模式这样的事情。如果你想在调用结果之前做某事,你应该实现一个PreResultListener

在调用invoke之前设置标题,或实现PreResultListener

© www.soinside.com 2019 - 2024. All rights reserved.