ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Servlet实现网页十天免登陆功能

2020-08-29 21:35:22  阅读:278  来源: 互联网

标签:username ps password 网页 登录 十天 import null Servlet


前言

  我们在登录网页的时候有时候会见到有几个字叫十天内免登陆复选框,比如126邮箱的登录页面

 

 

 

 实现:

    这里我们就要使用Cookie技术,Cookie技术是Web开发中必备的技术之一。

  先开看下我的项目结构,下面直接贴代码,代码里面有详细的注释。

登录页面index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
        <!--login指向的是配置文件-->
    <form action="/你的项目名/login" method="post">
        账号
        <input type="text" name="username"><br>
        密码
        <input type="password" name="password"><br>
        <input type="checkbox" name="tenDayLogin" value="ok">十天内免登陆<br>
        登录
        <input type="submit" value="登录">
    </form>
</body>
</html>
View Code

配置文件web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>项目名</display-name>
  <welcome-file-list>
      <!-- 将验证cookie的Servlet作为登录页面。验证成功就不需要再跳转到登录页面了 -->
    <welcome-file>islogin</welcome-file>
  </welcome-file-list>
  
  <servlet>
      <servlet-name>login</servlet-name>
      <servlet-class>com.zhixi.zhang.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>login</servlet-name>
      <url-pattern>/login</url-pattern>
  </servlet-mapping>
  
    <servlet>
      <servlet-name>islogin</servlet-name>
      <servlet-class>com.zhixi.zhang.CheckLoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>islogin</servlet-name>
      <url-pattern>/islogin</url-pattern>
  </servlet-mapping>
</web-app>
View Code

SQL文件,用于存储用户的账号跟密码

drop table if exists t_user;

create table t_user(
    id int(10) primary key auto_increment,
    username varchar(32) not null unique,
    password varchar(32) not null,
    realname varchar(128)
);
insert into t_user(username,password,realname) values('zhangzhixi','zhixi158','root');
insert into t_user(username,password,realname) values('zhangsan','123','普通用户');

select * from t_user;
View Code

 

 验证Cookie类

package com.zhixi.zhang;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CheckLoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //从request中获取所有的cookie
        Cookie[] cookies = request.getCookies();
        String username = null;
        String password = null;;
        
        if(cookies != null) {
            //遍历cookie
            for(Cookie cookie : cookies) {
                if("username".equals(cookie.getName())) {//看cookie的name是不是与cookie的名字匹配
                    username = cookie.getValue();
                }else if("password".equals(cookie.getName())){
                    password = cookie.getValue();
                }
            }
        }
        
        if(username != null && password != null) {//
            //连接JDBC数据库验证用户名跟密码
            Connection conn =null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            boolean login = false;//判断是否登录成功
            String realName = null;//用户
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/donglijiedian","root","zhixi158");
                String sql = "select * from t_user where username=? and password=?";
                ps = conn.prepareStatement(sql);
                ps.setString(1, username);
                ps.setString(2, password);
                
                rs = ps.executeQuery();
                if(rs.next()) {
                    login = true;
                    realName = rs.getString("realname");
                }
            }catch(Exception e) {
                e.printStackTrace();
            }finally {
                if(rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                    }
                }
                if(ps != null) {
                    try {
                        ps.close();
                    } catch (SQLException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                    }
                }
                if(conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                    }
                }
            }
            
            //跳转页面
            if(login) {//登录成功
                out.print("欢迎"+ realName +"登录成功!");
            }else {//登录失败
                out.print("登录失败,请检查用户名或者密码!");
            }
        }else {//cookie验证失败,跳转到登录页面
            response.sendRedirect(request.getContextPath()+"/index.html");
        }
        
    }
    
}
View Code

登录类

package com.zhixi.zhang;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         思路:
            获取用户名和密码
            JDBC连接数据库验证用户名和密码
            登录成功跳转到成功页面
                登录成功后查看用户是否勾选了十天内免登陆
                检查cookie,验证十天内有没有更改过密码,然后直接跳转到成功页面
            登录失败跳转到失败页面
            
         */
        //1、解决乱码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //2、获取用户输入的用户名和密码
        PrintWriter out = response.getWriter();
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        Connection conn =null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        boolean login = false;//判断是否登录成功
        String realName = null;//用户
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/donglijiedian","root","zhixi158");
            String sql = "select * from t_user where username=? and password=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, username);
            ps.setString(2, password);
            
            rs = ps.executeQuery();
            if(rs.next()) {
                login = true;
                realName = rs.getString("realname");
            }
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            if(rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
            if(ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
            if(conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
        }
        //跳转页面
        if(login) {//登录成功
            out.print("欢迎"+ realName +"登录成功!");
            //通过name获取value
            String parameter = request.getParameter("tenDayLogin");
            if("ok".equals(parameter)) {//说明用户选择了十天内免登陆
                //创建Cookie对象
                Cookie cookie1 = new Cookie("username",username);
                Cookie cookie2 = new Cookie("password",password);
                //设置有效时间
                cookie1.setMaxAge(60 * 60 * 24 * 10);
                cookie2.setMaxAge(60 * 60 * 24 * 10);
                //设置关联路径,默认根路径就行
                cookie1.setPath(request.getContextPath());
                cookie2.setPath(request.getContextPath());
                //发送Cookie给浏览器
                response.addCookie(cookie1);
                response.addCookie(cookie2);
            }
        }else {//登录失败
            out.print("登录失败,请检查用户名或者密码!");
        }
        
    }
    
}
View Code

测试

未勾选十天免登陆

 

 

 

 

勾选十天内免登陆

1、先使用账号密码登录并勾选十天内免登陆登录登录

 

 

2、关闭浏览器再进行访问地址

 

这次是我直接重新开启服务器跳转的页面,因为设置了Cookie的实效时长,在硬盘中实际上是已经存储了我的账号跟密码了。所以直接就进入到了成功登录的页面了!

 

 

 

 

 

 

 

 

 

 

 

 

  

标签:username,ps,password,网页,登录,十天,import,null,Servlet
来源: https://www.cnblogs.com/zhangzhixi/p/13583574.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有