• Filter&自动登录功能


    Filter过滤器

    过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理。在中间就可以过滤,起到的是拦截的作用。

    不仅仅作用于客户端请求,而且过滤服务器响应

    作用:

    • 对一些敏感词汇进行过滤
    • 统一设置编码
    • 自动登录

    如何使用Filter?

    1. 新建一个类,实现Filter接口
    2. 注册过滤器,在web.xml中配置filter,url建议为/*
    3. chain.doFilter(request, response);//是否连接下一个过滤器,也就是说,过滤器3是否放行,让后续过滤器执行拦截功能
    4. init方法的参数FilterConfig可用于获取filter在注册的名字以及初始化参数(在web.xml配置),这里的功能设计的初衷与ServletConfig是一样的
    5. 如果想放行,在doFilter方法里面操作,让请求到达下一个目标
    6. url-pattern写法格式: 
      • 全路径匹配    /LoginServlet
      • 目录匹配 (/目录开始 , /*  结束)      /jsp/*
      • 以后缀名匹配,以*开始,以后缀名结束   *.jsp   *.html等
      • 针对dispatch设置:<dispatcher></dispatcher>
              • REQUEST  只要请求过来都拦截,默认是REQUEST
              • FORWARD 只要是转发都拦截
              • ERROR       页面出错跳转
              • INCLUDE     包含页面则拦截

     

    Filter的生命周期:

    创建:部署到服务器,则初始化,创建

    销毁:服务器停止则销毁

    Filter的执行顺序:

    1. 客户端发送请求,先经过过滤器,如果过滤器放行,那么才到Servlet。不仅仅作用域客户端请求,而且过滤服务器响应
    2. 如果有多个过滤器,那么他们会按照注册的映射顺序来

    Filter实现自动登录功能:

    • 1.获取信息
    • 2.校验失败,原页面
    • 3.校验成功,跳转index.jsp
      • 1存储账号密码到cookie
      • 2发送Cookie给客户端
      • 3使用Session存起来储用户信息,session在关闭服务器或者超过默认时间才销毁
    • 4.过滤器:
      • 获取Cookie
      • 没有Cookie则表明没有登录,放行。
      • 有Cookie,找出曾经放的用户名和密码,执行登录的操作。
      • 使用Session存起来这个用户值,放行。

    一、Servlet校验登录信息,保存Cookie

    思路:

    1. 拿到用户名和密码进行校验,失败则重新返回登录页面
    2. 校验成功则用session存储用户信息跳转到首页,并判断是否勾选了自动登录
    3. 如果勾选了自动登录,那么将用户名和密码封装成Bean添加到Cookie保存,后续用于过滤器实现自动登录功能
    public class LoginServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          
            try {
                String username = request.getParameter("username");
                String password = request.getParameter("password");
                String autologin = request.getParameter("autologin");//on
                System.out.println(username+":"+password+":"+autologin);
                //校验用户名密码
                UserBean user = new UserBean();
                user.setUsername(username);
                user.setPassword(password);
                UserDao dao = new UserDaoImpl();
                UserBean userBean = dao.Login(user);
                if(userBean!=null){
                    //页面提交上来的时候是否选择了自动登录
                    if("on".equals(autologin)){
                        Cookie cookie = new Cookie("auto_login", username+"#"+password ); 
                        cookie.setMaxAge(60*60*24*7);//7天有效期
                        cookie.setPath(request.getContextPath());//应用名字
                        response.addCookie(cookie);
                    }
                    //成功了,进入首页
                    request.getSession().setAttribute("userBean", userBean);
                    response.sendRedirect("index.jsp");
                }else{
                    //登录失败
                    request.getRequestDispatcher("login.jsp").forward(request, response);
                }
                
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

     

    二、过滤器实现自动登录功能:

    思路:

    1. 先判断本次请求中session是否有效,如果有效,则放行 
    2. 如果session失效,则拿到cookie判断是否第一次登录
    3.  cookie是空,第一次登录,放行,让用户先登录,登录时Servlet会添加Cookie保存此次登录的信息
    4. 如果cookie不为空,不是第一次登录,那么拿到cookie中的值,封装成Bean对象,保存到session中,方便下次未过期之前还能用
    5.  如果出现异常,也放行,防止用户页面空白
    public class AutoLoginFilter implements Filter {
    
        public void destroy() {
        }
    
        public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            
            try {        
                HttpServletRequest request = (HttpServletRequest) req;
                //先判断session中是否还有userBean,如果有,当前会话还是有效的
                UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
                if(userBean!=null){
                    //如果session有效,放行,此时页面有session信息,登录成功显示欢迎您,${userBean.username }
                    chain.doFilter(request, response);
                }else{
                    //此时session失效,比如说关闭浏览器,第二次打开,此时看Cookie
                    //1 取出Cookie,
                    Cookie[] cookies = request.getCookies();
                    //2 找出需要的cookie
                    Cookie cookie = CookieUtil.findCookie(cookies, "auto_login");
                    if(cookie==null){
                        //表明第一次登录,放行
                        chain.doFilter(request, response);
                    }else{
                        //表明不是第一次,取出Cookie中的值,完成登录
                        String value = cookie.getValue();
                        String username = value.split("#")[0];
                        String password = value.split("#")[1];
                        System.out.println(username+":"+password);
                        UserBean user = new UserBean();
                        user.setUsername(username);
                        user.setPassword(password);
                        UserDao dao = new UserDaoImpl();
                        userBean = dao.Login(user);
                        
                        //使用Session存一下这个值,方便下一次未过期前还可以用
                        request.getSession().setAttribute("userBean", userBean);
                        
                        chain.doFilter(request, response);
                    }
                }    
            } catch (Exception e) {
                e.printStackTrace();
                //出现异常,也放行
                chain.doFilter(req, response);
            }
        }
    
        public void init(FilterConfig fConfig) throws ServletException {
           System.out.println("Filter初始化了");
        }
    
    }

    三、登录成功页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    这是首页,
    <c:if test="${not empty userBean }">
    欢迎您,${userBean.username }
    </c:if>
    <c:if test="${ empty userBean }">
    您好,请登录!
    </c:if>
    
    </body>
    </html>

     

    一、

  • 相关阅读:
    leetcode——448.找到所有数组中消失的数字
    leetcode——268.缺失数字
    leetcode——680.验证回文字符串2
    leetcode——125.验证回文串
    leetcode——217.存在重复元素
    leetcode——189.旋转数组
    02-04 线性回归
    02-03 感知机对偶形式(鸢尾花分类)
    02-02 感知机原始形式(鸢尾花分类)
    02-01 感知机
  • 原文地址:https://www.cnblogs.com/ltfxy/p/10257642.html
Copyright © 2020-2023  润新知