5

これは非常に一般的な問題のようです。しかし、私は実用的な解決策を見つけることができませんでした。Richafaces 4、Myfaces 2.0.5、Spring security 3.0.X を使用しています。

ajax/非 ajax リクエストのセッション時に、ユーザーはログイン ページにリダイレクトされる必要があります。再度ログインした後、以前に実行された ajax/非 ajax 操作が表示されます。

非 ajax リクエストで問題が発生することはありません。ただし、ajax リクエストの場合、ユーザーはログイン ページにリダイレクトされません。

このリンクhttps://community.jboss.org/message/729913#729913 をたどり、サーブレットアプローチを実装しました。このソリューションは IE 8 ではなく Firefox で機能しました。

セッション タイムアウト時にログイン ページに適切にリダイレクトされたとしても、もう 1 つの問題が発生する可能性があります。以前に呼び出された 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 はサイトでこれを行います。link または、Omnifaces jar をインポートすることでさらに簡単になりますlink

于 2012-04-14T18:57:28.283 に答える