当前位置: 首页 > 面试题库 >

JSF 2,Spring Security 3.x和Richfaces 4在会话超时时重定向到登录页面以处理ajax请求

唐睿
2023-03-14
问题内容

这似乎是一个非常普遍的问题。但是我找不到任何可行的解决方案。我们正在使用Richafaces 4,Myfaces 2.0.5和Spring security3.0.X。

在ajax / non ajax请求的会话时间上,应该将用户重定向到登录页面。登录回去后,应该向他显示先前执行的ajax / non ajax操作。

非ajax请求不会遇到任何问题。但是对于ajax请求,不会将用户重定向到登录页面。

我已实现了servlet方法。该解决方案只能在Firefox中使用,而不能在IE 8中使用。

即使在会话超时时正确重定向到登录页面,也可能会有另一个问题。我期望先前登录的ajax请求成功登录后会出现ViewExpiredException。

我想带来ViewExpiredException,因为这两个问题可能相互关联。

任何解决方案/线索,将不胜感激。


问题答案:

由于你使用的是Spring Security 3.0.x,因此可以按此处所述使用自定义sessionManagementFilter

com.icesoft.spring.security.JsfRedirectStrategy类在此处可用

如果你使用的是Spring Security 3.1.x,请进行以下更改

 <beans:bean id="sessionManagementFilter" class="org.springframework.security.web.session.SessionManagementFilter">
    <beans:constructor-arg name="securityContextRepository" ref="httpSessionSecurityContextRepository" />
            <!-- this permits redirection to session timeout page from javascript/ajax or http -->
    <beans:property name="invalidSessionStrategy" ref="jsfRedirectStrategy" />
</beans:bean>

<beans:bean id="jsfRedirectStrategy" class="com.icesoft.spring.security.JsfRedirectStrategy">
  <beans:constructor-arg name="invalidSessionUrl" value="/general/logins/sessionExpired.jsf" />
</beans:bean>
<beans:bean id="httpSessionSecurityContextRepository" class="org.springframework.security.web.context.HttpSessionSecurityContextRepository"/>

对JSFRedirectStrategy类的唯一更改是前几行:

public class JsfRedirectStrategy implements InvalidSessionStrategy {
protected final Log logger = LogFactory.getLog(getClass()); 
     private String invalidSessionUrl;
private boolean contextRelative;

public JsfRedirectStrategy(String invalidSessionUrl){
    this.invalidSessionUrl=invalidSessionUrl;
}

@Override
public void onInvalidSessionDetected(HttpServletRequest request,
        HttpServletResponse response) throws IOException, ServletException {
    String redirectUrl = calculateRedirectUrl(request.getContextPath(), invalidSessionUrl);

这也适用于IE8。如果你有兴趣,也可以查看此博客,但是我从未尝试过这样做,因为上面的操作要容易得多。

仅供参考:如果你不使用Spring,则有很多方法可以执行此操作:Primefaces在其站点上执行此操作。 或者通过导入Omnifaces jar 链接更简单



 类似资料:
  • 我使用的是和和。一切都很好,但是当会话超时的时候,我会得到以下错误”,因为我已经在布局的main.gsp文件中调用了session变量。现在,我希望在每次会话超时后重定向到登录页面,并且不显示错误页面。要在会话超时后重定向,我已经在文件中这样做了 但是有这么多页,所以很难写每一页。还有其他的方法做这件事吗?请帮忙。

  • 我在global.asax中尝试了以下代码,但不起作用,并导致Application_Error(“响应在此上下文中不可用。”)。

  • 我制作了一个非常简单的登录和会话结构,以便在未来基于JSP的应用程序中重用。是这样的: 而位于WebContent根目录的login.jsp页面有一个 表单,其中包含用于身份验证的专用innerHTML和一个用于接收会话超时或登录失败消息的${failure}字段。 这个结构对我来说很管用。它拦截、请求登录、检查会话和身份验证,等等,但有一个小缺陷:如果您在登录页面并在超时后刷新它(F5或在URL

  • 问题内容: 我正在使用ASP.NET MVC。我想在会话过期时重定向到登录页面。我该如何实现?如果我正在对控制器中的方法进行AJAX调用,那么如果在这种情况下我的会话期满,我也想重定向到登录页面。 问题答案: 您可以通过3种方式做到这一点: 为您的操作创建一个过滤器,并将其应用于OnActionExecuting中的代码编写(在执行操作之前),http://www.asp.net/mvc/tuto

  • 我现在一直在努力使用我的登录页面来让组件呈现Loggedin组件。我的前端是Reactjs,后端是NodeJS。我对nodejs、expression和react都是新手。 在loginform组件上,我使用fetch进行了一次post,它将用户名和密码传递给后端的相应endpoint。没问题。在后端,它读取我存储用户(不使用任何数据库)的jsonfile来查找匹配项,如果用户名和密码都匹配,则它

  • 问题内容: 但是当我使用AJAX调用提交时无法使用此功能 假设在一个primefaces对话框中,我正在使用AJAX发出发布请求,并且会话已经超时。我看到页面卡住了。 如何解决这种情况,以便在我使用AJAX发布时,可以将他重定向到我的视图过期页面,然后将他转发到登录页面,类似于上面的链接中的解决方案? JSF2 / Primefaces /玻璃鱼 问题答案: 默认情况下,ajax请求期间引发的异常