2012-04-13 29 views
5

Có vẻ như một vấn đề rất phổ biến. Nhưng tôi không thể tìm ra giải pháp làm việc nào. Chúng tôi đang sử dụng Richafaces 4, Myfaces 2.0.5 và Spring security 3.0.X.JSF 2, Spring Security 3.x và Richfaces 4 chuyển hướng đến trang đăng nhập vào phiên thời gian chờ cho các yêu cầu ajax

Thời gian phiên cho yêu cầu ajax/non ajax, người dùng phải được chuyển hướng đến trang đăng nhập. Sau khi đăng nhập lại, người dùng phải được hiển thị hoạt động ajax/non ajax đã thực hiện trước đó.

Chúng tôi không gặp phải bất kỳ vấn đề nào với yêu cầu không phải là yêu cầu. Nhưng đối với yêu cầu ajax, người dùng không được chuyển hướng đến trang đăng nhập.

Tôi đã theo liên kết này https://community.jboss.org/message/729913#729913 và phương pháp tiếp cận servlet đã triển khai. giải pháp đã hoạt động trong Firefox, không phải trong IE 8.

Có thể có thêm một vấn đề nữa ngay cả khi nó được chuyển hướng đúng cách để đăng nhập trang khi hết giờ. Tôi đang mong đợi một ViewExpiredException khi đăng nhập thành công cho yêu cầu ajax được gọi trước đó.

Tôi muốn mang lại ViewExpiredException vì cả hai vấn đề này có thể liên quan lẫn nhau.

Mọi giải pháp/khách hàng tiềm năng sẽ được đánh giá cao.

+0

phiên tùy chỉnhQuản lýFilter và chiến lược jsfredirect đã khắc phục vấn đề hết thời gian của phiên ứng dụng đối với yêu cầu ajax. Chúng tôi đang đối mặt với một vấn đề khác về thời gian của phiên SSO. SSO đang được sử dụng trong công ty của chúng tôi, id người dùng được chuyển vào tiêu đề yêu cầu cho ứng dụng. Giả sử phiên SSO hết hạn, phiên ứng dụng vẫn hoạt động, Bây giờ nếu người dùng thực hiện bất kỳ yêu cầu ajax nào thì SSO sẽ can thiệp và cố gắng chuyển hướng đến trang đăng nhập SSO. Ajax không thể phân tích cú pháp sso repsone và nó không phản hồi trên trang. Mọi giải pháp/khách hàng tiềm năng sẽ được đánh giá cao. Cảm ơn Ravi –

Trả lời

6

Vì bạn sử dụng Xuân An 3.0.x, bạn có thể sử dụng tùy chỉnh sessionManagementFilter như mô tả here

Lớp com.icesoft.spring.security.JsfRedirectStrategy có sẵn here

Nếu bạn đang sử dụng Xuân An 3.1 .x làm cho những thay đổi này

<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"/> 

sự thay đổi chỉ đến lớp JSFRedirectStrategy là vài dòng đầu tiên:

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); 

Tính năng này cũng hoạt động với IE8. Nếu bạn quan tâm, bạn cũng có thể xem số blog này, nhưng tôi chưa bao giờ thử điều này vì điều này dễ hơn nhiều.

FYI: Nếu bạn không làm Mùa xuân, có nhiều cách để thực hiện việc này: Thủ phạm thực hiện điều này trên trang web của họ. link Hoặc thậm chí đơn giản hơn bằng cách nhập Omnifaces jar link

+0

Hi Ravi, Cảm ơn bạn đã giải pháp. Nó đã làm việc cho tôi. Tôi đã thực hiện một số thay đổi trong phân tầng chuyển hướng.lưu yêu cầu hiện tại trong bộ nhớ cache yêu cầu cho các yêu cầu không ajax, để người dùng sẽ được chuyển hướng đến yêu cầu trước đó khi đăng nhập lại, tuy nhiên chúng tôi không lưu trữ các yêu cầu ajax trong bộ nhớ cache yêu cầu trước khi chuyển hướng. người dùng sẽ được chuyển hướng đến trang chủ mặc định sau khi đăng nhập lại. nếu yêu cầu ajax được lưu trữ trong bộ nhớ cache yêu cầu, sau đó xem ngoại lệ đã hết hạn đang đến. Lý tưởng nhất là chúng tôi muốn yêu cầu previuos ajax được thực hiện khi người dùng đăng nhập lại sau khi hết giờ. Cảm ơn Ravi J –

+0

Chúng tôi đã chuyển sang ứng dụng khách STATE_SAVING_METHOD vì ứng dụng của chúng tôi là một ứng dụng mạng nội bộ, vì vậy chúng tôi không nhận được bất kỳ ngoại lệ xem nào đã hết hạn. Nhưng dù sao tôi vui vì nó đã giúp bạn. Vui lòng đánh dấu câu trả lời được chấp nhận nếu nó đã làm việc cho bạn ... – Ravi

+0

@Ravi Cảm ơn bạn đã cảm hứng, ở đây có [triển khai thực hiện JsfRedirectStrategy của tôi] (https://gist.github.com/banterCZ/5160269) – banterCZ

0

tôi hợp nhất câu trả lời Ravi với How to set a custom invalid session strategy in Spring Security.

Nó sửa đổi bộ lọc thay vì tạo bộ lọc mới. Có thể chia thành nhiều lớp nếu bạn muốn.

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> 
Các vấn đề liên quan