복붙노트

[SPRING] JSF 2, Spring Security 3.x 및 Richfaces 4 ajax 요청에 대한 세션 시간 초과시 로그인 페이지로 리디렉션

SPRING

JSF 2, Spring Security 3.x 및 Richfaces 4 ajax 요청에 대한 세션 시간 초과시 로그인 페이지로 리디렉션

그것은 매우 일반적인 문제로 보인다. 그러나 나는 어떤 해결책을 찾을 수 없었다. Richafaces 4, Myfaces 2.0.5, Spring security 3.0.X를 사용하고 있습니다.

ajax / non-ajax 요청에 대한 세션 시간에, 사용자는 이전에 수행 된 ajax / non-ajax 작업을 다시 기록한 후에 로그인 페이지로 리디렉션되어야합니다.

우리는 아약스가 아닌 요청에 대해서는 어떤 문제도 직면하지 않고 있습니다. 그러나 아약스 요청의 경우 사용자는 로그인 페이지로 리디렉션되지 않습니다.

나는이 링크 https://community.jboss.org/message/729913#729913을 따라 갔으며 서블릿 접근법을 구현했다. 이 솔루션은 Internet Explorer 8이 아닌 Firefox에서 작동했습니다.

세션 시간 초과시 페이지에 로그인하도록 올바르게 리디렉션 된 경우에도 문제가 하나 더있을 수 있습니다. 이전에 호출 된 Ajax 요청에 대한 성공적인 로그인시 ViewExpiredException이 예상됩니다.

이 두 가지 문제가 서로 관련 될 수 있으므로 ViewExpiredException을 가져오고 싶습니다.

모든 솔루션 / 리드가 인정 될 것입니다.

해결법

  1. ==============================

    1.Spring Security 3.0.x를 사용하기 때문에 여기에 설명 된대로 custom sessionManagementFilter를 사용할 수있다.

    Spring Security 3.0.x를 사용하기 때문에 여기에 설명 된대로 custom 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"/>
    

    JSF RedirectStrategy 클래스의 유일한 변경 사항은 처음 몇 줄입니다.

    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에서도 작동합니다. 관심이 있다면이 블로그를 볼 수도 있지만 위와 같이 훨씬 쉽습니다.

    참고하시기 바랍니다 : 봄을하지 않으면 이렇게 할 수있는 방법이 많이 있습니다. Primefaces는 자신의 사이트에서이 작업을 수행합니다. 링크 또는 Omnifaces jar 링크를 가져 와서 더 간단합니다.

  2. ==============================

    2.나는 Ravi의 답변을 Spring Security에서 커스텀 무효 세션 전략을 설정하는 방법과 합병했다.

    나는 Ravi의 답변을 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>
    
  3. from https://stackoverflow.com/questions/10143539/jsf-2-spring-security-3-x-and-richfaces-4-redirect-to-login-page-on-session-tim by cc-by-sa and MIT license