Spring Security を利用してログインセッション管理を
している方も多いと思います。
Spring Securityデフォルトのままで使うと
アカウント作成後に一度ユーザにログインしてもらわないといけないとか
イケてないので、そういう時に自動でログインセッションを作成する方法です
アカウント作成後に次のようなメソッドを呼びます
AuthenticationProvideのBeanを指定します(自作クラスでも動きます)
@Autowired
AuthenticationProvider authenticationProvider;
HttpServletRequestを予め取得しておいて、username, passwordから
tokenを発行し、authenticationProviderに登録します
private void doAutoLogin(String username, String password,
HttpServletRequest request) {
try {
// Must be called from request filtered by Spring Security,
// otherwise SecurityContextHolder is not updated
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
username, password);
token.setDetails(new WebAuthenticationDetails(request));
Authentication authentication = this.authenticationProvider
.authenticate(token);
// logger.debug("Logging in with [{}]",
// authentication.getPrincipal());
SecurityContextHolder.getContext()
.setAuthentication(authentication);
} catch (Exception e) {
SecurityContextHolder.getContext().setAuthentication(null);
logger.error("Failure in autoLogin", e);
}
}
AutowiredしなくてもSecurityContextHolderからいけるかも
しれないですね。そのうちやってみよ。
2014年3月28日金曜日
2014年3月25日火曜日
Session Counter Listener
セッション数をカウントするServlet コンテナ用のListenerを自作したので共有
サービスのセッション数 を監視してーという人はどうぞ
thread safeなはず。 Java1.5以上必要です
SessionCounterListener.java:
public class SessionCounterListener implements HttpSessionListener {
private static AtomicInteger totalActiveSessions = new AtomicInteger();
public static int getTotalActiveSession() {
return totalActiveSessions.get();
}
@Override
public void sessionCreated(HttpSessionEvent arg0) {
totalActiveSessions.incrementAndGet();
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
totalActiveSessions.decrementAndGet();
}
}
web.xmlにはListenerとして登録
web.xml :
<listener>
<listener-class>my.package.SessionCounterListener</listener-class>
</listener>
サービスのセッション数 を監視してーという人はどうぞ
thread safeなはず。 Java1.5以上必要です
SessionCounterListener.java:
public class SessionCounterListener implements HttpSessionListener {
private static AtomicInteger totalActiveSessions = new AtomicInteger();
public static int getTotalActiveSession() {
return totalActiveSessions.get();
}
@Override
public void sessionCreated(HttpSessionEvent arg0) {
totalActiveSessions.incrementAndGet();
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
totalActiveSessions.decrementAndGet();
}
}
web.xmlにはListenerとして登録
web.xml :
<listener>
<listener-class>my.package.SessionCounterListener</listener-class>
</listener>
Cassandra3.x CQLでBlobを扱う
CassandraでのBlobの扱いに半日ぐらい使ったので覚書
Cassandra3.0、datastax driver 2.0
でCQLを利用してBlobを扱う場合、
bindにByteBufferをかまさないといけません。
それと、row.getBytes()で取得したByteBufferをそのままarray()しても
ゴミの入ったbyte[]になってしまいます。
なので、次のようにする
bind時
byte[] byteArray;
prepare(cql).bind(ByteBuffer.wrap(byteArray));
取得時
import com.datastax.driver.core.utils.Bytes;
byte[] byteArray = Bytes.getArray(row.getBytes("bytes"));
Cassandra3.0、datastax driver 2.0
でCQLを利用してBlobを扱う場合、
bindにByteBufferをかまさないといけません。
それと、row.getBytes()で取得したByteBufferをそのままarray()しても
ゴミの入ったbyte[]になってしまいます。
なので、次のようにする
bind時
byte[] byteArray;
prepare(cql).bind(ByteBuffer.wrap(byteArray));
取得時
import com.datastax.driver.core.utils.Bytes;
byte[] byteArray = Bytes.getArray(row.getBytes("bytes"));
登録:
投稿 (Atom)