Struts1.3.5でログイン処理を作る
実装検討
- Filterを使ってログインしているかどうかを判定しアクセス制限する
- 画像やJavascriptやCSSファイルはOKにしたいので除外URIを設定できるようにする
- 除外URIは正規表現を使えるとうれしい(*ぐらいだけど・・・)
- ログイン用フォームを用意するしてそこからログインを行う
- ログインしているかどうかは確認用オブジェクトをSessionに入れて、そのオブジェクトの存在チェックで行う
- ログアウトではSessionを無効化する
ログインフィルタの作成
public class LoginFilter implements Filter {
private static final String CLASS_NAME = "LoginFilter";
private static final String USER_INFO = "USER_INFO";
private static final String EXCLUDE_PATH = "excludepath"; private static final String LOGIN_PATH = "loginpath";
private WebAppLogger logger = WebAppLogger.getInstance(); private String[] excludeArray; private String loginPath;
public void init(FilterConfig config) throws ServletException {
logger.startLog(CLASS_NAME, "init");
//web.xmlからパラメタを読み込む String excludePath = (String)config.getInitParameter(EXCLUDE_PATH); loginPath= (String)config.getInitParameter(LOGIN_PATH); //パスを分割 excludeArray = StringUtility.splitToArray(excludePath);
logger.trace(loginPath); logger.trace(excludePath); }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
logger.startLog(CLASS_NAME, "doFilter");
HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = (HttpSession) req.getSession();
if(session == null){ logger.trace("セッションがないのでログイン画面へ遷移"); res.sendRedirect(req.getContextPath() + loginPath); return; }
String target = req.getRequestURI(); logger.trace("target = " + target);
if(isExcludePath(target)){ logger.trace("除外URLなのでそのまま遷移"); chain.doFilter(req, res); return; }
UserInfo info = (UserInfo)session.getAttribute(USER_INFO); logger.trace("UserInfo = " + info);
if(info == null){ logger.trace("ログインしていないのでログイン画面へ遷移"); res.sendRedirect(req.getContextPath() + loginPath); return; }
logger.trace("ログインしているのでそのまま遷移"); chain.doFilter(req, res); return; }
private boolean isExcludePath(String target) {
logger.startLog(CLASS_NAME, "isExcludePath");
//パターンとリクエストされているURLを比較して判定 for(int i = 0; i < excludeArray.length; i++){ Pattern pattern = Pattern.compile("^" + excludeArray[i]); Matcher matcher = pattern.matcher(target); if(matcher.matches()){ return true; } }
return false; }
public void destroy() { }}
web.xml
excludepathには正規表現OKとする。
「/struts135/」はサンプルで作ったアプリのContextPath。これとログインページを除外に指定しないと、延々にリダイレクトが走って無限ループになっちゃう。
ディレクティブのerrorPageやStrutsのExceptionHandlerでの遷移は除外しなくてもフィルタを通らないらしい。
<filter> <filter-name>LoginFilter</filter-name> <filter-class> com.daipresents.struts135.filter.LoginFilter </filter-class> <init-param> <param-name>loginpath</param-name> <param-value>/login/login.jsp</param-value> </init-param> <init-param> <param-name>excludepath</param-name> <param-value> /struts135/,/struts135/index.jsp,/struts135/login/.* </param-value> </init-param> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
ログインフォームの作成
public class LoginForm extends ActionForm implements Serializable{
private static final long serialVersionUID = -1302472848604305617L;
private String loginID;
private String password;
public String getLoginID() {
return loginID;
}
public void setLoginID(String loginID) {
this.loginID = loginID;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
ログインActionの作成
LookupDispatchActionを使ってみたけどいけてないので、普通のActionでいいと思う。
public class LoginAction extends LookupDispatchAction {
private static final String CLASS_NAME = "LoginAction";
private WebAppLogger logger = WebAppLogger.getInstance();
@Override
protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("login.login.button", "login");
map.put("menu.logout.button", "logout");
return map;
}
public ActionForward login(
ActionMapping map,
ActionForm form,
HttpServletRequest req,
HttpServletResponse res) {
logger.startLog(CLASS_NAME, "login");
LoginForm f = (LoginForm)form;
logger.trace(f.getLoginID());
logger.trace(f.getPassword());
HttpSession session = req.getSession();
if(session == null){
logger.trace("Sessionがありません");
return map.findForward("error");
}
session.setAttribute("USER_INFO", new UserInfo());
logger.trace("ログインしました");
return map.findForward("success");
}
public ActionForward logout(
ActionMapping map,
ActionForm form,
HttpServletRequest req,
HttpServletResponse res) {
logger.startLog(CLASS_NAME, "logout");
HttpSession session = req.getSession();
session.invalidate();
return map.findForward("success");
}
}
struts-config.xml
<form-beans> <form-bean name="LoginForm" type="com.daipresents.struts135.login.LoginForm" /> </form-beans> <global-forwards> <forward name="login" path="/login/login.jsp" /> <forward name="50XError" path="/WEB-INF/jsp/error/error50X.jsp" /> </global-forwards> <action-mappings> <action path="/login" type="com.daipresents.struts135.login.LoginAction" name="LoginForm" scope="request" parameter="method"> <forward name="success" path="top" /> <forward name="error" path="login" /> </action> <action path="/logout" type="com.daipresents.struts135.login.LoginAction" name="LoginForm" scope="request" parameter="method"> <forward name="success" path="login" /> <forward name="error" path="50XError" /> </action> </action-mappings>
I'm a software engineer who like travel to island in Japanese. Recently I am enjoying agile manager, coach, product owner for my work. The person grows like that.











