talosのプログラミング教室

【Java】URL直打ち対策

スポンサーリンク

こんにちは。talosです。

Webアプリを作っていると、会員ページなどログイン前にはアクセスさせたくないページがあると思います。

今回はそのような場合のアクセス制御の方法を紹介したいと思います。

環境

言語:Java
フレームワークJSF

解説

source/filter/LoginFilter.javaを見てみましょう。

package filter;

import java.io.IOException;

import javax.inject.Inject;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import logic.UserLogic;

public class LoginFilter implements Filter {

	@Inject
	private UserLogic lUser;

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO 自動生成されたメソッド・スタブ

		if (!lUser.loginStatus()) {
			// ログインしていない場合はトップページにリダイレクト
			HttpServletRequest req = (HttpServletRequest) request;
			HttpServletResponse res = (HttpServletResponse) response;
			res.sendRedirect(req.getContextPath() + "/faces/00.xhtml");
		} else {
			// ログインしている場合は次のフィルタへ
			chain.doFilter(request, response);
		}
	}

}

ポイントは4点です。


ポイント

1.Filterをimplementsしている
2.doFilter()メソッドをオーバーライドしている
3.ログインしていない場合はトップページにリダイレクトする
4.ログインしている場合はchain.doFilter()メソッドを呼ぶ

InjectしているUserLogicクラスは自作のクラスです。

loginStatus()メソッドではログイン状態かどうかを判定しています。

falseが返ってきた場合はログインしていないため、適当なURLにリダイレクトしています。

一方で、trueが返ってきた場合はログインしているため、次のフィルタに移ります。


次に、WebContent/WEB-INF/web.xmlを見てみましょう(一部抜粋)。

<filter>
	<filter-name>Filter</filter-name>
	<filter-class>filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>Filter</filter-name>
	<url-pattern>/faces/01.xhtml</url-pattern>
</filter-mapping>

まず<filter>タグの中から見ていきます。

<filter-name>にはフィルタの名前を指定します。

<filter-class>には先程見たFilterをimplementsしたクラスのパスを指定します。

次に<filter-mapping>タグの中を見ていきます。

<filter-name>の中は<filter>タグの中の<filter-name>と同じ名前とします。

<url-pattern>には、<filter-class>で指定したクラスの中で行っている処理を適用するページのパスを指定します。

今回はログインしていない状態で01.xhtmlにアクセスしたときに制限したいため、/faces/01.xhtmlとしています。
(faceletsタグを使用していない場合は/facesは不要です。)

もしこの後に他のフィルタを適用したい場合は、続けて<filter>と<filter-mapping>のセットを用意してあげればよいです。

また、フォルダ内のページすべてにフィルタを適用したい場合は/faces/folder/*のようにします。


スポンサーリンク



実行

実際に動かしてみます。

まず、
ID:test
password:test
でログインしてください。

ログアウトボタンが表示されていればログインに成功しています。

f:id:talosta:20201125222021p:plain

この状態でアドレスバーにhttp://localhost:8080/WebFilter_Sample/faces/01.xhtmlと打ち込むと、

f:id:talosta:20201125222323p:plain

01.xhtml(ログアウトボタンが表示されているページ)が開けると思います。


次に、一度ログアウトして、

f:id:talosta:20201125222504p:plain

アドレスバーにhttp://localhost:8080/WebFilter_Sample/faces/01.xhtmlと打ち込むと、

f:id:talosta:20201125222548p:plain

01.xhtmlは開けず、最初のページから動かないと思います。

おわりに

今回はServletの@WebFilterアノテーションを使用して、URLの直打ち対策を行ってみました。

不明点がありましたら、コメントお願いします。