我有一个安全事件类型,它将检查用户是否登录,如果没有,则将其重定向到登录页面:
<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>
这段代码工作得很好,但我现在遇到的问题是,它将总是重定向到用户的主页,即使他们请求另一个页面。因为表单发送到动作。登录事件,结果do
硬编码到page.user.home
,我如何修改我的代码来跟踪用户最初请求的页面并将它们重定向到那里? 在用于确定用户是否需要登录的逻辑中,可以获取当前事件并将其存储在共享作用域(如会话作用域)中。
然后,在成功登录后,只需调用event.forward()并传入该值。
大致思路如下:
-
在任何方法/代码运行以"安全"您的页面,如果用户没有登录,抓住他们试图达到的url,并将其设置回viewstate作为变量之前你转发他们。在这里,CGI作用域将是您的朋友,特别是CGI.query_string。
-
在你的sign/log in表单中,检查viewstate中是否有这个'returnEvent'变量,如果它存在,将其设置为表单上的隐藏值。
-
在你的注册/登录过程成功后,检查这个'returnEvent'变量,如果它存在,转发用户。