2

Grails 1.3.4 と Spring Security Core 1.0.1 を使用しています。

ページを再度ロードするときにログインするときに「remember me」オプションを選択すると、次のエラーが表示されます。

errors.GrailsExceptionResolver Error executing tag <g:render>: Error executing tag <sec:ifLoggedIn>: Cannot create a session after the response has been committed at D:/Workspace/steer/grails-app/views/templates/_header.gsp:18 at D:/Workspace/steer/grails-app/views/layouts/main.gsp:29
org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag <g:render>: Error executing tag <sec:ifLoggedIn>: Cannot create a session after the response has been committed at D:/Workspace/steer/grails-app/views/templates/_header.gsp:18 at D:/Workspace/steer/grails-app/views/layouts/main.gsp:29
at D__Workspace_steer_grails_app_views_layouts_main_gsp$_run_closure2.doCall(D__Workspace_steer_grails_app_views_layouts_main_gsp:66)
at D__Workspace_steer_grails_app_views_layouts_main_gsp$_run_closure2.doCall(D__Workspace_steer_grails_app_views_layouts_main_gsp)
at D__Workspace_steer_grails_app_views_layouts_main_gsp.run(D__Workspace_steer_grails_app_views_layouts_main_gsp:75)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag <sec:ifLoggedIn>: Cannot create a session after the response has been committed at D:/Workspace/steer/grails-app/views/templates/_header.gsp:18
at D__Workspace_steer_grails_app_views_templates__header_gsp.run(D__Workspace_steer_grails_app_views_templates__header_gsp:35)
... 4 more
Caused by: java.lang.IllegalStateException: Cannot create a session after the response has been committed
at D__Workspace_steer_grails_app_views_templates__header_gsp$_run_closure1.doCall(D__Workspace_steer_grails_app_views_templates__header_gsp:22)
at D__Workspace_steer_grails_app_views_templates__header_gsp$_run_closure1.doCall(D__Workspace_steer_grails_app_views_templates__header_gsp)
at grails.plugins.springsecurity.SecurityTagLib$_closure6.doCall(SecurityTagLib.groovy:130)
... 5 more

このエラーが発生する理由を知っている人はいますか?

_Hearer.gsp

        <%@ page import="com.mycompany.myapp.partymodel.roles.SystemUserRole" %>
    <sec:ifLoggedIn>
    <%
    def userId = session.SPRING_SECURITY_CONTEXT?.authentication?.principal?.id
    def userDetails = SystemUserRole.get(userId)
     %>
    <div class="mast_head">
        <ul>
            <li>Welcome ${userDetails?.party?.firstName}</li>
            <li> | </li>
            <li><a href="${createLink(controller: "systemUserRole", action: "editprofile")}">Profile</a></li>
            <li> | </li>
            <li><a href="${createLink(controller: "systemUserRole", action: "changepassword")}">Edit Password</a></li>
            <li> | </li>
            <li><a href="${createLink(controller: "logout", action: "index")}">Sign Out</a></li>
        </ul>
    </div>
    </sec:ifLoggedIn>
    <div id="grailsLogo" class="logo">
        <a href="http://www.mycompany.in/"><img src="${resource(dir:'images',file:'mycompany_trans.png')}" alt="Grails" border="0" height=67 /></a>
    </div>

LayoutTagLib.groovy

        package com.mycompany.myapp.layout
    import  com.mycompany.myapp.trips.Trip

    class LayoutTagLib {
        static namespace = "my"

          def header = { attrs ->
            Trip.withNewSession {
              sec.ifLoggedIn() {
                out << "<div class="mast_head">
        <ul>
            <li>Welcome ${userDetails?.party?.firstName}</li>
            <li> | </li>
            <li><a href="${createLink(controller: "systemUserRole", action: "editprofile")}">Profile</a></li>
            <li> | </li>
            <li><a href="${createLink(controller: "systemUserRole", action: "changepassword")}">Edit Password</a></li>
            <li> | </li>
            <li><a href="${createLink(controller: "logout", action: "index")}">Sign Out</a></li>
        </ul>
    </div>"
              }
            }
          }
    }
4

1 に答える 1

1

layoutsこれは、休止状態セッションがコミットされた後に SiteMesh によって処理されるため、その種のタグを使用することに関する制限だと思います。

解決策は、これをセッションにラップすることです (withNewSessionドメイン クラスのクロージャ)。何かのようなもの:

LayoutTagLib は TagLib であり、コマンド create-taglib で作成できます

grails create-tag-lib com.app.layout.LayoutTagLib

重要:「SomeDomain」をアプリケーションの既存のドメイン クラスに置き換えます。

class LayoutTagLib {
  static namespace = "my"

  def header = { attrs ->
    SomeDomain.withNewSession {
      sec.ifLoggedIn() {
        out << "Logged In"
      }
    }
  }
}

out、ページに印刷される html です。したがって、ヘッダーテンプレートにあるものに変更してください。

次に、_header.gspは正しいですか? <sec:ifLoggedIn>ブロックを taglib の呼び出しに置き換えるだけです。

<my:header />

編集:

クエリを の中にラップする必要がありますwithNewSession。また、代わりに taglib を呼び出すだけで、ヘッダーからコンテンツを削除します。ユーザーデータを取得するには、springSecurityService.

package com.mycompany.myapp.layout
import  com.mycompany.myapp.trips.Trip

class LayoutTagLib {
    //dependency injection of the plugin service
    def springSecurityService

    static namespace = "my"

      def header = { attrs ->

        Trip.withNewSession {

          sec.ifLoggedIn() {

            def userId = springSecurityService.currentUser.id
            def userDetails = SystemUserRole.get(userId)

            //better transform this in a private method or a template!
            out << """<div class="mast_head">
              <ul>
                <li>Welcome ${userDetails?.party?.firstName}</li>
                <li> | </li>
                <li><a href="${createLink(controller: "systemUserRole", action: "editprofile")}">Profile</a></li>
                <li> | </li>
                <li><a href="${createLink(controller: "systemUserRole", action: "changepassword")}">Edit Password</a></li>
                <li> | </li>
                <li><a href="${createLink(controller: "logout", action: "index")}">Sign Out</a></li>
              </ul>
            </div>"""              
           }
         }
      }
}

_header.gsp

<my:header/> <!-- This line will call your taglib!! -->
<div id="grailsLogo" class="logo">
        <a href="http://www.mycompany.in/"><img src="${resource(dir:'images',file:'mycompany_trans.png')}" alt="Grails" border="0" height=67 /></a>
    </div>
于 2013-03-01T14:37:56.407 に答える