Filter应用之-自动登录

自动登录,是为了帮助用户多次使用这个网页时,不用再次输入用户名和密码就可以登录。

是指用户将用户的登录信息,人,保存到本地的文件中Cookie中。

Name,value – 声明时 new Cookie(key,value);

Path        - 默认值,即为当前保存cookie的这个serlvet所在的路径。

如果Cookie在这样的路径:http://loclhost:8080/project/abc/AServlet

则Cookie的路径为: http://loclhost/project/abc

则说明:

所在在http://loclhost/project/abc目录下的servlet才可以读取这个cookie的值。

如果:

保存Cookie类:http://loclhost:8080/project/a/b/AServlet

则Cookie的默认path为;

http://loclhost/project/a/b

对于path这个值可以手工设置:

如果设置为: http://loclhost/project/ 即到项目名。

则所有这个项目中的所有Serlvet|jsp都可以读取到这个 cookie.

Cookie.setPath(requst.getContextPath());

如果将path设置为   /

即:cookie.setpath(“/”); - http://localhost/

则所有在tomcat中运行的项目都可以读取这个到cookie.

如果path设置为/必须要与domain共同使用才有意义。

Age        - 默认值-1,在浏览器中存在。 0:删除文件中的cookie和浏览器中的cookie。

Domain     - 域 -

www.sina.com - login

www.bbs.sina.com

www.news.sina.com

删除时,必须要设置的与之前设置的信息完全一样:

Name

  Age = 0(文件和缓存),-1(只删除文件)

  Path 一样。

  Domain :null

下一次用户再打开这个网页时,应该读取cookie中的信息,实现自动登录。




思路:登录时用户勾选了记住密码几天,登录Servlet 里返回给浏览器一个Cookie,name是autoLogin,value是:(编码)用户名_(加密)密码,用户再次进来时,过滤器遍历所有的Cookie,看是否有一个叫autoLgin的Cookie。如果有,解析用户名密码。自动登录。其中加密部分借鉴了别人的文章感觉不错。连接

代码L:

User类:

package com.lhy.domain;

public class User {

  private String username;
  private String password;
  public String getUsername() {
    return username;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
}

LoginServlet:

@WebServlet(name="LoginServlet",urlPatterns="/LoginServlet")
public class LoginServlet extends HttpServlet{

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.err.println("---------->LoginServlet");
    req.setCharacterEncoding("UTF-8");
    //
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    //是否自动登录
    String auto = req.getParameter("auto");
    if("lhy".equals(username) && "123".equals(password)){

      //登录成功,将用户信息放session
      User user = new User();
      user.setUsername(username);
      req.getSession().setAttribute("user", user);

      if(!"-1".equals(auto)){
        //勾选了自动登录
        int day = Integer.parseInt(auto);//1|7
        int seconds = 60 * 60 * 24 * day;//cookie存活时间 单位:秒
        //声明cookie
        //  用户名(编码)_密码(加密))
        //cookie不能存中文,用户名有中文编码后可以转为字母
        Cookie c = new Cookie("autoLogin",Base64Util.encode(username)+"_"+Md5Util.encode(password));
        c.setMaxAge(seconds);
        c.setPath(req.getContextPath());
        //保存cookie
        resp.addCookie(c);
        resp.sendRedirect(req.getContextPath()+"/jsps/main.jsp");
      }
    }else{
      //登录失败
      req.getSession().setAttribute("msg", "用户名或密码错误");
      resp.sendRedirect(req.getContextPath()+"/index.jsp");
    }
  }

}

LogoutServlet:

@WebServlet(name="LogoutServlet",urlPatterns="/LogoutServlet")
public class LogoutServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.err.println("用户退出");
    //删除整个session
    req.getSession().invalidate();
    Cookie c = new Cookie("autoLogin","ddd");
    c.setMaxAge(0);
    c.setPath(req.getContextPath());
    resp.addCookie(c);
    //用户退出动作的标识
    req.getSession().setAttribute("exit",true);
    resp.sendRedirect(req.getContextPath()+"/index.jsp");
  }

}

过滤器:

