0

Roman C. 请参阅我最近的评论。

---原始消息如下---

关于“已经提交的响应”有很多问题和答案,但我没有发现任何与我的问题相关的问题;特别是我的应用程序没有触及 ServletResponse。

我有一个 Struts2/Tiles2 应用程序在带有 2 个拦截器的 WebLogic 10.3.0 上运行,

  1. AuthenticationInterceptor 确保用户已登录并具有允许访问应用程序的角色。
  2. AgreementInterceptor 呈现用户协议页面。

这个拦截器对适用于我运行 WebLogic 10.3.0 的 Windows 笔记本电脑上的所有场景。

但是,在我们在 Linux 上运行的集群服务器上,当需要接受用户协议的用户登录时,我会收到“IllegalStateException:响应已提交”。当控制权返回到 AuthenticationInterceptor 时会发生错误。

不需要接受协议的用户,无论是因为他们具有永久授权的角色,还是因为他们具有主动接受,都不会收到此错误。

不同之处在于,当需要协议时,拦截器链由协议拦截器结束,协议拦截器返回“协议”,而不是从 ActionInvocation.invoke() 返回结果。

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<!-- Struts 2.3.34 with Tiles 2.2.2 -->
<struts>
  <constant name="struts.action.extension"                     value="action"/>
  <constant name="struts.configuration.xml.reload"             value="true"/>
  <constant name="struts.custom.i18n.resources"                value="i18n.layout,i18n.systemError"/>
  <constant name="struts.devMode"                              value="true"/>
  <constant name="struts.mapper.action.prefix.enabled"         value="true"/>
  <constant name="struts.mapper.action.prefix.crossNamespaces" value="false"/>
  <constant name="struts.ui.theme"                             value="simple"/>

  <package name="app-name" namespace="/" extends="json-default">
    <result-types>
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>
    </result-types>

    <interceptors>
      <interceptor name="app-user-auth" class="com.domain.app.interceptor.AuthenticationInterceptor"/>
      <interceptor name="agreement" class="com.domain.app.interceptor.AgreementInterceptor"/>
      <interceptor-stack name="main-stack">
        <interceptor-ref name="jsonValidationWorkflowStack"/>
        <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="app-user-auth"/>
      </interceptor-stack>

      <interceptor-stack name="second-stack">
        <interceptor-ref name="main-stack"/>
        <interceptor-ref name="agreement"/>
      </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="main-stack"/>

    <default-action-ref name="home_execute"/>

    <global-results>
      <result name="error">/public/jsp/systemError.jsp</result>
      <result name="denied">/public/jsp/accessDenied.jsp</result>
    </global-results>
    <global-exception-mappings>
      <exception-mapping result="error" exception="java.lang.Exception"/>
    </global-exception-mappings>

    <action name="home_*" method="{1}" class="com.domain.app.action.HomeAction">
      <interceptor-ref name="second-stack"/>
      <result name="success">/home.jsp</result>
      <result name="results" type="json"/>
      <result name="agreement" type="redirectAction">
        <param name="actionName">agreement_execute</param>
      </result>
    </action>

    <action name="agreement_*" method="{1}" class="com.domain.app.action.AgreementAction">
      <result name="success">/agreement.jsp</result>
      <result name="accepted" type="redirectAction">
        <param name="actionName">home_execute</param>
      </result>
    </action>

    ...

  </package>
</struts>

网页.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5"
  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name>AppName</display-name>

  <context-param>
    <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
    <param-value>/WEB-INF/config/tiles-def.xml</param-value>
  </context-param>

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
      <param-name>actionPackages</param-name>
      <param-value>com.domain.app.action</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
  </listener>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  ...

</web-app>

AuthenticationInterceptor.java:

public String intercept(ActionInvocation actionInvocation) throws Exception {
    Logger.debug(this, "intercept: Begin");
    boolean debug = Logger.canLogDebug(this);

    Map<String, Object> session = actionInvocation.getInvocationContext().getSession();

    User user = (User) session.get(Constants.SESSION_USER);
    if (user == null) {
        //This is the first time they are accessing the app.
        //Need to lookup the user and check functional entitlements.
        String employeeId = ServletActionContext.getRequest().getHeader(Constants.EMPLOYEE_ID);

        if (StringUtils.isNullOrEmpty(employeeId)) {
            Logger.warn(this, "No Employee ID in headers, access denied");
            return "denied";
        }

        try {
            Logger.debug(this, "Looking up User with employeeId " + employeeId);
            user = userDelegate.getUser(employeeId);
        } catch( Exception e) {
            Logger.error(this, "Exception looking up User with employeeId " + employeeId, e);
            return Action.ERROR;
        }

        if (user == null) {
            Logger.error(this, "User with employeeId " + employeeId + " was not found.");
            return "denied";
        }

        boolean hasFunction = false;
        for (FunctionalEntitlement function : FunctionalEntitlement.values()) {
            if (user.hasFunction(function)) {
                hasFunction = true;
                break;
            }
        }
        if (!hasFunction) {
            Logger.warn(this, "User " + employeeId +
                              " attempted to access App without an appropriate role.");
            return "denied";
        }

        session.put(Constants.SESSION_USER, user);
    }

    Action action = (Action)actionInvocation.getAction();
    if (action instanceof UserAware) {
        if (debug) {
            Logger.debug(this,
                    "Injecting user on the UserAware Action " +
                    action.getClass().getSimpleName());
        }

        ((UserAware)action).setUser(user);
    }

    if (debug) {
        Logger.debug(this,
                "calling ActionInvocation.invoke() for " +
                actionInvocation.getClass().getSimpleName());
    }
    String result = actionInvocation.invoke(); //****Line 156****
    if (debug) {
        Logger.debug(this, "ActionInvocation resultCode = " + actionInvocation.getResultCode());
        Logger.debug(this, "returning \"" + result + "\"");
        Logger.debug(this, "intercept: End");
    }
    return result;
}

