It seems a very common problem. But I couldn\'t find any working solution. We are using Richafaces 4, Myfaces 2.0.5 and Spring security 3.0.X.
On session time for aj
I merge Ravi's answer with How to set a custom invalid session strategy in Spring Security.
It modify the filter instead of creating a new one. Can split in multiple class if you want too.
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("")
.append(" ").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;
}}