0
0

簡単springbootでのFilter実装

Posted at

目的

Filterで設定した状態でない場合に、特定にURLに遷移しようとするとフィルター機能を実装すること。
(例)ログインしていないユーザーがログインユーザー限定のURL(/userEdit/)などに入ろうとした場合、下記のように弾かれること。
ログインフィルター 2023-09-28 164906.png

実装手順

1.Filterの定義
2.FilterConfig.java(URLの適用設定)
3.まとめ

1.Filterの定義

LoginFilter.java→フィルター機能の内容を記述。

コードについて
doFilterメソッド→ここでフィルタリング処理を行っている。requestとresponseを引数として受け取り、チェーン内の次のフィルターまたはサーブレットにリクエストとレスポンスを渡す。
リクエストを型変換して、セッション情報を取得。下記でいうと、loggedInUserという属性が存在しなければ、セッションにエラーメッセージをセットし、ログインページにリダイレクトする。(loggedInUserはログイン成功時にセッションに入れられている設定)

public class LoginFilter implements Filter {
    @Autowired
    HttpSession httpSession;
    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {

        //型変換
        HttpServletRequest httpRequest = (HttpServletRequest)request;
        HttpServletResponse httpResponse = (HttpServletResponse)response;

        httpSession = httpRequest.getSession(false);

        if (httpSession != null && httpSession.getAttribute("loggedInUser") != null){
            chain.doFilter(httpRequest,httpResponse);
        } else {
            httpSession = httpRequest.getSession(true);
            //エラーメッセージをセット
            List<String> errorMessages = new ArrayList<>();
            errorMessages.add("ログインしてください");
            httpSession.setAttribute("errorMessages", errorMessages);
            //ログインページにリダイレクト
            httpResponse.sendRedirect("/login");
        }

    }

    @Override
    public void init(FilterConfig config) {
    }

    @Override
    public void destroy() {
    }

}

2.FilterConfig.java(URLの適用設定)

FilterConfig.java→どのFilterをどのURLに機能させるのか、フィルター対象のURLを記述する。
アノテーション
@Configuration→設定を記述するクラスに付与。今回ならFilterの設定を行うため、FilterConfig.javaに付ける。このクラスは@Beanを付与したメソッドで構成される事になる。@Beanとセットで使う。
@Bean→メソッド単位に付ける。

コードについて
bean.setFilter(new LoginFilter());→LoginFilterクラス(後述)のインスタンスが作成され、そのインスタンスがフィルターとして設定される。LoginFilter クラスの doFilter メソッドがフィルターチェーン内で呼び出され、リクエストの処理やリダイレクトなどの操作が実行される。
bean.addUrlPatterns("/userEdit/*");→どのURLの時に、LoginFilterを実行させるのかを設定する。この場合、/userEdit/*にフィルター機能が適用される。
bean.setOrder(1);→フィルターの優先順位を決めている。複数のフィルター機能(この場合だと、LoginFilterとAdminFilter)が実装されている/userEdit/ のようなURLでは、まずログインチェックが行われ、その後に管理者権限チェックが行われる。

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<LoginFilter> loginFilter() {
        FilterRegistrationBean<LoginFilter> bean = new FilterRegistrationBean<>();

        bean.setFilter(new LoginFilter());
        //ログイン情報が必要なURL
        bean.addUrlPatterns("/");
        bean.addUrlPatterns("/userAdd");
        bean.addUrlPatterns("/userEdit/*");
        bean.addUrlPatterns("/userList");
        bean.setOrder(1);
        return bean;
    }

    @Bean
    public FilterRegistrationBean<AdminFilter> adminFilter() {
        FilterRegistrationBean<AdminFilter> bean = new FilterRegistrationBean<>();

        bean.setFilter(new AdminFilter());
        //管理者権限が必要なURL
        bean.addUrlPatterns("/userEdit/*");
        bean.addUrlPatterns("/userAdd");
        bean.addUrlPatterns("/edit/*");
        bean.addUrlPatterns("/userList");
        bean.setOrder(2);
        return bean;
    }

3.まとめ

フィルター機能は簡単に設定できる。

終わりに

springbootを自己学習で学んでいます。備忘録として書いています。初心者なので間違いがあれば、ぜひコメントお願いします。また、別のやり方があればぜひ教えていただきたいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0