【问题标题】:Getting UT005023, UT010019 Response already commited on secure pages with Wildfly, Struts2 and convention plugin获取 UT005023、UT010019 响应已在 Wildfly、Struts2 和约定插件的安全页面上提交
【发布时间】:2016-04-09 01:01:07
【问题描述】:

这是我第一个使用 Struts2 的项目。我正在使用约定插件并在 Wildfly 上运行整个过程。我创建了一些操作,例如 user-registration.action,它们运行良好。但是,一旦我添加了安全性,我就开始在这个标题中收到错误。当我尝试登录时会发生这种情况。登录页面永远不会出现,而是出现错误。

这是我的 web.xml 的相关部分

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

<security-constraint>
  <web-resource-collection>
    <web-resource-name>SecurePages</web-resource-name>
    <description>All secure pages</description>
    <url-pattern>/secure/*</url-pattern>
    <http-method>POST</http-method>
    <http-method>GET</http-method>
  </web-resource-collection>
  <auth-constraint>
    <role-name>Security Admin</role-name>
  </auth-constraint>
  <user-data-constraint>
    <description>SSL not required</description>
    <transport-guarantee>NONE</transport-guarantee>
  </user-data-constraint>
</security-constraint>
<security-constraint>
  <display-name>No direct JSP access</display-name>
  <web-resource-collection>
      <web-resource-name>No-JSP</web-resource-name>
      <url-pattern>*.jsp</url-pattern>
  </web-resource-collection>
  <auth-constraint>
      <role-name>no-users</role-name>
  </auth-constraint>
</security-constraint>

<login-config>
  <auth-method>FORM</auth-method>
  <form-login-config>
    <form-login-page>/login.action</form-login-page>
    <form-error-page>/login-failed.action</form-error-page>
  </form-login-config>
</login-config>

这是显示主页的 Struts2 动作。有用。它映射到 /context/index.action,它在我的 web.xml 中的欢迎文件列表中

@Result(name = "success", type = "tiles", location = "index")
public class IndexAction extends ActionSupport
{
  public String execute() throws Exception
  {
    return SUCCESS;
  }
}

这是显示登录页面的代码。如果我直接访问它,例如 /context/login.action,它会成功显示登录页面。但是,如果我实际尝试登录,它不会显示。

@Result(name = "success", type = "tiles", location = "login")
public class LoginAction extends ActionSupport
{
  public String execute()
  {
    return SUCCESS;
  }
}

这是登录后要执行的 Struts2 操作。这映射到 /context/secure/secure-index.action。这是主页菜单栏上“登录”菜单项的href。

@Result(name = "success", type = "tiles", location = "secure_index")
public class SecureIndexAction extends ActionSupport
{
  public String execute() throws Exception
  {
    return SUCCESS;
  }
}

这是堆栈跟踪:

ERROR [io.undertow.request] (default task-5) UT005023: Exception handling request to /campaigner-security/login.action: java.lang.IllegalStateException: UT010019: Response already commited
at io.undertow.servlet.spec.HttpServletResponseImpl.sendError(HttpServletResponseImpl.java:124) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.spec.HttpServletResponseImpl.sendError(HttpServletResponseImpl.java:167) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:61) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.DisableCacheHandler.handleRequest(DisableCacheHandler.java:33) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:51) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:56) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_71]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_71]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_71]

如果直接使用,login.action 和 login-failed.action 工作正常。

我需要做什么来解决这个问题?

【问题讨论】:

  • 编辑显示它不是。我没有使用任何转发或重定向。
  • 这实际上不是真的,尤其是在 Struts2 中使用 Tiles。
  • 它肯定与 web.xml 文件中的“”元素有关,因为当我将其注释掉时,我能够访问受保护的页面。会不会是我在 Wildfly 中定义的安全域?看起来不错,但是除了部署一个使用它的应用程序之外,没有办法对其进行测试。
  • 要排除 Struts 的原因,请尝试一个普通的 JSP 页面。行得通,把你的注意力转移到 Struts 上。也许它在初始化页面/bean时抛出了一个异常,该页面/bean无意中被服务器内部的某个地方吞没了。

标签: security servlets jakarta-ee


【解决方案1】:
  1. 您可以将 Struts2 操作用于欢迎文件和登录后要访问的目标页面(例如,secure/index.action),并使用 Tiles 完成。
  2. 您不能对 form-login-page 或 form-error-page 使用 Struts2 操作。它们必须是 JSP
  3. 那些 JSP 不能包含 Tiles,因为它使用 Struts2
  4. 那些 JSP 不能在 WEB-INF/content 中,因为这又使用了 Struts2。

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多