Explication détaillée de l'utilisation de filtres pour mettre en œuvre la fonction de connexion d'accès client basée sur les cookies

零下一度
Libérer: 2017-06-15 13:52:09
original
1577 Les gens l'ont consulté

Cet article présente principalement l'utilisation de filtres basés sur les cookies pour permettre aux clients de se connecter une seule fois par visite. Les amis qui en ont besoin peuvent s'y référer

Je pense que tout le monde le rencontrera sur les principaux sites Web. en vous connectant, lors de la connexion, une option similaire selon laquelle il n'est pas nécessaire de se connecter la prochaine fois/pas besoin de se connecter pendant un mois apparaîtra dans la boîte. Cet article expliquera comment y parvenir, je l'enregistrerai ici. également être considéré comme une collection de mémos. S'il y a une erreur dans l'article, vous êtes invités à indiquer pourquoi

Connectez-vous automatiquement une fois, car lorsque vous visitez une certaine page, si la connexion automatique échoue pendant la première fois, vous repasserez par le processus de connexion automatique la prochaine fois que vous actualiserez la visite, et une boucle infinie se produira.

L'exemple de code dans cet article est Spring MVC. Ce qui suit explique les connaissances nécessaires pour implémenter cette fonction : cookies et filtres

1.

Que sont les cookies : les cookies constituent une méthode utile permettant aux applications Web d'enregistrer des informations relatives à l'utilisateur. Par exemple, lorsqu'un utilisateur visite votre site, vous pouvez utiliser des cookies pour enregistrer les préférences de l'utilisateur ou d'autres informations afin que la prochaine fois que l'utilisateur visite votre site, l'application puisse récupérer les informations précédemment enregistrées.

Voyons comment enregistrer les cookies et comment supprimer les cookies

Enregistrer les 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);
Copier après la connexion
Supprimer La suppression des cookies est très simple, mais il convient de noter que la suppression des cookies doit être dans la même couche de contrôle que l'enregistrement des cookies, sinon les cookies enregistrés ne seront pas trouvés et ne pourront pas être supprimés


Cookie cookie = new Cookie("pwd", null);
cookie.setMaxAge(0);// 删除密码cookie
response.addCookie(cookie);
Copier après la connexion

2.Filter-Filter

Le filtre est également appelé filtre C'est la technologie la plus pratique dans la technologie Servlet, le développement Web. Grâce à la technologie Filter, le personnel intercepte toutes les ressources Web gérées par le serveur Web : telles que Jsp, Servlet, fichiers images statiques ou fichiers HTML statiques, etc., pour réaliser certaines fonctions spéciales. Par exemple, certaines fonctions avancées telles que le contrôle d'accès aux autorisations au niveau des URL, le filtrage du vocabulaire sensible et la compression des informations de réponse peuvent être implémentées.

Méthode d'implémentation : héritez de l'interface Filter et implémentez sa méthode doFilter. Enregistrez la classe de filtre écrite dans le fichier web.xml et définissez les ressources qu'elle peut intercepter


<filter>指定一个过滤器。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的限定类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
<filter>
  <filter-name>suicaiFilter</filter-name>
  <filter-class>com.suicai.filter.suicaiFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>suicaiFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
Copier après la connexion
Jetons un coup d'œil au code réel de l'application :


public class suicaiFilter implements Filter {
  @Override
  public void destroy() {
  }
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req=(HttpServletRequest)request;
    HttpServletResponse res=(HttpServletResponse)response;
    HttpSession session = req.getSession();
    String requestURI = req.getRequestURI();
    String param = req.getQueryString();
    String url = req.getServletPath();
    if(param!=null){
      url = url+"?"+param;
    }
    if(requestURI.contains("js") || requestURI.contains("css") || requestURI.contains("images")){
      //不过滤css,js,images等静态资源
      chain.doFilter(request, response);
    }else if(requestURI.contains("/info/")||requestURI.contains("/gys/")){
      //过滤前台访问页面,跟前台个人中心(供应商后台),自动登录一次,登录不成功不进行操作,个人中心登录不成功,则跳到登录页面
      ProviderInfo providerInfo = (ProviderInfo) session.getAttribute("providerInfo_gys");
      String IsAutomaticLogin = (String) session.getAttribute("IsAutomaticLogin");//是否已经走过自动登录流程标识
      if(requestURI.contains("/info/") && !requestURI.contains("/login")){
        //访问门户等不需要必须登录的(登录除外),只尝试登录一次,如果不成功,不进行操作
        if(providerInfo==null && IsAutomaticLogin == null){
          req.getSession().setAttribute("goURL", url);
          res.sendRedirect(req.getContextPath() + "/common/automaticLogin");
        }else if(providerInfo==null && IsAutomaticLogin != null ){
          chain.doFilter(request, response);
        }else{
          chain.doFilter(request, response);
        }
      }else if(requestURI.contains("/gys/")){//访问个人中心,自登陆一次,不成功跳转到登录页面
        if(providerInfo==null && IsAutomaticLogin == null){
          req.getSession().setAttribute("goURL", url);
          res.sendRedirect(req.getContextPath() + "/common/automaticLogin");
        }else if(providerInfo==null && IsAutomaticLogin != null ){
          session.setAttribute("redirectUrl", url);
          res.sendRedirect(req.getContextPath() + "/login.jsp?redirectUrl="+url);
        }else{
          chain.doFilter(request, response);
        }
      }else{
        chain.doFilter(request, response);
      }
    }else{
      //不过滤
      chain.doFilter(request, response);
    }
  }
  @Override
  public void init(FilterConfig arg0) throws ServletException {
  }
}
Copier après la connexion
Comme vous pouvez le voir sur le code, vous avez besoin d'un identifiant (IsAutomaticLogin) pour déterminer si vous vous êtes connecté automatiquement. Cet identifiant est enregistré lorsque vous vous connectez automatiquement (quel que soit le cas). que cela réussisse ou non).

3. Sur la base des connaissances fournies ci-dessus, voici l'affichage global du code. Si vous trouvez quelque chose qui ne va pas, vous êtes invités à le signaler.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!