public class AutoLoginFilter implements Filter{

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {

  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    // 在这儿读取cookie
    HttpServletRequest req = (HttpServletRequest)request;
    // 获取用户请求的uri
    String uri = req.getRequestURI();//AutoLogin/index.jsp

    //1.对于登录、退出,直接放行
    if(req.getSession().getAttribute("exit")==null){ //退出过来的
       if(req.getSession().getAttribute("user")==null){
         if(!uri.endsWith("index.jsp")){
         //获取所有的cookie
           Cookie[] cookies = req.getCookies();
           if(cookies != null){
             for (Cookie cookie : cookies) {
               if(cookie.getName().equals("autoLogin")){//如果存在自动登录的cookie
                 String usernameAndPassword = cookie.getValue();//用户名密码 base64username_md5password
                 String username = usernameAndPassword.split("_")[0];//base64用户名
                 String password = usernameAndPassword.split("_")[1];//md5密码

                 //解码用户名
                 username  = Base64Util.decode(username);
                 //根据用户名查询,这里模拟。123的md5:ICy5YqxZB1uWSwcVLSNLcA==
                 if("lhy".equals(username) && "ICy5YqxZB1uWSwcVLSNLcA==".equals(password)){
                   //登录成功
                   User u = new User();
                   u.setUsername(username);
                   req.getSession().setAttribute("user", u);
                   break ;
                 }
               }
             }
           }
         }
       }
      }else{
         //退出过来的,清除session里exit
         req.getSession().removeAttribute("exit");
    }
    //不管是否自动登录成
    chain.doFilter(request, response);
  }

  @Override
  public void destroy() {
  }

}

编码加密工具类:

public class Base64Util {

  //编码    中文 -------------5Lit5paH
  public static String encode(String str){
      BASE64Encoder b64= new BASE64Encoder();
      return b64.encode(str.getBytes());
  }

  //解码   5Lit5paH----中文
  public static String decode(String str){
      try {
          BASE64Decoder b64decoder = new BASE64Decoder();
          byte [] afterStr = b64decoder.decodeBuffer(str);
          return new String(afterStr);
      } catch (IOException e) {
          e.printStackTrace();
          throw new RuntimeException(e);
      }
  }

  public void testEncode(){

  }
  public static void main(String[] args) {
    String str = Base64Util.encode("中文");
    System.out.println(str);

    String newString = Base64Util.decode(str);

    System.out.println(newString);
  }
}
public class Md5Util {

