栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > asp

基于Cookie使用过滤器实现客户每次访问只登录一次

asp 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于Cookie使用过滤器实现客户每次访问只登录一次

相信大家在各大网站都会遇到,登录时,在登录框出现下次免登陆/一个月免登陆的类似选项,本文就是讲解如何实现,在这记录一下,也算是做个备忘录合集,如果文中有错,欢迎大家指出

为啥说自登陆一次呢,因为当访问某个页面时,如果第一次自动登录失败时,你下次刷新访问时还再次走自动登录流程,就会出现死循环。

本文代码示例框架为Spring MVC,下面就讲解实现该功能的需要掌握哪些知识:cookies与过滤器

1.cookies

何为cookies:cookies为 Web 应用程序保存用户相关信息提供了一种有用的方法。例如,当用户访问您的站点时,您可以利用 cookie 保存用户首选项或其他信息,这样,当用户下次再访问您的站点时,应用程序就可以检索以前保存的信息。

我们看一下是如何保存cookies和如何删除cookies

保存cookies

String newUserName = null;
try {
  newUserName = URLEncoder.encode(username, "UTF-8");//把用户名转码,防止用户名是中文,cookies保存中文取出会乱码
} catch (UnsupportedEncodingException e) {
  e.printStackTrace();
}
cookie namecookie = new cookie("username", newUserName);
String pwdMd5Cook = MD5Util.MD5(Pwd);
cookie pwdcookie = new cookie("pwd", pwdMd5Cook);// 保存加密后的密码
namecookie.setMaxAge(60 * 60 * 24 * 365);// 用户名保存一年
pwdcookie.setMaxAge(60 * 60 * 24 * 30);// 密码保存30天
// 发送cookie信息到浏览器
response.addcookie(namecookie);
response.addcookie(pwdcookie);

删除cookies,删除很简单,但值得注意的时,删除cookies,跟保存cookies一定要在同一个控制层,不然会找不到保存的cookies,导致删除不了

cookie cookie = new cookie("pwd", null);
cookie.setMaxAge(0);// 删除密码cookie
response.addcookie(cookie);

2.Filter-过滤器

Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

实现方法:继承Filter接口,并实现其doFilter方法。在web.xml文件中对编写的filter类进行注册,并设置它所能拦截的资源

