繁体   English   中英

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

[英]Struts 2 Interceptor Response Header Not Being Set

支撑杆2.5.18

我在Struts 2拦截器中设置标头时出现问题,客户端没有收到标头。 我在另一个Struts 2项目中使用完全相同的拦截器,没有任何问题。

我确实偶然发现了这篇文章如何在Struts2拦截器中配置HTTP响应标头? 它具有相同的问题,并通过将获取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();
    }

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

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

请记住,调用将在结果被调用后返回(例如,在渲染JSP之后),从而使其非常适合诸如打开会话中的视图模式之类的事情。 如果要在调用结果之前执行某些操作,则应实现PreResultListener

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM