zoukankan      html  css  js  c++  java
  • 使用servlet+jdbc+MD5实现用户加密登录

    /**
    * 分析流程:
    * 1、前端页面提交登录请求
    * 2、被web.xml拦截,进入到LoginServlet(有两种方式:方式一,在web.xml文件中配置servlet拦截器;方式二,不用在web.xml中配置,直接在类中通过                         @WebServlet("/login")注解    //请求路径)
    * 3、获取页面输入的用户名和密码
    * 4、创建一个工具类,用于生成连接工厂
    * 5、调用UserDao层,通过连接工厂连接数据库,根据名字查询用户
    * 6、拼接sql语句,set参数,执行预编译,返回结果集
    * 7、判断结果集是否存在,如果存在,就return数据
    * 8、在LoginServlet中调用dao层后获取到数据,获取session对象,将获取到的数据存储到session对象中
    * 9、资源跳转到页面
    * 10、跳转到成功页面,显示数据
    */

    代码示例:

    1、前端页面提交登录请求

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>登录页面</title>
    </head>
    <body>
        <form action="login" method="post">
                用户名:<input name="username" type="text"><br>
                密    码:<input name="password" type="password"><br>
                <button type="submit">登录</button>
        </form>
    </body>
    </html>

    2、被web.xml拦截,进入到LoginServlet(有两种方式:方式一,在web.xml文件中配置servlet拦截器;方式二,不用在web.xml中配置,直接在类中通过                         @WebServlet("/login")注解    //请求路径)

    配置的web.xml文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <display-name>demo2</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
        <servlet-name>loginServlet</servlet-name>   
        <servlet-class>org.fkjava.Servlet.LoginServlet</servlet-class>  
      </servlet>
      <servlet-mapping>
        <servlet-name>loginServlet</servlet-name>
        <url-pattern>/</url-pattern>    //拦截所有的请求
      </servlet-mapping> 
    </web-app>

    3、请求被拦截后跳转到LoginServlet类中,获取页面输入的用户名和密码,调用dao层获取数据,将获取到的数据保存到session对象中,然后重定向,将数据发到成功页面

    package org.fkjava.Servlet;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import org.fkjava.bean.User;
    import org.fkjava.dao.UserDao;
    import org.fkjava.util.MD5;
    /**
     * Servlet implementation class LoginServlet
     */
    @WebServlet("/login")//请求路径,  如果配置了@WebServlet注解就不配置web.xml,两者二选一
    public class LoginServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;    
        /**
         * @see HttpServlet#HttpServlet()
         */
        public LoginServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
        /**
         * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
         */
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            /**设置请求编码*/
            request.setCharacterEncoding("UTF-8");
            /**设置响应类型*/
            response.setContentType("text/html");
            /**设置响应编码*/
            response.setCharacterEncoding("UTF-8"); 
    //获取MD5加密对象 MD5 pwd = new MD5(); //获取输入的用户名和密码 String name = request.getParameter("username"); String pass = null; try { pass = pwd.getMD5(request.getParameter("password")); } catch (Exception e) { // TODO: handle exceptio e.printStackTrace(); } //初始化dao层 UserDao userDao = new UserDao(); /**调用dao层的获取用户的方法*/ try { String user = userDao.findUserByName(name,pass); System.out.println(user); //获取session,将获取到的数据保存到session中 HttpSession session = request.getSession(); session.setAttribute("user", user); //重定向,跳转到成功页面 response.sendRedirect("success.jsp"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

    4、创建一个工具类,用于生成连接工厂,这里需要使用的数据库的驱动jar包mysql-connector-java-5.1.40.jar

    package org.fkjava.jdbc;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    public class ConnectionFactory {
        //准备参数
        private static String url = "jdbc:mysql://127.0.0.1:3306/rqzc_db?useSSL=false";
        private static String user = "root";
        private static String password ="";
        
        //使用静态代码块加载驱动
        static{
            try {
                /**使用类名加载数据库驱动*/
                Class.forName("com.mysql.jdbc.Driver");
            } catch (Exception e) {
                e.printStackTrace();
                /**创建运行时异常*/
                throw new RuntimeException("数据库驱动加载异常!", e);    
            }
        }
        /**提供公共、静态的连接数据库的方法*/
        public static Connection getConnection() throws SQLException{
            Connection conn = DriverManager.getConnection(url, user, password);        
            return conn;    
        }    
    }

    5、创建UserDao类,通过连接工厂获取连接,拼接sql语句,执行预编译(方式sql语句攻击,例如admin' or '1'='1会直接通过),设置参数,执行查询语句返回结果集

    package org.fkjava.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import org.fkjava.jdbc.ConnectionFactory;
    public class UserDao {
    
        public String findUserByName(String name, String pass) throws Exception {
            /**获取连接,因为连接工厂设置的静态方法,可以指定使用类名调用方法*/
            Connection conn = ConnectionFactory.getConnection();        
            /**拼接sql语句*/
            String sql = "select * from r_employee where username= ? and password = ?";        
            /**预编译sql语句,这样是为了防止sql语句攻击*/
            PreparedStatement statement = conn.prepareStatement(sql);
            /**set参数,1表示第一个参数,2表示第二个参数*/
            statement.setString(1, name);
            statement.setString(2, pass);
            //执行sql语句,返回结果集
            ResultSet rs = statement.executeQuery();
            /**判断结果集是否有数据*/
            if(rs.last()){
                /**返回用户真实姓名*/
                return rs.getString("realname");
            }else{
                return "查询失败!";
            }   
        }    
    }

    6、如果查询到数据,保存到session对象中,并重定向到成功页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>成功页面</title>
    </head>
    <body>
        ${sessionScope.user}:登录成功!
    </body>
    </html>

    7、bean实体类

    package org.fkjava.bean;
    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;
        }    
    }

    8、补充:下面是编码结构示意图:

  • 相关阅读:
    深入浅出理解依赖注入这种由外部负责其依赖需求的行为,我们可以称其为 “控制反转(IoC)”
    php 远程下载图片到本地
    深入理解 RESTful Api 架构
    uva 10369 Arctic Network (最小生成树加丁点变形)
    UVALive
    UVA
    UVA
    POJ 1182 食物链(经典带权并查集 向量思维模式 很重要)
    HDU 1829 A Bug's Life (种类并查集)
    UVA
  • 原文地址:https://www.cnblogs.com/guzhou-ing/p/6692838.html
Copyright © 2011-2022 走看看