目的
Filterで設定した状態でない場合に、特定にURLに遷移しようとするとフィルター機能を実装すること。
(例)ログインしていないユーザーがログインユーザー限定のURL(/userEdit/)などに入ろうとした場合、下記のように弾かれること。
実装手順
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を自己学習で学んでいます。備忘録として書いています。初心者なので間違いがあれば、ぜひコメントお願いします。また、別のやり方があればぜひ教えていただきたいです。