Roman C. 请参阅我最近的评论。
---原始消息如下---
关于“已经提交的响应”有很多问题和答案,但我没有发现任何与我的问题相关的问题;特别是我的应用程序没有触及 ServletResponse。
我有一个 Struts2/Tiles2 应用程序在带有 2 个拦截器的 WebLogic 10.3.0 上运行,
- AuthenticationInterceptor 确保用户已登录并具有允许访问应用程序的角色。
- 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