しろがねによる技術日記

メインはIT日記的な感じで書きますが、ほかにもいろいろ書きます

Spring-Security メモ

いつも SpringSecurityの Filter に何が適用されているか忘れるので備忘録

name source 内容 備考
FIRST
CHANNEL_FILTER ChannelProcessingFilter.java
SECURITY_CONTEXT_FILTER HttpSessionSecurityContextRepository.java
CONCURRENT_SESSION_FILTER ConcurrentSessionFilter.java
WEB_ASYNC_MANAGER_FILTER WebAsyncManagerIntegrationFilter.java
HEADERS_FILTER HeaderWriterFilter.java
CORS_FILTER CorsFilter.java
CSRF_FILTER CsrfFilter.java
LOGOUT_FILTER LogoutFilter.java
X509_FILTER X509AuthenticationFilter.java
PRE_AUTH_FILTER AbstractPreAuthenticatedProcessingFilter.java
CAS_FILTER CasAuthenticationFilter.java
FORM_LOGIN_FILTER UsernamePasswordAuthenticationFilter.java
OPENID_FILTER
LOGIN_PAGE_FILTER DefaultLoginPageGeneratingFilter.java
DIGEST_AUTH_FILTER DigestAuthenticationFilter.java
BASIC_AUTH_FILTER BasicAuthenticationFilter.java
REQUEST_CACHE_FILTER RequestCacheAwareFilter.java
SERVLET_API_SUPPORT_FILTER SecurityContextHolderAwareRequestFilter.java
JAAS_API_SUPPORT_FILTER JaasApiIntegrationFilter.java
REMEMBER_ME_FILTER RememberMeAuthenticationFilter.java
ANONYMOUS_FILTER AnonymousAuthenticationFilter.java
SESSION_MANAGEMENT_FILTER SessionManagementFilter.java
EXCEPTION_TRANSLATION_FILTER ExceptionTranslationFilter.java filter-security-interceptor
FILTER_SECURITY_INTERCEPTOR FilterSecurityInterceptor.java
SWITCH_USER_FILTER SwitchUserFilter.java
LAST

(Semantic-UI) GoogleMap挿入の仕方

GoogleMap定義

ここはいつも通り

  <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
  <script>
  $(document).ready(function() {
    var latlng = new google.maps.LatLng(35.68121300000001, 139.767294);
    var myOptions = {
      zoom: 17,
      center: latlng
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    marker = new google.maps.Marker({
        position: latlng,
        map: map
    });
  });
  </script>

Semantic-UI ui embed を使う

  <div class="ui vertical stripe segment" id="access">
    <div class="ui middle aligned stackable container">
      <div class="ui text container">
        <h3 class="ui header centered">
          <p>ACCESS</p>
        </h3>
      </div>
      <div class="ui embed" id="map_canvas">
      </div>
    </div>
  </div>

たぶん使い方違うんだろうけどなぁ。。。 semantic-ui.com

ページ内リンクのスクロール方法

Javascript

  <script>
    $(document).ready(function() {
      // #で始まるアンカーをクリックした場合に処理
      $('a[href^="#"]').click(function() {
        // スクロールの速度
        var speed = 1000; // ミリ秒
        // アンカーの値取得
        var href= $(this).attr("href");
        // 移動先を取得
        var target = $(href == "#" || href == "" ? 'html' : href);
        // 移動先を数値で取得
        var position = target.offset().top;
        // スムーススクロール
        $('body,html').animate({scrollTop:position}, speed, 'swing');
        return false;
      });
    });
  </script>

href=“#” は除外したい場合は、下記に置き換える

$('a[href*="#"]:not([href="#"]')

(Semantic-UI) 背景画像を固定にする

CSS

    .masthead {
      background-image: url("./img/bg.jpg") !important;
      background-repeat: no-repeat !important;
      background-size: cover !important;
      background-attachment: fixed !important;
    }

大事なのは、「!important」をつけてスタイルを優先させること

TERASOLUNA による初期構築

概要

TERASOLUNA 使って開発しようとしたときにいつも忘れるので備忘録

TERASOLUNAって?

NTT DATAさんがつくってる spring fw のライブラリ群
ガイドラインもしっかり作ってるので参考にしてます。
terasolunaorg.github.io

mybatis の genrator-plugin とがないのでその辺はいつもの自前のものを流用

初期構築

こんな感じの bat ファイルでさくっと作成

cd %~dp0
mvn archetype:generate -DinteractiveMode=false ^
                       -DgroupId=sample.group ^
                       -DartifactId=sample ^
                       -Dversion=1.0.0-SNAPSHOT ^
                       -Dpackage=sample.package ^
                       -DarchetypeGroupId=org.terasoluna.gfw.blank ^
                       -DarchetypeArtifactId=terasoluna-gfw-multi-web-blank-mybatis3-archetype ^
                       -DarchetypeVersion=5.0.1.RELEASE

追加項目

pom.xml

pom.xml に spring-session追加して、kvs とかでセッション管理。
kvsが使えないときは自前で拡張したDBセッションとかで管理

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session</artifactId>
    <version>1.0.2.RELEASE</version>
</dependency>

web.xml

session とか、listenerとかよしなに追加

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    <listener-class>org.terasoluna.gfw.web.logging.HttpSessionEventLoggingListener</listener-class>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <!-- Root ApplicationContext -->
    <param-value>
        classpath*:META-INF/spring/applicationContext.xml
        classpath*:META-INF/spring/spring-security.xml
        classpath*:META-INF/spring/spring-session.xml
    </param-value>
</context-param>

<filter>
    <filter-name>requestContextFilter</filter-name>
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>requestContextFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

あとは、特に考えなくても動いてくれる。

spring websocket による画像データ送信

概要

spring websocket でチャット中で画像送信しようとして、バイナリ送信はあきらめていろいろがんばったこと

client side

var file = document.querySelector('input[type="file"]').files[0];
var reader = new FileReader();
reader.onload = function(event){
    var loadedImageUri = event.target.result;
    stompClient.send("/app/room/" + varroomId, {}, JSON.stringify({'imgData': loadedImageUri}));
};
reader.readAsDataURL(file);

server side

下記でデータをbyteに変換して画像として保存する

String[] strs = message.getImgData().split(",");
byte[] binaryData = Base64.getDecoder().decode(strs[1]);

spring settings

websocket で connection を確立させた後なのでメッセージサイズなどは apache, tomcat をいじっても反映されないので
websocket:transport でサイズを指定する必要がある。
※要検討箇所

<websocket:message-broker application-destination-prefix="/app" >
    <websocket:transport message-size="2097152" send-buffer-size="2097152"></websocket:transport>
    <websocket:stomp-endpoint path="/endpoint" >
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/topic,/room" />
</websocket:message-broker>    

これでなんとか、データの送信はできた。
後は、クライアントに返す際に保存したパスを返却するかサイズが小さな画像のやりとしかないのなら
data:image/png;base64 など、Base64かけたもので返却するとよいかな