5

我有一个安全事件类型,它将检查用户是否已登录,如果未登录,则将他们重定向到登录页面:

<event-types>
    <event-type name="securedPage">
        <before>
            <broadcasts>
                <message name="CheckLogin"/>
            </broadcasts>
        </before>
        <results>
            <result name="NeedLogin" do="page.login" redirect="true"/>
        </results>
    </event-type>
</event-types>

登录页面有一个链接到action.login事件处理程序的表单,如果登录成功,它将重定向到用户的主页,如果不是,则重新显示登录页面:

<event-handler name="action.login">
    <broadcasts>
        <message name="Login"/>
    </broadcasts>
    <results>
        <result name="LoggedIn" do="page.user.home" redirect="true"/>
        <result name="NotLoggedIn" do="page.login"/>
    </results>
</event-handler>

这段代码很好用,但我现在遇到的问题是它总是会重定向到用户的主页,即使他们请求了另一个页面。由于表单发布到action.login事件,并且结果do被硬编码为page.user.home,我如何修改我的代码以跟踪用户最初请求的页面并将它们重定向回那里?

4

2 回答 2

5

在用于确定用户是否需要登录的逻辑中,您可以获取当前事件并将其存储在共享范围(如会话范围)中。

然后,在成功登录后,只需调用 event.forward() 并传入该值。

于 2011-09-14T03:27:43.300 回答
0

这是一般的想法:

  1. 在任何方法/代码运行以“保护”您的页面时,如果用户未登录,请在转发它们之前获取他们尝试访问的 url 并将其设置回视图状态作为变量。CGI 范围将成为您的朋友,尤其是 CGI.query_string。

  2. 在您的登录/登录表单上,检查视图状态中的此“returnEvent”变量,并将其设置为表单上的隐藏值(如果存在)。

  3. 成功后在您的注册/注册过程中的某个地方,检查此“returnEvent”变量,如果存在,请转发用户。

于 2011-09-14T15:51:05.037 回答