簡単springbootでのFilter実装

# 目的
Filterで設定した状態でない場合に、特定にURLに遷移しようとするとフィルター機能を実装すること。
（例）ログインしていないユーザーがログインユーザー限定のURL（/userEdit/)などに入ろうとした場合、下記のように弾かれること。
![ログインフィルター 2023-09-28 164906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3185982/996dd646-7b01-b84f-03dc-dd234faf28b3.png)

# 実装手順
1.Filterの定義
2.FilterConfig.java（URLの適用設定）
3.まとめ 

# 1.Filterの定義
LoginFilter.java→フィルター機能の内容を記述。

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

```java
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では、まずログインチェックが行われ、その後に管理者権限チェックが行われる。
```java
@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を自己学習で学んでいます。備忘録として書いています。初心者なので間違いがあれば、ぜひコメントお願いします。また、別のやり方があればぜひ教えていただきたいです。