协议拦截器.java:

    private static final int DEFAULT_EXPIRE_DAYS = 182;
    private static final List<String> requiresAgreement;
    private static final Map<String, String> agreementUrls = new HashMap<String, String>();
    private static final Map<String, Integer> agreementExpireDays = new HashMap<String, Integer>();

    ...

    public String intercept(ActionInvocation actionInvocation) throws Exception {
        Logger.debug(this, "intercept: Begin");
        boolean debug = Logger.canLogDebug(this);

        Map<String, Object> session = actionInvocation.getInvocationContext().getSession();

        Boolean agreementAccepted = (Boolean)session.get(Constants.AGREEMENT_ACCEPTED_OR_NOT_NEEDED);
        if (agreementAccepted != null && agreementAccepted) {
            if (debug) {
                Logger.debug(this,
                        "calling (1) ActionInvocation.invoke() for " +
                        actionInvocation.getClass().getSimpleName());
            }
            String result = actionInvocation.invoke();
            if (debug) {
                Logger.debug(this, "User agreement previously accepted or not required");
                Logger.debug(this, "ActionInvocation resultCode = " + actionInvocation.getResultCode());
                Logger.debug(this, "returning \"" + result + "\"");
                Logger.debug(this, "intercept: End");
            }
            return result;
        }

        User user = (User) session.get(Constants.SESSION_USER);
        Role[] userRoles = user.getAllRoles();

rolechk:
        for (Role role : userRoles) {
            String roleCode = role.getRoleType();
            if (requiresAgreement.contains(roleCode)) {
                if (debug) {
                    Logger.debug(this, "Role " + roleCode + " requires a user agreement");
                    Logger.debug(this, "Checking last agreement acceptance date");
                }

                Integer numDays = agreementExpireDays.get(roleCode);
                if (numDays == null) {
                    Logger.error(this,
                            "intercept: No expire days for role code " + 
                            roleCode + ", defaulting to " + DEFAULT_EXPIRE_DAYS);
                    numDays = DEFAULT_EXPIRE_DAYS;
                }

                for (DynamicAttribute attr : user.getDynamicAttributes()) {
                    if (Constants.APP_AGREEMENT_DATE_TYPE.equals(attr.getAttrType())) {
                        Calendar currDate = Calendar.getInstance();
                        Calendar acceptDate = null;
                        String acceptDateStr = attr.getAttrValuesAsList().get(0);
                        if (StringUtils.isNullOrEmpty(acceptDateStr)) {
                            // Treat this situation as if the agreement was never accepted
                            Logger.error(this,
                                    Constants.APP_AGREEMENT_DATE_TYPE +
                                    " dynamic attribute not set for user " + user.getEmployeeId());
                            // Invoke AccessAgreementAction
                            if (debug) {
                                Logger.debug(this, "returning \"agreement\"");
                                Logger.debug(this, "intercept: End");
                            }
                            return "agreement"; 
                        }

                        try {
                            acceptDate = Calendar.getInstance();
                            acceptDate.setTime(
                                  Constants.AGREEMENT_DATE_FORMAT.parse(acceptDateStr));
                            // The user acceptance expires numDays from the date of previous
                            // acceptance regardless of the time of day that the acceptance
                            // was executed
                            acceptDate.set(Calendar.HOUR_OF_DAY, 0);
                            acceptDate.set(Calendar.MINUTE, 0);
                            acceptDate.set(Calendar.SECOND, 0);
                            acceptDate.set(Calendar.MILLISECOND, 0);
                            acceptDate.add(Calendar.DATE, numDays);
                            if (currDate.before(acceptDate)) {
                                if (debug) {
                                    Logger.debug(this,
                                            "Prior acceptance date " + acceptDateStr +
                                            " for " + user.getEmployeeId() + 
                                            " is still valid");
                                }
                                // Agreement accepted recently, continue with action
                                break rolechk;
                            }
                        } catch (ParseException e) {
                            // Treat this situation as if the agreement was never accepted
                            Logger.error(this,
                                    "Found invalid " +
                                    Constants.APP_AGREEMENT_DATE_TYPE +
                                    " \"" + acceptDateStr + "\" for " + user.getEmployeeId());
                        }
                    }
                }
                // Need user to accept App User Agreement
                String agreementUrl = agreementUrls.get(roleCode);
                if (StringUtils.isNullOrEmpty(agreementUrl)) {
                    Logger.error(this,
                            "No agreement URL found for role " + roleCode +
                            ", treating as if agreement is not required");
                    break rolechk;
                }

                session.put(Constants.AGREEMENT_DOC_URL, agreementUrl);
                session.put(Constants.AGREEMENT_ROLE_CODE, roleCode);

                // Invoke AccessAgreementAction
                if (debug) {
                    Logger.debug(this, "agreementUrl = " + agreementUrl);
                    Logger.debug(this, "roleCode     = " + roleCode);
                    Logger.debug(this, "returning \"agreement\"");
                    Logger.debug(this, "intercept: End");
                }
                return "agreement"; 
            }
        }

        // User agreement not required, or previous acceptance is still valid.
        // Note that fact in the session.
        session.put(Constants.AGREEMENT_ACCEPTED_OR_NOT_NEEDED, Boolean.TRUE);
        if (debug) {
            Logger.debug(this,
                    "calling (2) ActionInvocation.invoke() for " +
                    actionInvocation.getClass().getSimpleName());
        }
        String result = actionInvocation.invoke();
        if (debug) {
            Logger.debug(this, "ActionInvocation resultCode = " + actionInvocation.getResultCode());
            Logger.debug(this, "returning \"" + result + "\"");
            Logger.debug(this, "intercept: End");
        }
        return result;
    }