    //md5加密的方法
    public static String encode(String old){
        try {
            MessageDigest md5 = MessageDigest.getInstance("md5");
            byte newStr[] = md5.digest(old.getBytes());

            BASE64Encoder b64= new BASE64Encoder();
            return b64.encode(newStr);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static void main(String[] args) {
      String s = Md5Util.encode("123");
      System.err.println(s);//ICy5YqxZB1uWSwcVLSNLcA==
    }
}

用到了 jar包:sun.misc.BASE64Decoder.jar

过滤器配置:

 <filter>
     <filter-name>autoLogin</filter-name>
     <filter-class>com.lhy.filter.AutoLoginFilter</filter-class>
 </filter>
 <filter-mapping>
     <filter-name>autoLogin</filter-name>
     <!-- <url-pattern>*.jsp</url-pattern> -->
     <url-pattern>/*</url-pattern>
 </filter-mapping>

登录表单:

<body>
    <c:if test="${not empty sessionScope.msg}">
                   <font color="red">
                       ${sessionScope.msg}
                   </font>
                   <c:remove var="msg" scope="session"/>
               </c:if>
            <form name="x" method="post" action="<c:url value=‘/LoginServlet‘/>">
                Name:<input type="text" name="username"/><br/>
                Password:<input type="password" name="password"/><br/>
                auto:<input type="radio" name="auto" value="-1">不自动登录
                <br/>
                <input type="radio" name="auto" value="1">1天<br/>
                <input type="radio" name="auto" value="7">1周<br/>
                <input type="submit"/>
            </form>
  </body>

main.jsp:

<body>
        这是首页,欢迎你:${user.username}  | <a href="LogoutServlet">退出</a>
  </body>

只是记录下学习到这个知识点,解决这个问题的思路,肯定还不完善,有错误清指出!谢谢!

时间: 2024-11-10 10:40:55

Filter应用之-自动登录的相关文章

Filter过滤器实现自动登录

Filter介绍 问题:Filter是什么,它能做什么? 1.从两个方面来解析Filter是什么? 1.功能  可以帮助我们对请求与响应操作进行过滤. 2.技术  Sun公司定义的一个接口,javax.servlet.Filter 2.Filter能完成什么操作? 常用示例: 1.通用编码过滤器. 2.粗粒度的权限控制(url级别) 3.过滤一些敏感字 Filter创建步骤: 1.创建一个类实现javax.servlet.Filter接口. 2.重写Filter接口中三个方法  init  do

Filter自动登录

Dao层略过 Domain略过 Service层过 Web层 Select逻辑 获取表单数据,Web-service--Dao返回用户信息 如果返回不为null否则,重定向到登录页面.则判断用户是否勾选7天免登录,如果勾选(判断一下).把用户数据存入session域中,并且要创建一个cookie设置时间为7天,保存cookie中.  select代码: public void doGet(HttpServletRequest request, HttpServletResponse respon

estore商城案例(三)------Filter过滤器:自动登录&amp;权限管理

前面写好了用户登录\注册\添加商品的功能模块.下面写一下对于这些功能模块的相关过滤器---自动登录与权限管理: 一.自动登录: 业务逻辑是这样的:jsp登录页面有个“自动登录选项”,如果登录这勾选了,那么在serlvet程序中则会额外的生成一个保存用户名和密码的cookie,然后每次用户向服务器发送请求时,Filter过滤器都会先判断用户的登录状态(session),如果已经登录那么无需做出受任何操作直接放行,如果没有登录(无session),那么这时体现自动登录功能作用的时候到了,先获取自动登

自动登录:Filter,Session,Cookie综合例子

初始登录Servlet: package cn.xbai.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class

实现自动登录:Filter 实现思路和方式

当你勾选(记住登录状态),用cookie保存用户名和密码.不勾选,cookie失效. 所有的页面都要经过autoLoginFilter.java 的过滤器,在这类中,必须要判断cookies不为null,获得所有的cookie,得到name为user的cookie,进行用户名和密码的验证,如果不为null,则将user存入session. 在LoginServlet.java中,获得username和password参数,进行dao验证,如果不为空,放入seesion中,进行页面跳转. 创建co

JavaWeb-过滤器Filter学习(三)实现用户的自动登录与IP黑名单过滤

实现用户的自动登录: 解决方案: 设置一个全站拦截的过虑器. 在此过虑器中,读取用户带过来的Cookie信息,然后从中读取用户的用户名和密码,自动帮助用户登录. 即可实现自动登录功能. 用Filter验证用户是否已经登录过.已经登录过了,我们就根据他选择的自动登录来选择让他在多久内能自动登录. IP黑名单过滤就很简单了,只要在Filter过滤器防范一下就OK. 在init方法中,我们先把黑名单的IP加载进Set<String> set集合, Set集合有如下特点: Java.util.Hash

JavaWeb 后端 &lt;十二&gt; 之 过滤器 filter 乱码、不缓存、脏话、标记、自动登录、全站压缩过滤器

一.过滤器是什么?有什么? 1.过滤器属于Servlet规范,从2.3版本就开始有了. 2.过滤器就是对访问的内容进行筛选(拦截).利用过滤器对请求和响应进行过滤 二.编写步骤和执行过程 1.编码步骤: a.编写一个类:实现javax.servlet.Filter接口 public class FilterDemo1 implements Filter { public FilterDemo1(){ System.out.println("调用了默认的构造方法"); } //用户每次访

JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码

一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException; import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.H

二十 Filter&amp;自动登录功能

Filter过滤器 过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理.在中间就可以过滤,起到的是拦截的作用. 不仅仅作用于客户端请求,而且过滤服务器响应 作用: 对一些敏感词汇进行过滤 统一设置编码 自动登录 如何使用Filter? 新建一个类,实现Filter接口 注册过滤器,在web.xml中配置filter,url建议为/* chain.doFilter(request, response);//是否连接下一个过滤器,也就是说,过滤器3是否放行,让后