Websphere 7 で実行する JSF アプリケーションに j_security_check (コンテナ管理セキュリティ) を実装した方法を次に示します。残念ながら、私が使用しているサーブレット API バージョンには
request.login()
j_security_check 呼び出しをインターセプトするために、ログイン フィルタ クラスが作成されました。ResponseWrapper は、ログイン後にリダイレクトされる URL を記憶しています。
public class LoginFilter implements Filter {
private static String loginPage = "login.xhtml"; // read it from init config
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// create wrapper
HttpServletRequest req = (HttpServletRequest) request;
MyWrapper myRes = new MyWrapper((HttpServletResponse) response);
// call authentication
chain.doFilter(request, myRes);
// check for login error
String redirectURL = myRes.getOriginalRedirect();
if (StringUtils.isBlank(redirectURL) || redirectURL.contains(loginPage)) {
myRes.setOriginalRedirect(homePage);
}
myRes.sendMyRedirect();
}
class MyWrapper extends HttpServletResponseWrapper {
String originalRedirect;
public MyWrapper(HttpServletResponse response) {
super(response);
}
@Override
public void sendRedirect(String location) throws IOException {
// just store location, don’t send redirect to avoid
// committing response
originalRedirect = location;
}
// use this method to send redirect after modifying response
public void sendMyRedirect() throws IOException {
super.sendRedirect(originalRedirect);
}
public String getOriginalRedirect() {
return originalRedirect;
}
public void setOriginalRedirect(String originalRedirect) {
this.originalRedirect = originalRedirect;
}
}
web.xml は次のようになります。
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.servlet.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/j_security_check</url-pattern>
</filter-mapping>
<filter>
<filter-name>RequestJSFFilter</filter-name
<filter-class>com.servlet.filter.RequestJSFFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RequestJSFFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
すべての *.xhtml をインターセプトし、login.xhtml に転送する別のフィルター。login.xhtml では、フォームは次のようになります。
<form action="j_security_check" method=post>
<p>username: <input type="text" name="j_username"></p>
<p>password: <input type="password" name="j_password"></p>
<p><input type="submit" value="submit"></p>
</form>
お役に立てれば。