日志文件内容:

2017-12-14 15:33:27,375|DEBUG |m.domain.app.interceptor.AuthenticationInterceptor|intercept: Begin
2017-12-14 15:33:27,375|DEBUG |m.domain.app.interceptor.AuthenticationInterceptor|Looking up user with employeeId E111385
2017-12-14 15:33:29,623|DEBUG |m.domain.app.interceptor.AuthenticationInterceptor|Injecting user on the UserAware Action com.domain.app.action.HomeAction
2017-12-14 15:33:29,623|DEBUG |m.domain.app.interceptor.AuthenticationInterceptor|calling ActionInvocation.invoke() for DefaultActionInvocation
2017-12-14 15:33:29,628|DEBUG |   com.domain.app.interceptor.AgreementInterceptor|intercept: Begin
2017-12-14 15:33:29,628|DEBUG |   com.domain.app.interceptor.AgreementInterceptor|Role BASIC_USER requires a user agreement
2017-12-14 15:33:29,628|DEBUG |   com.domain.app.interceptor.AgreementInterceptor|Checking last agreement acceptance date
2017-12-14 15:33:29,628|DEBUG |   com.domain.app.interceptor.AgreementInterceptor|agreementUrl = https://server.domain.com/userdocs/agreement.pdf
2017-12-14 15:33:29,629|DEBUG |   com.domain.app.interceptor.AgreementInterceptor|roleCode     = BASIC_USER
2017-12-14 15:33:29,629|DEBUG |   com.domain.app.interceptor.AgreementInterceptor|returning "agreement"
2017-12-14 15:33:29,629|DEBUG |   com.domain.app.interceptor.AgreementInterceptor|intercept: End
2017-12-14 15:33:29,678|ERROR |            jsp_servlet._public._jsp.__systemerror|java.lang.IllegalStateException: Response already committed
    at weblogic.servlet.internal.ServletResponseImpl.objectIfCommitted(ServletResponseImpl.java:1553)
    at weblogic.servlet.internal.ServletResponseImpl.sendRedirect(ServletResponseImpl.java:838)
    at org.apache.struts2.dispatcher.ServletRedirectResult.sendRedirect(ServletRedirectResult.java:257)
    at org.apache.struts2.dispatcher.ServletRedirectResult.doExecute(ServletRedirectResult.java:229)
    at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:191)
    at org.apache.struts2.dispatcher.ServletRedirectResult.execute(ServletRedirectResult.java:164)
    at org.apache.struts2.dispatcher.ServletActionRedirectResult.execute(ServletActionRedirectResult.java:182)
    at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:369)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:273)
==> at com.domain.app.interceptor.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:156)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.DeprecationInterceptor.intercept(DeprecationInterceptor.java:41)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:76)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.DateTextFieldInterceptor.intercept(DateTextFieldInterceptor.java:125)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:253)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:139)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.json.JSONValidationInterceptor.doIntercept(JSONValidationInterceptor.java:116)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:76)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.DeprecationInterceptor.intercept(DeprecationInterceptor.java:41)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.DateTextFieldInterceptor.intercept(DateTextFieldInterceptor.java:125)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    at org.apache.struts2.components.ActionComponent.executeAction(ActionComponent.java:288)
    at org.apache.struts2.components.ActionComponent.end(ActionComponent.java:172)
    at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:43)
    at jsp_servlet.__index._jsp__tag0(__index.java:106)
    at jsp_servlet.__index._jspService(__index.java:70)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:35)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
    at weblogic.servlet.internal.ServletStubImpl.onAddToMapException(ServletStubImpl.java:409)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:318)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:27)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:96)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3496)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

2017-12-14 15:33:29,678|ERROR |            jsp_servlet._public._jsp.__systemerror|Response already committed
4

0 回答 0