menu
書いてる野郎
orebike@gmail.com
ログイン画面を実装するため LoginController を作る。
@Controller @RequestMapping("/login") public class LoginController { @RequestMapping("") public String index() { return "login/index"; } @RequestMapping("/doLogin") public String doLogin() { return "login/index"; } }
対応する画面も作る
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> <title>Login</title> <meta name="description" content=""> </head> <body> <h1>Login</h1> <form action="/login/doLogin" method="POST"> <button type="submit">login</button> </form> </body> </html>
できた。が、現状 interceptor で全体をガードしているので見ることができない
この全体ガードから指定したモノだけ除外するという設定をする。
この「指定したモノ」を決めるためのアノテーション NoAuth を作る
import java.lang.annotation.Retention; import java.lang.annotation.Target; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.ElementType; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface NoAuth { }
このアノテーションを除外したいメソッドに取り付ける
@Controller @RequestMapping("/login") public class LoginController { @RequestMapping("") @NoAuth public String index() { return "login/index"; } @RequestMapping("/doLogin") @NoAuth public String doLogin() { return "login/index"; } }
単に印を付けただけなので当然除外などされない。
ガードしているのは Interceptor なので、そこでこのアノテーションの有無をチェックする。
public class MyAuthInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod h = (HandlerMethod) handler; NoAuth a = AnnotationUtils.findAnnotation(h.getMethod(), NoAuth.class); if(a != null) { return true; }else { return false; } } }
アノテーションが存在すれば true ということで表示。存在しなければ false でガードという動きにすうr。
やってみると login/index が表示できるようになっていることがわかる。
これで一部除外設定ができてログイン画面が表示できるようになった。