zoukankan      html  css  js  c++  java
  • 自动登录——过滤器

    1、登录流程图:

      (1)index.jsp:向web层的Servlet提供用户信息:password、username,以及用户是否选择自动登录(通过autolog属性来提供相关的信息),通过EL技术获取错误提示信息。

    (2)Servlet:从表单获取数据,并将表单中的数据作为参数从Service层获得dao层从数据库中获得的用户信息,如果存在此user,则判断是否选择自动登录,来进行不同的处理。

    (3)过滤器:查询符合条件的Cookie,并将此user信息存储到Session域中,供main.jsp通过EL调用。

    (4)数据库:dao层通过sql语句实现从数据库中获得用户信息,即与表单提交的用户信息进行比对,如果存在此用户则返回该用户的信息给service层,如果不存在则返回空。

    (5)main.jsp:登录成功后跳转到此页面,通过EL从Session域中获得用户的账户名。

    2、工程结构:

     3、代码实现:

    (1)jsp:

    login.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>login</title>
    </head>
    <body bgcolor="aqua">
    <center>
      <h3>登录</h3>
      <form action="/Login_MVC_war_exploded/loginservlet" method="post">
        &nbsp;用户名:<input type="text" name="username" size="12"><br>&nbsp;&nbsp;码 :<input type="password" name="password" size="12" ><br><br>
    
        <input type="checkbox" value="autologin" name="autologin">自动登录<br><br>
    
        <input type="reset" value="取消">
    
        <input type="submit" value="登录">
      </form>
      <h5 style="color:red">${requestScope.logerrorinf}</h5> <!--运用EL获取值-->
    </center>
    </body>
    </html>

    main.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>main</title>
    </head>
    <body>
    <c:if test="${empty user}">
        <li><a href="index.jsp"></a></li>
    </c:if>
    <c:if test="${!empty user}">
        你好,${sessionScope.user.getAccount()}
    </c:if>
    </body>
    </html>

    (2)web层:

    LoginServlet:

    package pers.zhb.web;
    import pers.zhb.domain.User;
    import pers.zhb.service.UserService;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    public class LoginServlet extends javax.servlet.http.HttpServlet {
        protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        HttpSession httpSession=request.getSession();
        String username=request.getParameter("username");//从表单获取数据,并作为形式参数传递到login函数中
        String password=request.getParameter("password");
        UserService userService=new UserService();
        User user=userService.login(username,password);//从service层获取user信息,该信息是从数据库中查询的
        if(user!=null){
        String autoLogin=request.getParameter("autologin");
        if(autoLogin!=null){//如果选择自动登录则将用户的信息持久化存储到磁盘
            Cookie cookie_username=new Cookie("cookie_username",user.getAccount());//创建Cookie
            Cookie cookie_password=new Cookie("cookie_password",user.getPassword());
            cookie_username.setMaxAge(60*60);//设置Cookie的持久化存储时间为一小时
            cookie_password.setMaxAge(60*60);
            cookie_username.setPath(request.getContextPath());//路径
            cookie_password.setPath(request.getContextPath());
            response.addCookie(cookie_username);//发送
            response.addCookie(cookie_password);
        }
        httpSession.setAttribute("user",user);
        response.sendRedirect(request.getContextPath()+"/main.jsp");//成功的话,重定向到主页
        }else{
        request.setAttribute("logerrorinf","用户名或密码错误") ;//向request域写入信息
        request.getRequestDispatcher("/index.jsp").forward(request,response);
    }
        }
    
        protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
    
        }
    }

    过滤器:

     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest httpServletRequest =(HttpServletRequest)servletRequest;//获取Cookie必须强转
            HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;
            HttpSession httpSession=httpServletRequest.getSession();
            String cookie_username=null;
            String cookie_password=null;
            Cookie[] cookies=httpServletRequest.getCookies();
            if(cookies!=null){//自动登录,Cookie不为空
                for(Cookie cookie:cookies){
                    if("cookie_username".equals(cookie.getName())){//找到Cookie的名字为cookie_username的Cookie
                        cookie_username=cookie.getValue();//获取存储username的Cookie的值
                    }
                    if("cookie_password".equals(cookie.getName())){//找到Cookie的名字为cookie_password的Cookie
                        cookie_password=cookie.getValue();//获取存储password的值
                    }
                }
            }
            if(cookie_username!=null&&cookie_password!=null){//从Cookie中
                System.out.println(cookie_username);//检验cookie_username和cookie_password的值
                System.out.println(cookie_password);
                UserService userService=new UserService();
                User user=userService.login(cookie_username,cookie_password);//从service层获取user信息,该信息是从数据库中查询的
                httpSession.setAttribute("user",user);//session域中写入user信息
                httpServletRequest.getRequestDispatcher("/main.jsp").forward(httpServletRequest,httpServletResponse);//成功的话重定向到首页
            }
             filterChain.doFilter(httpServletRequest,httpServletResponse);
        }

    (3)service层:

    public class UserService {
        public User login(String username, String password) {//返回dao层的user信息
            UserDao userDao=new UserDao();
            return userDao.login(username,password);
        }
    }

    (4)dao层:

    public class UserDao {
        public User login(String username, String password) {//返回查找到的符合条件的用户
            Connection con=null;
            User user= null;
            try {
                con= C3p0Utils.getConnection();
                QueryRunner qr = new QueryRunner();
                String sql = "Select * from login where account=? and password=?";
                Object[] select = {username,password};
                return qr.query(con, sql, new BeanHandler<User>((User.class)), select);
            }
            catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

    3、运行结果:

     

  • 相关阅读:
    「2017 山东三轮集训 Day1」Flair
    Luogu P4321 随机漫游
    「WC2018」通道
    「CTSC2018」暴力写挂
    关于二项式相乘
    BZOJ #3625 CF #438E 小朋友和二叉树
    GIS可视化
    微信小程序Promise对象
    SQL Server-执行计划教会我如何创建索引
    IIS+NGINX 负载web服务器
  • 原文地址:https://www.cnblogs.com/zhai1997/p/11693595.html
Copyright © 2011-2022 走看看