この記事では主に Session と Cookie を使用してログイン認証を実装する方法を紹介します。興味のある方は参考にしてください。
バックグラウンド管理ページを操作するにはログインが必要になることがよくあります
カスタマイズされた HandlerInterceptor は次のとおりです。たった数行のコード
public class LoginInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception err) throws Exception { } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView mav) throws Exception { } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { //获取session里的登录状态值 String str = (String) request.getSession().getAttribute("isLogin"); //如果登录状态不为空则返回true,返回true则会执行相应controller的方法 if(str!=null){ return true; } //如果登录状态为空则重定向到登录页面,并返回false,不执行原来controller的方法 response.sendRedirect("/backend/loginPage"); return false; } }
コントローラーコード
@Controller @RequestMapping("/backend") public class BackendController { @RequestMapping(value = "/loginPage", method = {RequestMethod.GET}) public String loginPage(HttpServletRequest request,String account, String password){ return "login"; } @RequestMapping(value = "/login", method = {RequestMethod.POST}) public String login(HttpServletRequest request,RedirectAttributes model, String account, String password){ //验证账号密码,如果符合则改变session里的状态,并重定向到主页 if ("jack".equals(account)&&"jack2017".equals(password)){ request.getSession().setAttribute("isLogin","yes"); return "redirect:IndexPage"; }else { //密码错误则重定向回登录页,并返回错误,因为是重定向所要要用到RedirectAttributes model.addFlashAttribute("error","密码错误"); return "redirect:loginPage"; } } //登出,移除登录状态并重定向的登录页 @RequestMapping(value = "/loginOut", method = {RequestMethod.GET}) public String loginOut(HttpServletRequest request) { request.getSession().removeAttribute("isLogin"); return "redirect:loginPage"; } @RequestMapping(value = "/IndexPage", method = {RequestMethod.GET}) public String IndexPage(HttpServletRequest request){ return "Index"; } }
スプリング構成
<!--省略其他基本配置--> <!-- 配置拦截器 --> <mvc:interceptors> <!-- 配置登陆拦截器 --> <mvc:interceptor> <!--拦截后台页面的请求--> <mvc:mapping path="/backend/**"/> <!--不拦截登录页和登录的请求--> <mvc:exclude-mapping path="/backend/loginPage"/> <mvc:exclude-mapping path="/backend/login"/> <bean class="com.ima.Interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
CookieのカスタムHandlerInterceptorを使用します
public class LoginInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception err) throws Exception { } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView mav) throws Exception { } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { // 获取request的cookie Cookie[] cookies = request.getCookies(); if (null==cookies) { System.out.println("没有cookie=============="); } else { // 遍历cookie如果找到登录状态则返回true执行原来controller的方法 for(Cookie cookie : cookies){ if(cookie.getName().equals("isLogin")){ return true; } } } // 没有找到登录状态则重定向到登录页,返回false,不执行原来controller的方法 response.sendRedirect("/backend/loginPage"); return false; } }
Controllerはあまり変更されていません
@Controller @RequestMapping("/backend") public class BackendController { @RequestMapping(value = "/loginPage", method = {RequestMethod.GET}) public String loginPage(HttpServletRequest request, String account, String password) { return "login"; } @RequestMapping(value = "/login", method = {RequestMethod.POST}) public String login(HttpServletRequest request, HttpServletResponse response, RedirectAttributes model, String account, String password) { if ("edehou".equals(account) && "aidou2017".equals(password)) { Cookie cookie = new Cookie("isLogin", "yes"); cookie.setMaxAge(30 * 60);// 设置为30min cookie.setPath("/"); response.addCookie(cookie); return "redirect:IndexPage"; } else { model.addFlashAttribute("error", "密码错误"); return "redirect:loginPage"; } } @RequestMapping(value = "/logOut", method = {RequestMethod.GET}) public String loginOut(HttpServletRequest request, HttpServletResponse response) { Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { if (cookie.getName().equals("isLogin")) { cookie.setValue(null); cookie.setMaxAge(0);// 立即销毁cookie cookie.setPath("/"); response.addCookie(cookie); break; } } return "redirect:loginPage"; } @RequestMapping(value = "/IndexPage", method = {RequestMethod.GET}) public String IndexPage(HttpServletRequest request) { return "Index"; } }
Spring構成は以前と全く同じです
注これは単なるデモンストレーションです。実際のプロジェクトでは Cookie のキーと値を特別に処理することをお勧めします。そうしないと、セキュリティ上の問題が発生します
。
以上がJavaWeb はセッションと Cookie を使用してログイン認証コード例の共有を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。