指定一个过滤器。
用于为过滤器指定一个名字,该元素的内容不能为空。
元素用于指定过滤器的完整的限定类名。
元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
子元素用于设置filter的注册名称。该值必须是在元素中声明过的过滤器的名字
设置 filter 所拦截的请求路径(过滤器关联的URL样式)
指定过滤器所拦截的Servlet名称。

  suicaiFilter
  com.suicai.filter.suicaiFilter


  suicaiFilter
  
  @RequestMapping("/automaticLogin")
  public String automaticLogin(HttpServletRequest request,ServletResponse response,@cookievalue(value = "username", required = false) String username,@cookievalue(value = "pwd", required = false) String pwd,ProviderInfo ProviderInfo) {
    // 保存需求登录前的链接
    String goURL = (String) session.getAttribute("goURL");
    if (username == null) {//cookies中没有用户名,肯定不需要自动登录
      session.setAttribute("IsAutomaticLogin", "0");
      return "redirect:" + goURL;
    } else {
      try {
 username = URLDecoder.decode(username, "UTF-8");//转义,防止中文
      } catch (UnsupportedEncodingException e) {
 e.printStackTrace();
      }
    }
    // cookie失效 session一定为空,因为登录时,一定会把用户名保存在cookie中
    if ("".equals(username) || username == null) {// 使用session登录不了,不进行任何操作,不在进入这个方法
      session.setAttribute("IsAutomaticLogin", "0");
      return "redirect:" + goURL;
    } else {
      // cookie中没有密码,判断session为不为空,如果为空,说明没有登录,如果不为空,说明,用户是选择不记住密码登录(所以cookie中没有密码)
      if ("".equals(pwd) || pwd == null) {
 ProviderInfo customer1 = (ProviderInfo) session.getAttribute("providerInfo_gys");
 if (customer1 == null) {// 使用session登录不了,不进行任何操作,不在进入这个方法
   session.setAttribute("IsAutomaticLogin", "0");
   return "redirect:" + goURL;
 } else {
   // 已经登录,不再进入这个方法
   return "redirect:" + goURL;
 }
      } else {
 // cookie中有密码,判断session为不为空,如果为空,说明没有登录,如果不为空,说明已经登录
 ProviderInfo customer1 = (ProviderInfo) session.getAttribute("providerInfo_gys");
 if (customer1 == null) {// 当前没有登录,调用cookies中的用户名跟密码进行登录
   // 进行自动登录操作,登录成功后返回原来页面
   ProviderInfo customer3 = ValidateDate(username);
   customer3.setPwd(pwd);
   customer3.setAccountType(6);
   ProviderInfo customer2 = infoService.login(customer3);//调用登录方法
   if (customer2 == null) {// 自动登录失败,不再进入这个方法
     session.setAttribute("IsAutomaticLogin", "0");
     return "redirect:" + goURL;
   } else {
     // 登陆成功保存客户信息到session
     session.setAttribute("providerInfo_gys",customer2);
     return "redirect:" + goURL;
   }
 } else {
   return "redirect:" + goURL;
 }
      }
    }
  }
  
  @RequestMapping("/UserLogin")
  @ResponseBody
  public Map goLogin(HttpServletRequest request,HttpServletResponse response,@ModelAttribute("ProviderInfo") ProviderInfo cus) {
    
    cus.setPwd(MD5Util.MD5(Pwd));
    ProviderInfo providerInfo = infoService.login(cus);
    Map cookieMap = new HashMap();
    if (providerInfo == null) {
      // 登陆失败,重新跳转到登陆页面
      map.put("error", "密码错误");
      return map;
    }else{
      String newUserName = null;
      if (remember_me.equals("1")) {// 有选择一个月免登录
 try {
   newUserName = URLEncoder.encode(username, "UTF-8");
 } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
 }
 cookie namecookie = new cookie("username", newUserName);
 String pwdMd5Cook = MD5Util.MD5(Pwd);
 cookie pwdcookie = new cookie("pwd", pwdMd5Cook);// 保存加密后的密码+"create"
 namecookie.setMaxAge(60 * 60 * 24 * 365);// 用户名保存一年
 pwdcookie.setMaxAge(60 * 60 * 24 * 30);// 密码保存30天
 // 发送cookie信息到浏览器
 response.addcookie(namecookie);
 response.addcookie(pwdcookie);
 session.setAttribute("IsAutomaticLogin",null);
      }else{//没有选择,删除上次可能已经选择自动登录时的密码
 cookie[] cookies = request.getcookies();
 if (null != cookies) {
   for (cookie cookie : cookies) {
     cookieMap.put(cookie.getName(), cookie);
   }
 }
 if (cookies != null) {
   for (int i = 0; i < cookies.length; i++) {
     if (cookieMap.containsKey("pwd")) {
cookie cookie = new cookie("pwd", null);
cookie.setMaxAge(0);// 删除密码cookie
response.addcookie(cookie);
     }
   }
 }
      }
      // 登陆成功,保存当前user信息,保存客户信息到session
      map.put("ProviderInfo", providerInfo);
      map.put("goURL", session.getAttribute("goURL"));
      session.setAttribute("providerInfo_gys", providerInfo);
      return map;
    }else {
      map.put("error", "该供应商账号不存在");
      return map;
    }
  }
  
  @RequestMapping("/logout")
  public String logout(HttpServletResponse response) {
    Map cookieMap = new HashMap();
    cookie[] cookies = request.getcookies();
    if (null != cookies) {
      for (cookie cookie : cookies) {
 cookieMap.put(cookie.getName(), cookie);
      }
    }
    if (cookies != null) {
      for (int i = 0; i < cookies.length; i++) {
 if (cookieMap.containsKey("pwd")) {
   cookie cookie = new cookie("pwd", null);
   cookie.setMaxAge(0);// 删除密码cookie
   response.addcookie(cookie);
 }
      }
    }
    session.setAttribute("providerInfo_gys", null);
    return "/index";
  }
}

以上所述是小编给大家介绍的基于cookie使用过滤器实现客户每次访问只登录一次,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/55587.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号