15、简单的登录案例

简单的登录案例

步骤:

1.编写实体类

public class User {
    private String username;
    private String password;

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }
}

2.编写数据库的配置文件 db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mvctest?useSSL=true&useUnicode=true&characterEncoding=utf-8
username=root
password=root

3.编写公共类

  • BaseDao

    public class BaseDao {
        private static String driver;
        private static String url;
        private static String username;
        private static String password;
    
        //静态代码块
        static {
            try {
                Properties properties = new Properties();
                InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
                properties.load(is);
                driver = properties.getProperty("driver");
                url = properties.getProperty("url");
                username = properties.getProperty("username");
                password = properties.getProperty("password");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //连接数据库的方法
        public static Connection getConnection() {
            Connection connection = null;
            try {
                Class.forName(driver);
                connection = DriverManager.getConnection(url, username, password);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return connection;
        }
    
        //查询数据库的方法
        public static ResultSet execute(Connection connection, PreparedStatement pstt,ResultSet rs,String sql,Object[] params) throws SQLException {
            pstt = connection.prepareStatement(sql);
            for ( int i = 0; i < params.length; i++ ) {
                pstt.setObject(i+1,params[i]);
            }
            rs = pstt.executeQuery();
            return rs;
        }
    
        //关闭数据源
        public static boolean closeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet) {
            boolean flag = true;
    
            if ( resultSet != null ) {
                try {
                    resultSet.close();
                    resultSet = null;
                } catch (SQLException e) {
                    e.printStackTrace();
                    flag = false;
                }
            }
    
            if ( preparedStatement != null ) {
                try {
                    preparedStatement.close();
                    preparedStatement = null;
                } catch (SQLException e) {
                    e.printStackTrace();
                    flag = false;
                }
            }
    
            if ( connection != null ) {
                try {
                    connection.close();
                    connection = null;
                } catch (SQLException e) {
                    e.printStackTrace();
                    flag = false;
                }
            }
            return flag;
        }
    }
    
  • Constant

public class Constant {
    public static final String USER_SESSION = "userSession";
}

4.编写过滤器(用来设置字符编码格式)

public class ChrasetEncodingFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        filterChain.doFilter(request,response);
    }

    public void destroy() {

    }
}

**配置过滤器的xml **

	<filter>
        <filter-name>ChrasetEncodingFilter</filter-name>
        <filter-class>com.cc.filter.ChrasetEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ChrasetEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

5.编写dao层

public interface UserDao {
    public User loginUser(Connection connection,String username,String password) throws SQLException;
}

实现类

public class UserDaoImpl implements UserDao{
    public User loginUser(Connection connection, String username, String password) throws SQLException {
        PreparedStatement pstt = null;
        ResultSet rs = null;
        User user = null;

        if ( connection != null ) {
            String sql = " select * from people where username = ? and password = ?";
            Object[] params = {username,password};
            rs = BaseDao.execute(connection, pstt, rs, sql, params);
            if ( rs.next() ) {
                user = new User();
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
            }
            BaseDao.closeResource(null,pstt,rs);
        }
        return user;
    }
}

6.编写业务层service

public interface UserService {    public User findUserNameandPassword(String username,String password);}

实现类

public class UserServiceImpl implements UserService{    //调用dao层    private UserDao userDao;    public UserServiceImpl() {        userDao = new UserDaoImpl();    }    public User findUserNameandPassword(String username, String password) {        Connection connection = null;        User user = null;        try {            connection = BaseDao.getConnection();            user = userDao.loginUser(connection, username, password);        } catch (SQLException e) {            e.printStackTrace();        } finally {            BaseDao.closeResource(connection,null,null);        }        return user;    }}

7.编写Loginservlet

public class LoginServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        String username = req.getParameter("username");        String password = req.getParameter("password");        req.setAttribute("name", username);        UserService userService = new UserServiceImpl();        User user = userService.findUserNameandPassword(username, password);        if (user != null) {            req.getSession().setAttribute(Constant.USER_SESSION, user);            resp.sendRedirect("/sys/success.jsp");        } else {            req.getRequestDispatcher("/error.jsp").forward(req, resp);        }    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }}

配置xml

	<servlet>        <servlet-name>LoginServlet</servlet-name>        <servlet-class>com.cc.servlet.LoginServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>LoginServlet</servlet-name>        <url-pattern>/login</url-pattern>    </servlet-mapping>

8.编写前端登录页面 login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>登录界面</title></head><body><div style="text-align: center">    <h1>个人信息登录</h1>    <form action="${pageContext.request.contextPath}/login" method="post">        <div>            <label>用户名:</label>            <input type="text" name="username" placeholder="请输入用户名">        </div>        <div>            <label>密码:</label>            <input type="password" name="password" placeholder="请输入密码">        </div>        <div>            <input type="submit" value="登录">        </div>    </form></div></body></html>

9.当输入的用户名和密码和数据库一样时,则跳转到/sys/success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>Title</title></head><body><h1>${sessionScope.userSession.username},欢迎您</h1><p><a href="/logout">注销</a> </p></body></html>

10.注销后则不能访问 /sys/success.jsp (设置过滤器)

public class SysFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        HttpServletRequest request = (HttpServletRequest) servletRequest;        HttpServletResponse response = (HttpServletResponse) servletResponse;        Object session = request.getSession().getAttribute(Constant.USER_SESSION);        if ( session == null ) {            response.sendRedirect("/login.jsp");        }        filterChain.doFilter(request,response);    }    @Override    public void destroy() {    }}

配置xml

	<filter>        <filter-name>SysFilter</filter-name>        <filter-class>com.cc.filter.SysFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>SysFilter</filter-name>        <url-pattern>/sys/*</url-pattern>    </filter-mapping>

11.注销后跳转到logout中(LogoutServlet)

public class LogoutServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        Object session = req.getSession().getAttribute(Constant.USER_SESSION);        if ( session != null ) {            req.getSession().removeAttribute(Constant.USER_SESSION);            resp.sendRedirect("/login.jsp");        } else {            resp.sendRedirect("/login.jsp");        }    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }}

配置xml

	<servlet>        <servlet-name>LogoutServlet</servlet-name>        <servlet-class>com.cc.servlet.LogoutServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>LogoutServlet</servlet-name>        <url-pattern>/logout</url-pattern>    </servlet-mapping>

12.当输入的用户名和密码和数据库不一样时,则跳转到error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>失败界面</title></head><body><h1>抱歉,${requestScope.name}没有权限访问</h1><p><a href="login.jsp">返回首页</a></p></body></html>

13.设置首页

	<welcome-file-list>        <welcome-file>login.jsp</welcome-file>    </welcome-file-list>

数据库数据如下:

image-20210615235757436

效果如下:

首页

image-20210615235848230

输入正确的用户名和密码时:

image-20210615235921996

image-20210616000208026

image-20210615235939973

注销后再访问 sys/success.jsp 访问失败

输入正确的用户名和错误的密码时

image-20210616000304616

输入错误的用户名和密码时:

image-20210616000055062

image-20210616000347274

image-20210616000115817

posted @ 2021-06-23 23:03  多瑞C  阅读(98)  评论(0)    收藏  举报