5

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

在 ajax/non ajax 请求的会话时间,用户应该被重定向到登录页面。在重新登录后,他应该看到之前执行的 ajax/non ajax 操作。

我们没有遇到非 ajax 请求的任何问题。但是对于 ajax 请求,用户不会被重定向到登录页面。

我已关注此链接https://community.jboss.org/message/729913#729913 并实施了 servlet 方法。该解决方案在 Firefox 中有效,而不是在 IE 8 中。

即使在会话超时时将其正确重定向到登录页面,也可能存在更多问题。对于先前调用的 ajax 请求,我期待在成功登录时出现 ViewExpiredException。

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

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

4

2 回答 2

6

由于您使用 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链接更简单

于 2012-04-14T18:57:28.283 回答
0

我将 Ravi 的答案与How to set a custom invalid session strategy in Spring Security合并。

它修改过滤器而不是创建一个新过滤器。如果您愿意,也可以分成多个班级。

    public class JSFRedirectStrategy implements InvalidSessionStrategy,
    BeanPostProcessor {

/**
 * JSF header
 */
private static final String FACES_REQUEST_HEADER = "faces-request";

/**
 * URL
 */
private String invalidSessionUrl;

public void setInvalidSessionUrl(String invalidSessionUrl) {
    this.invalidSessionUrl = invalidSessionUrl;
}

/**
 * {@inheritDoc}
 */
@Override
public void onInvalidSessionDetected(HttpServletRequest request,
        HttpServletResponse response) throws IOException, ServletException {
    String ajaxRedirectXml;
    String requestURI;

    // Force nouvelle session
    request.getSession(true);

    if ("partial/ajax".equals(request.getHeader(FACES_REQUEST_HEADER))) {
        requestURI = request.getContextPath() + invalidSessionUrl;
        requestURI = response.encodeRedirectURL(requestURI);
        ajaxRedirectXml = createAjaxRedirectXml(requestURI);
        response.setContentType("text/xml");
        response.getWriter().write(ajaxRedirectXml);
    } else {
        response.sendRedirect(response
                .encodeRedirectURL(getRequestUrl(request)));
    }
}

/**
 * Obtenir la requete qu'il voulait appeler
 * 
 * @param request
 * @return
 */
private String getRequestUrl(HttpServletRequest request) {
    StringBuffer requestURL;
    String queryString;

    requestURL = request.getRequestURL();
    queryString = request.getQueryString();
    if (!JavaUtil.isNullOrEmpty(queryString))
        requestURL.append("?").append(queryString);
    return requestURL.toString();
}

/**
 * XML redirect
 * 
 * @param redirectUrl
 * @return
 */
private String createAjaxRedirectXml(String redirectUrl) {
    return new StringBuilder()
            .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
            .append("<partial-response><redirect url=\"")
            .append(redirectUrl)
            .append("\"></redirect></partial-response>").toString();
}

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
        throws BeansException {
    SessionManagementFilter filter;
    if (bean instanceof SessionManagementFilter) {
        filter = (SessionManagementFilter) bean;
        filter.setInvalidSessionStrategy(this);
    }
    return bean;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
        throws BeansException {
    return bean;
}}
    <!-- Afin de gerer l'ajax lorsque spring redirige vers la page auth -->
<bean id="jsfRedirectStrategy" class="JSFRedirectStrategy" >
    <property name="invalidSessionUrl" value="/authentification.qc" />
</bean>
于 2015-08-30T18:46:20.750 回答