JavaWeb使用Session和Cookie实现登录认证

作者:饥渴计科极客杰铿 时间:2023-12-11 19:13:29 

后台管理页面往往需要登录才可以进行操作,这时就需要Seession来记录登录状态

要实现起来也是非常简单,只需要自定义一个HandlerInterceptor就行了

自定义的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代码


@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";
 }

}

spring的配置


 <!--省略其他基本配置-->

<!-- 配置 * -->
 <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>

一个简单的Session实现登录认证系统就这样完成了,如果想登录状态退出浏览器后仍保留一段时间的可以将Session改为Cookie

一般情况下我们都会使用Cookie

Cookie和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 {
//    获取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的键和值要经过特殊处理,否则会引发安全问题

来源:http://www.jianshu.com/p/587c56ed9dfa

标签:java,cookie,session
0
投稿

猜你喜欢

  • C#延时函数的使用说明

    2023-10-11 19:58:34
  • 详解如何在SpringBoot中自定义参数解析器

    2023-07-24 16:06:51
  • Android N多窗口支持

    2022-08-08 19:27:37
  • android采用FFmpeg实现音频混合与拼接剪切

    2023-10-04 06:51:24
  • Java AtomicInteger类的使用方法详解

    2023-03-09 00:57:57
  • Unity3D Ui利用shader添加效果

    2022-09-17 15:32:47
  • Struts2中接收表单数据的三种驱动方式

    2022-04-21 09:23:11
  • java图片识别文字的方法

    2021-11-11 02:43:03
  • C# 启动 SQL Server 服务的实例

    2022-02-10 21:59:38
  • 深入理解Java设计模式之装饰模式

    2021-11-23 11:29:52
  • 解决springboot遇到autowire注入为null的问题

    2022-04-15 02:37:59
  • JDK1.8下载、安装和环境配置超详细教程(最新最完整)

    2022-07-22 12:58:34
  • Java如何根据不同系统动态获取换行符和盘分割符

    2022-02-27 10:33:10
  • 源码剖析Android中Okio的使用

    2023-07-03 20:48:44
  • 深入理解Java设计模式之建造者模式

    2022-12-06 00:57:37
  • c#操作xml帮助类分享(xml增删改查)

    2022-03-02 04:09:21
  • Java调用shell命令涉及管道、重定向时不生效问题及解决

    2021-07-18 17:02:25
  • Android百度地图应用之基本地图功能实现

    2022-11-20 07:01:41
  • 深入理解Java设计模式之命令模式

    2023-11-24 11:06:31
  • Spring boot使用多线程过程步骤解析

    2023-04-03 04:54:50
  • asp之家 软件编程 m.aspxhome.com