我有一个安全的事件类型,它将检查用户是否已登录,如果不是,则将其重定向到登录页面:
<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
,如何修改我的代码以跟踪哪个页面用户最初请求并将其重定向回那里?
答案 0 :(得分:5)
在用于确定用户是否需要登录的逻辑中,您可以获取当前事件并将其存储在共享范围(如会话范围)中。
然后,在成功登录后,只需调用event.forward()并传入该值。
答案 1 :(得分:0)
这是一般性的想法:
在任何方法/代码中运行以“保护”您的页面,如果用户未登录,请抓住他们尝试访问的网址并将其设置为视图状态作为变量之前< / strong>你转发他们。 CGI范围将是您的朋友,特别是CGI.query_string。
,在视图状态中检查此“returnEvent”变量,并将其设置为表单上的隐藏值(如果存在)。
成功后在您的注册/处理过程中的某个位置,检查此'returnEvent'变量,如果存在,请转发用户。