Вопрос по spring, spring-security, jsf-2 – JSF 2, Spring Security 3.x и Richfaces 4 перенаправляют на страницу входа в систему во время сеанса для запросов ajax

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  и внедрил подход сервлетов. решение работало в Firefox, а не в IE 8.

Может быть еще одна проблема, даже если она правильно перенаправлена для входа на страницу во время сеанса. Я ожидаю исключение ViewExpiredException при успешном входе в систему для ранее вызванного запроса AJAX.

Я хотел принести исключение ViewExpiredException, поскольку обе эти проблемы могли быть связаны друг с другом.

Любые решения / ведет будут оценены.

Ваш Ответ

2   ответа
6

вы можете использовать пользовательский 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. Если вы заинтересованы, вы можете посмотреть на этолог @ также, но я никогда не пробовал это, так как выше было намного проще.

FYI: Если вы не делаете Spring, есть много способов сделать это: Primefaces делает это на своем сайте.ссылк Или еще проще, импортировав банку с Omnifacesссылк

Мы перешли к клиенту STATE_SAVING_METHOD, поскольку наше приложение для внутренней сети, поэтому мы не получаем никаких исключений с просроченным просмотром. Но в любом случае я рад, что это помогло вам. Пожалуйста, отметьте принятый ответ, если он сработал для вас ... Ravi
Hi Рави, спасибо за решение. Это сработало для меня. Я сделал несколько изменений в стратегии перенаправления. сохранение текущего квеста в кеше запросов для не-AJAX-запросов, так что пользователь будет перенаправлен на предыдущий запрос при повторном входе в систему, однако мы не храним AJAX-запросы в кеше запросов до перенаправления. После входа в систему пользователь будет перенаправлен на домашнюю страницу по умолчанию. если ajax-запросы хранятся в кеше запросов, то наступает исключение просмотра с истекшим сроком действия. В идеале мы хотим, чтобы предыдущий ajax-запрос выполнялся, когда пользователь возвращался после истечения времени сеанса. Спасибо Рави J RAVI J
@ Ravi Спасибо за вдохновение, здесь есть моя реализация JsfRedirectStrategy banterCZ
0

Как установить собственную неверную стратегию сеанса в 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>

Похожие вопросы