精华内容
下载资源
问答
  • 本科毕设,JSP和eclipse开发。实现用户注册登录和后台管理
  • Dreamweaver8+PHP动态网站开发从入门到精通-10-用户注册和登录
  • RegisterPageMockup 适用于手机,平板电脑和台式机尺寸屏幕的Avenue Fashion用户注册页面模型。 Web设计和开发2最终项目。
  • Hibernate开发用户登陆注册网站系统Hibernate开发用户登陆注册网站系统
  • 软件开发注册页面网站模板是一款简洁的用户注册页面模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。
  • 题目:小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求: 1. 密码只能由大写字母,小写字母,数字构成; 2. 密码不能以数字开头; 3. ...

    题目:小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:

    1. 密码只能由大写字母,小写字母,数字构成;

    2. 密码不能以数字开头;

    3. 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;

    4. 密码长度至少为8

    现在小明受到了n个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的

    输入:
    输入一个数n,接下来有n(n≤100)行,每行一个字符串,表示一个密码,输入保证字符串中只出现大写字母,小写字母和数字,字符串长度不超过100。

    输出:
    输入n行,如果密码合法,输出YES,不合法输出NO

    例如:
    输入:
    1
    CdKfIfsiBgohWsydFYlMVRrGUpMALbmygeXdNpTmWkfyiZIKPtiflcgppuR
    输出:
    YES

    代码:

    import java.util.Scanner;
    
    public class Test {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            while (n != 0) {
                String str = sc.next();
                char[] arr = new char[str.length()];
                arr = str.toCharArray();
                int count1 = 0;
                int count2 = 0;
                int count3 = 0;
                if (str.length() < 8) {
                    System.out.println("NO,长度问题");
                    n--;
                    return;
                }
                if ('0' <= arr[0] && arr[0] <= '9') {
                    System.out.println("NO,首字母是数字");
                    n--;
                    return;
                }
                for (int i = 0; i < str.length(); i++) {
                    if ('0' <= arr[i] && arr[i] <= '9') {
                        count1++;
                    }
                    if ('a' <= arr[i] && arr[i] <= 'z') {
                        count2++;
                    }
                    if ('A' <= arr[i] && arr[i] <= 'Z') {
                        count3++;
                    }
                }
                if(count1>0&&count2>0 || count1>0&&count3>0 ||count2>0&&count3>0) {
                    System.out.println("YES");
                    n--;
                }else {
                    System.out.println("NO");
                    n--;
                }
            }
        }
    }
    展开全文
  • PHP网站开发实战项目式教程 学习目标知识目标掌握产生随机数函数和图像函数掌握Cookie和Session的使用技能目标制作验证码功能掌握制作注册与登录页面的流程目录子任务一制作图像验证码子任务二用户注册页面制作子...
  • 一、Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,... 这里以一个最常用的用户登录注册程序来讲解Servle

    一、Servlet+JSP+JavaBean开发模式(MVC)介绍

      Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式。

      这里以一个最常用的用户登录注册程序来讲解Servlet+JSP+JavaBean开发模式,通过这个用户登录注册程序综合案例,把之前的学过的XML、Xpath、Servlet、jsp的知识点都串联起来。

    二、创建MVC架构的Web项目

      在MyEclipse中新创建一个webmvcframework项目,导入项目所需要的开发包(jar包),创建项目所需要的包,在java开发中,架构的层次是以包的形式体现出来的

    项目所需要的开发包(jar包)

    这里写图片描述
      

    项目所需要建的包名

    这里写图片描述

      一个良好的JavaWeb项目架构应该具有以上的11个包,这样显得层次分明,各个层之间的职责也很清晰明了,搭建JavaWeb项目架构时,就按照上面的1~11的序号顺序创建包:
      domain→dao→dao.impl→service→service.impl→web.controller→web.UI→web.filter→web.listener→util→junit.test

    包的层次创建好了,项目的架构也就定下来了,当然,在实际的项目开发中,也不一定是完完全全按照上面说的来创建包的层次结构,而是根据项目的实际情况,可能还需要创建其他的包,这个得根据项目的需要来定了

      在src目录(类目录)下面,创建用于保存用户数据的xml文件(DB.xml)

      在WEB-INF目录下创建一个pages目录,pages目录存放系统的一些受保护(不允许用户直接通过URL地址访问)的jsp页面,用户要想访问这些受保护的jsp页面,那么只能通过me.gacl.web.UI这个包里面的Servlet

      创建好的项目如下图(图-1)所示:

      这里写图片描述

                    图-1

    三、分层架构的代码编写

      分层架构的代码也是按照【域模型层(domain)】→【数据访问层(dao、dao.impl)】→【业务处理层(service、service.impl)】→【表现层(web.controller、web.UI、web.filter、web.listener)】→【工具类(util)】→【测试类(junit.test)】的顺序进行编写的。

    3.1、开发domain层

      在me.gacl.domain包下创建一个User类

      这里写图片描述

      User类具体代码如下:

    package me.gacl.domain;
    
    import java.io.Serializable;
    import java.util.Date;
    /**
     * @author gacl
     * 用户实体类
     */
    public class User implements Serializable {
    
        private static final long serialVersionUID = -4313782718477229465L;
    
        // 用户ID
        private String id;
        // 用户名
        private String userName;
        // 用户密码
        private String userPwd;
        // 用户邮箱
        private String email;
        // 用户生日
        private Date birthday;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getUserPwd() {
            return userPwd;
        }
    
        public void setUserPwd(String userPwd) {
            this.userPwd = userPwd;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    }

    3.2、开发数据访问层(dao、dao.impl)

      在me.gacl.dao包下创建一个IUserDao接口类,对于开发接口类,我习惯以字母I作类的前缀,这样一眼就看出当前这个类是一个接口,这也算是一种良好的开发习惯吧,通过看类名就可以方便区分出是接口还是具体的实现类。

      这里写图片描述

      IUserDao接口的具体代码如下:

    package me.gacl.dao;
    
    import me.gacl.domain.User;
    
    public interface IUserDao {
    
        /**
         * 根据用户名和密码来查找用户
         * @param userName
         * @param userPwd
         * @return 查到到的用户
         */
        User find(String userName, String userPwd);
    
        /**
         * 添加用户
         * @param user
         */
        void add(User user);
    
        /**根据用户名来查找用户
         * @param userName
         * @return 查到到的用户
         */
        User find(String userName);
    }

      对于接口中的方法定义,这个只能是根据具体的业务来分析需要定义哪些方法了,但是无论是多么复杂的业务,都离不开基本的CRUD(增删改查)操作,Dao层是直接和数据库交互的,所以Dao层的接口一般都会有增删改查这四种操作的相关方法。

      在me.gacl.dao.impl包下创建一个UserDaoImpl类

      这里写图片描述

      UserDaoImpl类是IUserDao接口的具体实现类,对于接口的实现类命名方式,我习惯以”接口名(去除前缀I)+impl”形式或者”接口名+impl”形式来命名:IUserDao(接口)→UserDaoImpl(实现类)或者IUserDao(接口)→IUserDaoImpl(实现类),这也算是一些个人的编程习惯吧,平时看到的代码大多数都是以这两种形式中的一种来来命名接口的具体实现类的,反正就是要能够一眼看出接口对应的实现类是哪一个就可以了。

      UserDaoImpl类的具体代码如下:

    package me.gacl.dao.impl;
    
    import java.text.SimpleDateFormat;
    import org.dom4j.Document;
    import org.dom4j.Element;
    import me.gacl.dao.IUserDao;
    import me.gacl.domain.User;
    import me.gacl.util.XmlUtils;
    
    /**
     * IUserDao接口的实现类
     * @author gacl
     */
    public class UserDaoImpl implements IUserDao {
    
        @Override
        public User find(String userName, String userPwd) {
            try{
                Document document = XmlUtils.getDocument();
                //使用XPath表达式来操作XML节点
                Element e = (Element) document.selectSingleNode("//user[@userName='"+userName+"' and @userPwd='"+userPwd+"']");
                if(e==null){
                    return null;
                }
                User user = new User();
                user.setId(e.attributeValue("id"));
                user.setEmail(e.attributeValue("email"));
                user.setUserPwd(e.attributeValue("userPwd"));
                user.setUserName(e.attributeValue("userName"));
                String birth = e.attributeValue("birthday");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                user.setBirthday(sdf.parse(birth));
    
                return user;
    
            }catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        @SuppressWarnings("deprecation")
        @Override
        public void add(User user) {
            try{
                Document document = XmlUtils.getDocument();
                Element root = document.getRootElement();
                Element user_node = root.addElement("user");  //创建user结点,并挂到root
                user_node.setAttributeValue("id", user.getId());
                user_node.setAttributeValue("userName", user.getUserName());
                user_node.setAttributeValue("userPwd", user.getUserPwd());
                user_node.setAttributeValue("email", user.getEmail());
    
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
                user_node.setAttributeValue("birthday", sdf.format(user.getBirthday()));
    
                XmlUtils.write2Xml(document);
    
            }catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public User find(String userName) {
            try{
                Document document = XmlUtils.getDocument();
                Element e = (Element) document.selectSingleNode("//user[@userName='"+userName+"']");
                if(e==null){
                    return null;
                }
                User user = new User();
                user.setId(e.attributeValue("id"));
                user.setEmail(e.attributeValue("email"));
                user.setUserPwd(e.attributeValue("userPwd"));
                user.setUserName(e.attributeValue("userName"));
                String birth = e.attributeValue("birthday");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                user.setBirthday(sdf.parse(birth));
    
                return user;
    
            }catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
    }

    3.3、开发service层(service层对web层提供所有的业务服务)

      在me.gacl.service包中创建IUserService接口类

      这里写图片描述

      IUserService接口的具体代码如下:

    package me.gacl.service;
    
    import me.gacl.domain.User;
    import me.gacl.exception.UserExistException;
    
    public interface IUserService {
    
        /**
         * 提供注册服务
         * @param user
         * @throws UserExistException
         */
        void registerUser(User user) throws UserExistException;
    
        /**
         * 提供登录服务
         * @param userName
         * @param userPwd
         * @return
         */
        User loginUser(String userName, String userPwd);
    }

      在me.gacl.service.impl包中创建UserServiceImpl类

      这里写图片描述

      UserServiceImpl类为IUserService接口的具体实现类,具体代码如下:

    package me.gacl.service.impl;
    
    import me.gacl.dao.IUserDao;
    import me.gacl.dao.impl.UserDaoImpl;
    import me.gacl.domain.User;
    import me.gacl.exception.UserExistException;
    import me.gacl.service.IUserService;
    
    public class UserServiceImpl implements IUserService {
    
        private IUserDao userDao = new UserDaoImpl();
    
        @Override
        public void registerUser(User user) throws UserExistException {
            if (userDao.find(user.getUserName())!=null) {
                //checked exception 
                //unchecked exception
                //这里抛编译时异常的原因:是我想上一层程序处理这个异常,以给用户一个友好提示
                throw new UserExistException("注册的用户名已存在!!!");
            }
            userDao.add(user);
        }
    
        @Override
        public User loginUser(String userName, String userPwd) {
            return userDao.find(userName, userPwd);
        }
    
    }

    3.4、开发web层

    3.4.1、 开发注册功能

        1、在me.gacl.web.UI包下写一个RegisterUIServlet为用户提供注册界面

        这里写图片描述

      RegisterUIServlet收到用户请求后,就跳到register.jsp

      RegisterUIServlet的代码如下:

    package me.gacl.web.UI;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * @author gacl
     * 为用户提供注册的用户界面的Servlet
     * RegisterUIServlet负责为用户输出注册界面
     * 当用户访问RegisterUIServlet时,就跳转到WEB-INF/pages目录下的register.jsp页面
     */
    public class RegisterUIServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request, response);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    2、在/WEB-INF/pages/目录下编写用户注册的jsp页面register.jsp

        这里写图片描述

        凡是位于WEB-INF目录下的jsp页面是无法直接通过URL地址直接访问的,

        这里写图片描述

        在开发中如果项目中有一些敏感web资源不想被外界直接访问,那么可以考虑将这些敏感的web资源放到WEB-INF目录下,这样就可以禁止外界直接通过URL来访问了。

      register.jsp页面的代码如下:

    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML>
    <html>
        <head>
            <title>用户注册</title>
        </head>
    
        <body style="text-align: center;">
            <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">
                <table width="60%" border="1">
                    <tr>
                        <td>用户名</td>
                        <td>
    
                            <input type="text" name="userName">
                        </td>
                    </tr>
                    <tr>
                        <td>密码</td>
                        <td>
                            <input type="password" name="userPwd">
                        </td>
                    </tr>
                    <tr>
                        <td>确认密码</td>
                        <td>
                            <input type="password" name="confirmPwd">
                        </td>
                    </tr>
                    <tr>
                        <td>邮箱</td>
                        <td>
                            <input type="text" name="email">
                        </td>
                    </tr>
                    <tr>
                        <td>生日</td>
                        <td>
                            <input type="text" name="birthday">
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <input type="reset" value="清空">
                        </td>
                        <td>
                            <input type="submit" value="注册">
                        </td>
                    </tr>
                </table>
            </form>
        </body>
    </html>

      register.jsp中的<form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">指明表单提交后,交给RegisterServlet进行处理

    3、在me.gacl.web.controller包下编写用于处理用户注册的RegisterServlet

        这里写图片描述

        RegisterServlet担任着以下几个职责:
    - 1、接收客户端提交到服务端的表单数据。

    • 2、校验表单数据的合法性,如果校验失败跳回到register.jsp,并回显错误信息。

    • 3、如果校验通过,调用service层向数据库中注册用户。

          为了方便RegisterServlet接收表单数据和校验表单数据,在此我设计一个用于校验注册表单数据RegisterFormbean,再写WebUtils工具类,封装客户端提交的表单数据到formbean中。

        在me.gacl.web.formbean包下创建一个用于校验注册表单数据RegisterFormbean

        这里写图片描述

        RegisterFormbean代码如下:

    package me.gacl.web.formbean;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
    
    /**
     * 封装的用户注册表单bean,用来接收register.jsp中的表单输入项的值
     * RegisterFormBean中的属性与register.jsp中的表单输入项的name一一对应
     * RegisterFormBean的职责除了负责接收register.jsp中的表单输入项的值之外还担任着校验表单输入项的值的合法性
     * @author gacl
     *
     */
    public class RegisterFormBean {
    
        //RegisterFormBean中的属性与register.jsp中的表单输入项的name一一对应
        //<input type="text" name="userName"/>
        private String userName;
        //<input type="password" name="userPwd"/>
        private String userPwd;
        //<input type="password" name="confirmPwd"/>
        private String confirmPwd;
        //<input type="text" name="email"/>
        private String email;
        //<input type="text" name="birthday"/>
        private String birthday;
    
    
        /**
         * 存储校验不通过时给用户的错误提示信息
         */
        private Map<String, String> errors = new HashMap<String, String>();
    
        public Map<String, String> getErrors() {
            return errors;
        }
    
        public void setErrors(Map<String, String> errors) {
            this.errors = errors;
        }
    
        /*
         * validate方法负责校验表单输入项
         * 表单输入项校验规则:
         *         private String userName; 用户名不能为空,并且要是3-8的字母 abcdABcd 
         *         private String userPwd; 密码不能为空,并且要是3-8的数字
         *         private String confirmPwd; 两次密码要一致
         *         private String email; 可以为空,不为空要是一个合法的邮箱 
         *         private String birthday; 可以为空,不为空时,要是一个合法的日期
         */
        public boolean validate() {
    
            boolean isOk = true;
    
            if (this.userName == null || this.userName.trim().equals("")) {
                isOk = false;
                errors.put("userName", "用户名不能为空!!");
            } else {
                if (!this.userName.matches("[a-zA-Z]{3,8}")) {
                    isOk = false;
                    errors.put("userName", "用户名必须是3-8位的字母!!");
                }
            }
    
            if (this.userPwd == null || this.userPwd.trim().equals("")) {
                isOk = false;
                errors.put("userPwd", "密码不能为空!!");
            } else {
                if (!this.userPwd.matches("\\d{3,8}")) {
                    isOk = false;
                    errors.put("userPwd", "密码必须是3-8位的数字!!");
                }
            }
    
            // private String password2; 两次密码要一致
            if (this.confirmPwd != null) {
                if (!this.confirmPwd.equals(this.userPwd)) {
                    isOk = false;
                    errors.put("confirmPwd", "两次密码不一致!!");
                }
            }
    
            // private String email; 可以为空,不为空要是一个合法的邮箱
            if (this.email != null && !this.email.trim().equals("")) {
                if (!this.email.matches("\\w+@\\w+(\\.\\w+)+")) {
                    isOk = false;
                    errors.put("email", "邮箱不是一个合法邮箱!!");
                }
            }
    
            // private String birthday; 可以为空,不为空时,要是一个合法的日期
            if (this.birthday != null && !this.birthday.trim().equals("")) {
                try {
                    DateLocaleConverter conver = new DateLocaleConverter();
                    conver.convert(this.birthday);
                } catch (Exception e) {
                    isOk = false;
                    errors.put("birthday", "生日必须要是一个日期!!");
                }
            }
    
            return isOk;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getUserPwd() {
            return userPwd;
        }
    
        public void setUserPwd(String userPwd) {
            this.userPwd = userPwd;
        }
    
        public String getConfirmPwd() {
            return confirmPwd;
        }
    
        public void setConfirmPwd(String confirmPwd) {
            this.confirmPwd = confirmPwd;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getBirthday() {
            return birthday;
        }
    
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    }

      在me.gacl.util包下创建一个WebUtils工具类,该工具类的功能就是封装客户端提交的表单数据到formbean中

      这里写图片描述

    package me.gacl.util;
    
    import java.util.Enumeration;
    import java.util.UUID;
    import javax.servlet.http.HttpServletRequest;
    import org.apache.commons.beanutils.BeanUtils;
    
    /**
     * @author gacl
     * 把request对象中的请求参数封装到bean中
     */
    public class WebUtils {
    
        /**
         * 将request对象转换成T对象
         * @param request 
         * @param clazz
         * @return
         */
        public static <T> T request2Bean(HttpServletRequest request,Class<T> clazz){
            try{
                T bean = clazz.newInstance();
                Enumeration<String> e = request.getParameterNames(); 
                while(e.hasMoreElements()){
                    String name = (String) e.nextElement();
                    String value = request.getParameter(name);
                    BeanUtils.setProperty(bean, name, value);
                }
                return bean;
            }catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 生成UUID
         * @return
         */
        public static String makeId(){
            return UUID.randomUUID().toString();
        }
    
    }

      最后看一下负责处理用户注册的RegisterServlet完整代码:

    package me.gacl.web.controller;
    
    import java.io.IOException;
    import java.util.Date;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.beanutils.BeanUtils;
    import org.apache.commons.beanutils.ConvertUtils;
    import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
    import me.gacl.domain.User;
    import me.gacl.exception.UserExistException;
    import me.gacl.service.IUserService;
    import me.gacl.service.impl.UserServiceImpl;
    import me.gacl.util.WebUtils;
    import me.gacl.web.formbean.RegisterFormBean;
    /**
     * 处理用户注册的Servlet
     * @author gacl
     *
     */
    public class RegisterServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //将客户端提交的表单数据封装到RegisterFormBean对象中
            RegisterFormBean formbean = WebUtils.request2Bean(request,RegisterFormBean.class);
            //校验用户注册填写的表单数据
            if (formbean.validate() == false) {//如果校验失败
                //将封装了用户填写的表单数据的formbean对象发送回register.jsp页面的form表单中进行显示
                request.setAttribute("formbean", formbean);
                //校验失败就说明是用户填写的表单数据有问题,那么就跳转回register.jsp
                request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request, response);
                return;
            }
    
            User user = new User();
            try {
                // 注册字符串到日期的转换器
                ConvertUtils.register(new DateLocaleConverter(), Date.class);
                BeanUtils.copyProperties(user, formbean);//把表单的数据填充到javabean中
                user.setId(WebUtils.makeId());//设置用户的Id属性
                IUserService service = new UserServiceImpl();
                //调用service层提供的注册用户服务实现用户注册
                service.registerUser(user);
                String message = String.format(
                        "注册成功!!3秒后为您自动跳到登录页面!!<meta http-equiv='refresh' content='3;url=%s'/>", 
                        request.getContextPath()+"/servlet/LoginUIServlet");
                request.setAttribute("message",message);
                request.getRequestDispatcher("/message.jsp").forward(request,response);
    
            } catch (UserExistException e) {
                formbean.getErrors().put("userName", "注册用户已存在!!");
                request.setAttribute("formbean", formbean);
                request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request, response);
            } catch (Exception e) {
                e.printStackTrace(); // 在后台记录异常
                request.setAttribute("message", "对不起,注册失败!!");
                request.getRequestDispatcher("/message.jsp").forward(request,response);
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

      用户注册时如果填写的表单数据校验不通过,那么服务器端就将一个存储了错误提示消息和表单数据的formbean对象存储到request对象中,然后发送回register.jsp页面,因此我们需要在register.jsp页面中取出request对象中formbean对象,然后将用户填写的表单数据重新回显到对应的表单项上面,将出错时的提示消息也显示到form表单上面,让用户知道是哪些数据填写不合法!

      修改register.jsp页面,代码如下:

    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML>
    <html>
        <head>
            <title>用户注册</title>
        </head>
    
        <body style="text-align: center;">
            <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">
                <table width="60%" border="1">
                    <tr>
                        <td>用户名</td>
                        <td>
                            <%--使用EL表达式${}提取存储在request对象中的formbean对象中封装的表单数据(formbean.userName)以及错误提示消息(formbean.errors.userName)--%>
                            <input type="text" name="userName" value="${formbean.userName}">${formbean.errors.userName}
                        </td>
                    </tr>
                    <tr>
                        <td>密码</td>
                        <td>
                            <input type="password" name="userPwd" value="${formbean.userPwd}">${formbean.errors.userPwd}
                        </td>
                    </tr>
                    <tr>
                        <td>确认密码</td>
                        <td>
                            <input type="password" name="confirmPwd" value="${formbean.confirmPwd}">${formbean.errors.confirmPwd}
                        </td>
                    </tr>
                    <tr>
                        <td>邮箱</td>
                        <td>
                            <input type="text" name="email" value="${formbean.email}">${formbean.errors.email}
                        </td>
                    </tr>
                    <tr>
                        <td>生日</td>
                        <td>
                            <input type="text" name="birthday" value="${formbean.birthday}">${formbean.errors.birthday}
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <input type="reset" value="清空">
                        </td>
                        <td>
                            <input type="submit" value="注册">
                        </td>
                    </tr>
                </table>
            </form>
        </body>
    </html>

      到此,用户注册功能就算是开发完成了!

      下面测试一下开发好的用户注册功能:

        输入URL地址:http://localhost:8080/webmvcframework/servlet/RegisterUIServlet访问register.jsp页面,运行效果如下:

        这里写图片描述

      如果输入的表单项不符合校验规则,那么是无法进行注册的,运行效果如下:

        这里写图片描述

    3.4.2、 开发登录功能

      1、在me.gacl.web.UI包下写一个LoginUIServlet为用户提供登录界面

      这里写图片描述

      LoginUIServlet收到用户请求后,就跳到login.jsp

      LoginUIServlet的代码如下:

    package me.gacl.web.UI;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @author gacl
     * LoginUIServlet负责为用户输出登陆界面
     * 当用户访问LoginUIServlet时,就跳转到WEB-INF/pages目录下的login.jsp页面
     */
    public class LoginUIServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            request.getRequestDispatcher("/WEB-INF/pages/login.jsp").forward(request, response);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

      2、在/WEB-INF/pages/目录下编写用户登录的jsp页面login.jsp

      这里写图片描述

      login.jsp页面的代码如下:

    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>用户登陆</title>
      </head>
    
      <body>
        <form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="post">
            用户名:<input type="text" name="username"><br/>
            密码:<input type="password" name="password"><br/>
            <input type="submit" value="登陆">
        </form>
      </body>
    </html>

      login.jsp中的<form action="${pageContext.request.contextPath}/servlet/LoginServlet" method="post">指明表单提交后,交给LoginServlet进行处理。

    3、在me.gacl.web.controller包下编写用于处理用户登录的LoginServlet

      这里写图片描述

      LoginServlet的代码如下:

    package me.gacl.web.controller;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import me.gacl.domain.User;
    import me.gacl.service.IUserService;
    import me.gacl.service.impl.UserServiceImpl;
    
    /**
     * 处理用户登录的servlet
     * @author gacl
     *
     */
    public class LoginServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            //获取用户填写的登录用户名
            String username = request.getParameter("username");
            //获取用户填写的登录密码
            String password = request.getParameter("password");
    
            IUserService service = new UserServiceImpl();
            //用户登录
            User user = service.loginUser(username, password);
            if(user==null){
                String message = String.format(
                        "对不起,用户名或密码有误!!请重新登录!2秒后为您自动跳到登录页面!!<meta http-equiv='refresh' content='2;url=%s'", 
                        request.getContextPath()+"/servlet/LoginUIServlet");
                request.setAttribute("message",message);
                request.getRequestDispatcher("/message.jsp").forward(request, response);
                return;
            }
            //登录成功后,就将用户存储到session中
            request.getSession().setAttribute("user", user);
            String message = String.format(
                    "恭喜:%s,登陆成功!本页将在3秒后跳到首页!!<meta http-equiv='refresh' content='3;url=%s'", 
                    user.getUserName(),
                    request.getContextPath()+"/index.jsp");
            request.setAttribute("message",message);
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

      到此,用户登录的功能就算是开发完成了。

      下面测试一下开发好的用户登录功能,输入URL地址:http://localhost:8080/webmvcframework/servlet/LoginUIServlet访问login.jsp页面,输入正确的用户名和密码进行登录,运行效果如下:

      这里写图片描述

      如果输入的用户名和密码错误,那么就无法登录成功,运行效果如下:

      这里写图片描述

    3.4.3、 开发注销功能

      在me.gacl.web.controller包下编写用于处理用户注销的LogoutServlet

      LogoutServlet的代码如下:

    package me.gacl.web.controller;
    
    import java.io.IOException;
    import java.text.MessageFormat;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LogoutServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //移除存储在session中的user对象,实现注销功能
            request.getSession().removeAttribute("user");
            //由于字符串中包含有单引号,在这种情况下使用MessageFormat.format方法拼接字符串时就会有问题
            //MessageFormat.format方法只是把字符串中的单引号去掉,不会将内容填充到指定的占位符中
            String tempStr1 = MessageFormat.format(
                    "注销成功!!3秒后为您自动跳到登录页面!!<meta http-equiv='refresh' content='3;url={0}'/>", 
                    request.getContextPath()+"/servlet/LoginUIServlet");
            System.out.println(tempStr1);//输出结果:注销成功!!3秒后为您自动跳到登录页面!!<meta http-equiv=refresh content=3;url={0}/>
            System.out.println("---------------------------------------------------------");
            /**
             * 要想解决"如果要拼接的字符串包含有单引号,那么MessageFormat.format方法就只是把字符串中的单引号去掉,不会将内容填充到指定的占位符中"这个问题,
             * 那么可以需要使用单引号引起来的字符串中使用2个单引号引起来,例如:"<meta http-equiv=''refresh'' content=''3;url={0}''/>"
             * 这样MessageFormat.format("<meta http-equiv=''refresh'' content=''3;url={0}''/>","index.jsp")就可以正常返回
             * <meta http-equiv=''refresh'' content=''3;url=index.jsp'/>
             */
            String tempStr2 = MessageFormat.format(
                    "注销成功!!3秒后为您自动跳到登录页面!!<meta http-equiv=''refresh'' content=''3;url={0}''/>", 
                    request.getContextPath()+"/servlet/LoginUIServlet");
            /**
             * 输出结果:
             * 注销成功!!3秒后为您自动跳到登录页面!!
             * <meta http-equiv='refresh' content='3;url=/webmvcframework/servlet/LoginUIServlet'/>
             */
            System.out.println(tempStr2);
    
            String message = String.format(
                    "注销成功!!3秒后为您自动跳到登录页面!!<meta http-equiv='refresh' content='3;url=%s'/>", 
                    request.getContextPath()+"/servlet/LoginUIServlet");
            request.setAttribute("message",message);
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

      用户登录成功后,会将登录的用户信息存储在session中,所以我们要将存储在session中的user删除掉,这样就可以实现用户注销了。

      用户登录成功后就会跳转到index.jsp页面,在index.jsp页面中放一个【退出登陆】按钮,当点击【退出登陆】按钮时,就访问LogoutServlet,将用户注销。

      index.jsp的代码如下:

    <%@ page language="java"  pageEncoding="UTF-8"%>
    <%--为了避免在jsp页面中出现java代码,这里引入jstl标签库,利用jstl标签库提供的标签来做一些逻辑判断处理 --%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>首页</title>
         <script type="text/javascript">
            function doLogout(){
                //访问LogoutServlet注销当前登录的用户
                window.location.href="${pageContext.request.contextPath}/servlet/LogoutServlet";
            }
        </script>
      </head>
    
      <body>
        <h1>孤傲苍狼的网站</h1>
        <hr/>
        <c:if test="${user==null}">
            <a href="${pageContext.request.contextPath}/servlet/RegisterUIServlet" target="_blank">注册</a>
            <a href="${pageContext.request.contextPath}/servlet/LoginUIServlet">登陆</a>
        </c:if>
        <c:if test="${user!=null}">
               欢迎您:${user.userName}
               <input type="button" value="退出登陆" onclick="doLogout()">
        </c:if>
        <hr/>
    </body>
    </html>

      测试开发好的注销功能,效果如下:

      这里写图片描述

      到此,所有的功能都开发完成了,测试也通过了。

    四、开发总结

      通过这个小例子,可以了解到mvc分层架构的项目搭建,在平时的项目开发中,也都是按照如下的顺序来进行开发的:

      1、搭建开发环境

        1.1 创建web项目

        1.2 导入项目所需的开发包

        1.3 创建程序的包名,在java中是以包来体现项目的分层架构的

      2、开发domain

      把一张要操作的表当成一个VO类(VO类只定义属性以及属性对应的get和set方法,没有涉及到具体业务的操作方法),VO表示的是值对象,通俗地说,就是把表中的每一条记录当成一个对象,表中的每一个字段就作为这个对象的属性。每往表中插入一条记录,就相当于是把一个VO类的实例对象插入到数据表中,对数据表进行操作时,都是直接把一个VO类的对象写入到表中,一个VO类对象就是一条记录。每一个VO对象可以表示一张表中的一行记录,VO类的名称要和表的名称一致或者对应。

      3、开发dao

        3.1 DAO操作接口:每一个DAO操作接口规定了,一张表在一个项目中的具体操作方法,此接口的名称最好按照如下格式编写:“I表名称Dao”。

          ├DAO接口里面的所有方法按照以下的命名编写:
    
            ├更新数据库:doXxx()
    
            ├查询数据库:findXxx()或getXxx()
    

        3.2 DAO操作接口的实现类:实现类中完成具体的增删改查操作

          ├此实现类完成的只是数据库中最核心的操作,并没有专门处理数据库的打开和关闭,因为这些操作与具体的业务操作无关。
    

      4、开发service(service 对web层提供所有的业务服务)

      5、开发web层
     
    点击此处下载项目源码

    展开全文
  • 描述:php实现微信网页自动登录注册功能 范围:适用于所有php版本 thinkphp5.0实例 $token = cookie('token'); if($token){ //这里写登录后的逻辑 }else{ $code = isset($_REQUEST['code'])?$_REQUEST['code']:'...

    功能:自动登录注册功能
    描述:php实现微信网页自动登录注册功能
    范围:适用于所有php版本

    功能实例

    $token = $_COOKIE['wechat_token'];
    if($token){
    	//登录状态中需要处理的部分代码逻辑写到这里
    	
     }else{
     			//获取到code码
                $code = isset($_REQUEST['code'])?$_REQUEST['code']:'';
                if($code){
                //自动请求获取code码并获得token和用户信息的步骤代码
                $app_id ='公众号id';
                $app_secret = '您的公众号密钥';
                $api_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$app_id&secret=$app_secret&code={$code}&grant_type=authorization_code";
                $wechat_result = file_get_contents($api_url);
                $wechat_json= json_decode($wechat_result,true);
    
                    if(isset($wechat_json['openid'])){
                        $openid = $wechat_json['openid'];
                        $api_url ="https://api.weixin.qq
    展开全文
  • PHP 用户注册与登录

    千次阅读 2016-07-29 02:26:20
    网站用户注册与登录是很常用的一个功能,本节教材就以此来演示一下 PHP 中如何开发用户注册与登录模块。 本节需要用到的重点 PHP 基础知识: PHP 中预定义 $_POST 和 $_GET 全局变量来接受用户表单和 URL 参数信息...

    前言

    网站用户注册与登录是很常用的一个功能,本节教材就以此来演示一下 PHP 中如何开发用户注册与登录模块。

    本节需要用到的重点 PHP 基础知识:

    • PHP 中预定义 $_POST 和 $_GET 全局变量来接受用户表单和 URL 参数信息,关于 PHP 表单更多信息参见《PHP 表单》。
    • PHP 正则表达式用于判断用户的输入是否符合要求,关于 正则表达式 更多信息参见《PHP 正则表达式》。
    • 用户登录检测通过后以 session 来保持用户的登录信息,关于 session 更多信息参见《PHP Session》或者《PHP Cookie》。

    需求分析

    主要功能分为 用户注册、用户登录、用户退出、用户中心 四个部分。

    用户注册

    用户注册主要功能有:

    1. 注册信息表单填写界面 javascript 脚本初步检测用户输入的注册信息。
    2. 注册处理模块检测注册信息是否符合要求。
    3. 检测用户名是否已存在。
    4. 将注册信息写入数据表,注册成功。

    用户登录

    用户登录主要功能有:

    1. 登录表单界面 javascript 脚本初步检测用户输入的登录信息。
    2. 登录模块将用户输入信息与数据库数据进行核对。
    3. 登录信息正确,则提示登录成功,将用户设置为登录状态(session)。
    4. 登录信息不正确,则提示登录失败,用户可以再次尝试登录。

    用户退出

    用户退出主要功能有:

    1. 无条件注销 session 。

    用户中心

    用户退出主要功能有:

    1. 判断用户是否登录,如果没有登录,则转向到登录界面。
    2. 如果登录是登录状态,则读出用户相关信息。

    数据表设计

    根据功能需求分析,用于记用户信息的 user 表需要的字段如下:

    字段名 数据类型 说明
    uid mediumint(8) 主键,自动增长
    username char(15) 注册用户名
    password char(32) MD5 加密后的密码
    email varchar(40) 用户 Email
    regdate int(10) 用户注册时间戳

    建表 SQL 参考如下:

    CREATE TABLE `user` (
      `uid` mediumint(8) unsigned NOT NULL auto_increment,
      `username` char(15) NOT NULL default '',
      `password` char(32) NOT NULL default '',
      `email` varchar(40) NOT NULL default '',
      `regdate` int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (`uid`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

    页面布局

    各页面功能如下:

    • reg.html:用户注册信息填写表单页面
    • conn.php:数据库连接包含文件
    • reg.php:用户注册处理程序
    • login.html:用户登录表单页面
    • login.php:用户登录表单页面
    • my.php:用户中心

    注册页面

    reg.html 负责收集用户填写的注册信息。教程里只列出关键的代码片段,完整的代码附在本节最后。

    注册表单

    <fieldset>
    <legend>用户注册</legend>
    <form name="RegForm" method="post" action="reg.php" onSubmit="return InputCheck(this)">
    <p>
    <label for="username" class="label">用户名:</label>
    <input id="username" name="username" type="text" class="input" />
    <span>(必填,3-15字符长度,支持汉字、字母、数字及_)</span>
    <p/>
    <p>
    <label for="password" class="label">密 码:</label>
    <input id="password" name="password" type="password" class="input" />
    <span>(必填,不得少于6位)</span>
    <p/>
    <p>
    <label for="repass" class="label">重复密码:</label>
    <input id="repass" name="repass" type="password" class="input" />
    <p/>
    <p>
    <label for="email" class="label">电子邮箱:</label>
    <input id="email" name="email" type="text" class="input" />
    <span>(必填)</span>
    <p/>
    <p>
    <input type="submit" name="submit" value="  提交注册  " class="left" />
    </p>
    </form>
    </fieldset>


    javascript 检测代码

    <script language=JavaScript>
    <!--
    
    function InputCheck(RegForm)
    {
      if (RegForm.username.value == "")
      {
        alert("用户名不可为空!");
        RegForm.username.focus();
        return (false);
      }
      if (RegForm.password.value == "")
      {
        alert("必须设定登录密码!");
        RegForm.password.focus();
        return (false);
      }
      if (RegForm.repass.value != RegForm.password.value)
      {
        alert("两次密码不一致!");
        RegForm.repass.focus();
        return (false);
      }
      if (RegForm.email.value == "")
      {
        alert("电子邮箱不可为空!");
        RegForm.email.focus();
        return (false);
      }
    }
    
    //-->
    </script>


    CSS 样式

    <style type="text/css">
        html{font-size:12px;}
        fieldset{width:520px; margin: 0 auto;}
        legend{font-weight:bold; font-size:14px;}
        label{float:left; width:70px; margin-left:10px;}
        .left{margin-left:80px;}
        .input{width:150px;}
        span{color: #666666;}
    </style>

    注册表单效果图:

    注册表单效果图

    数据库连接

    <?php
    $conn = @mysql_connect("localhost","root","root123");
    if (!$conn){
        die("连接数据库失败:" . mysql_error());
    }
    mysql_select_db("test", $conn);
    //字符转换,读库
    mysql_query("set character set 'gbk'");
    //写库
    mysql_query("set names 'gbk'");
    ?>

    注册处理

    reg.php 负责处理用户注册信息。

    注册检测

    if(!isset($_POST['submit'])){
        exit('非法访问!');
    }
    $username = $_POST['username'];
    $password = $_POST['password'];
    $email = $_POST['email'];
    //注册信息判断
    if(!preg_match('/^[\w\x80-\xff]{3,15}$/', $username)){
        exit('错误:用户名不符合规定。<a href="javascript:history.back(-1);">返回</a>');
    }
    if(strlen($password) < 6){
        exit('错误:密码长度不符合规定。<a href="javascript:history.back(-1);">返回</a>');
    }
    if(!preg_match('/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/', $email)){
        exit('错误:电子邮箱格式错误。<a href="javascript:history.back(-1);">返回</a>');
    }


    本段代码首先检测是否 POST 提交访问该页,接下来根据注册要求(用户名 3-15 字符长度,支持汉字、字母、数字及_;密码不得少于 6 位)对用户提交的注册信息进行检测。在检测用户名和电子邮箱时采用了正则检测,关于正则表达式更所信息请参看《PHP 正则表达式》。

    数据库交互

    //包含数据库连接文件
    include('conn.php');
    //检测用户名是否已经存在
    $check_query = mysql_query("select uid from user where username='$username' limit 1");
    if(mysql_fetch_array($check_query)){
        echo '错误:用户名 ',$username,' 已存在。<a href="javascript:history.back(-1);">返回</a>';
        exit;
    }
    //写入数据
    $password = MD5($password);
    $regdate = time();
    $sql = "INSERT INTO user(username,password,email,regdate)VALUES('$username','$password','$email',
    $regdate)";
    if(mysql_query($sql,$conn)){
        exit('用户注册成功!点击此处 <a href="login.html">登录</a>');
    } else {
        echo '抱歉!添加数据失败:',mysql_error(),'<br />';
        echo '点击此处 <a href="javascript:history.back(-1);">返回</a> 重试';
    }

    该段代码首先检测用户名是否已经存在,如果存在则输出提示信息并立即终止程序执行。如果用户名不存在则把注册信息写入数据库,并输出对应提示信息。

    登录页面

    login.html 负责收集用户填写的登录信息。

    <fieldset>
    <legend>用户登录</legend>
    <form name="LoginForm" method="post" action="login.php" onSubmit="return InputCheck(this)">
    <p>
    <label for="username" class="label">用户名:</label>
    <input id="username" name="username" type="text" class="input" />
    <p/>
    <p>
    <label for="password" class="label">密 码:</label>
    <input id="password" name="password" type="password" class="input" />
    <p/>
    <p>
    <input type="submit" name="submit" value="  确 定  " class="left" />
    </p>
    </form>
    </fieldset>

    javascript 检测及 CSS 样式可参考 reg.html,本部分略去,可直接查看最后附录的完整代码。

    登录处理

    login.php 负责处理用户登录与退出动作。

    //登录
    if(!isset($_POST['submit'])){
        exit('非法访问!');
    }
    $username = htmlspecialchars($_POST['username']);
    $password = MD5($_POST['password']);
    
    //包含数据库连接文件
    include('conn.php');
    //检测用户名及密码是否正确
    $check_query = mysql_query("select uid from user where username='$username' and password='$password' limit 1");
    if($result = mysql_fetch_array($check_query)){
        //登录成功
        $_SESSION['username'] = $username;
        $_SESSION['userid'] = $result['uid'];
        echo $username,' 欢迎你!进入 <a href="my.php">用户中心</a><br />';
        echo '点击此处 <a href="login.php?action=logout">注销</a> 登录!<br />';
        exit;
    } else {
        exit('登录失败!点击此处 <a href="javascript:history.back(-1);">返回</a> 重试');
    }

    该段代码首先确认如果是用户登录的话,必须是 POST 动作提交。然后根据用户输入的信息去数据库核对是否正确,如果正确,注册 session 信息,否则提示登录失败,用户可以重试。

    该段代码需要在页面开头启用 session_start() 函数,参见下面 退出处理 代码部分。

    退出处理

    处理用户退出的代码跟处理登录的代码都在 login.php 里。

    session_start();
    
    //注销登录
    if($_GET['action'] == "logout"){
        unset($_SESSION['userid']);
        unset($_SESSION['username']);
        echo '注销登录成功!点击此处 <a href="login.html">登录</a>';
        exit;
    }

    该段代码在处理用户登录的代码之前,只允许以 login.php?action=logout 的方式访问,其他方式都认为是检测用户登录。具体逻辑参看附录完整代码。

    用户中心

    my.php 是用户中心,列在教程里作为用户登录检测参考。

    <?php
    session_start();
    
    //检测是否登录,若没登录则转向登录界面
    if(!isset($_SESSION['userid'])){
        header("Location:login.html");
        exit();
    }
    //包含数据库连接文件
    include('conn.php');
    $userid = $_SESSION['userid'];
    $username = $_SESSION['username'];
    $user_query = mysql_query("select * from user where uid=$userid limit 1");
    $row = mysql_fetch_array($user_query);
    echo '用户信息:<br />';
    echo '用户ID:',$userid,'<br />';
    echo '用户名:',$username,'<br />';
    echo '邮箱:',$row<'email'>,'<br />';
    echo '注册日期:',date("Y-m-d", $row['regdate']),'<br />';
    echo '<a href="login.php?action=logout">注销</a> 登录<br />';
    ?>

    提示

    1. 用户注册登录涉及到用户信息与数据库的交互,因此要特别注意用户提交的信息不能为非法信息,本例中注册部分已经使用正则表达式做了限制,对登录部分只简单使用了 htmlspecialchars() 处理,实际应用时可更严格一些。
    2. 本教程只是简单演示用户注册与登录的过程,其代码仅供学习参考,不可直接用于项目生产。
    3. 本教程中对于用户登录成功后采用 session 来管理,也可以采用 cookie 来管理,尤其对于有时限要求的情况。
    4. 为了提高用户体验,用户注册部分可以结合 AJAX 来检测用户输入的信息而不必等点击提交后再检测。

    以下列出了用户注册与登录的完整代码

    login.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
    <title>用户登录</title>
    <style type="text/css">
        html{font-size:12px;}
        fieldset{width:520px; margin: 0 auto;}
        legend{font-weight:bold; font-size:14px;}
        label{float:left; width:70px; margin-left:10px;}
        .left{margin-left:80px;}
        .input{width:150px;}
        span{color: #666666;}
    </style>
    <script language=JavaScript>
    <!--
    
    function InputCheck(LoginForm)
    {
      if (LoginForm.username.value == "")
      {
        alert("请输入用户名!");
        LoginForm.username.focus();
        return (false);
      }
      if (LoginForm.password.value == "")
      {
        alert("请输入密码!");
        LoginForm.password.focus();
        return (false);
      }
    }
    
    //-->
    </script>
    </head>
    <body>
    <div>
    <fieldset>
    <legend>用户登录</legend>
    <form name="LoginForm" method="post" action="login.php" onSubmit="return InputCheck(this)">
    <p>
    <label for="username" class="label">用户名:</label>
    <input id="username" name="username" type="text" class="input" />
    <p/>
    <p>
    <label for="password" class="label">密 码:</label>
    <input id="password" name="password" type="password" class="input" />
    <p/>
    <p>
    <input type="submit" name="submit" value="  确 定  " class="left" />
    </p>
    </form>
    </fieldset>
    </div>
    </body>
    </html>

    conn.php

    <?php
    /*****************************
    *数据库连接
    *****************************/
    $conn = @mysql_connect("localhost","root","root123");
    if (!$conn){
        die("连接数据库失败:" . mysql_error());
    }
    mysql_select_db("test", $conn);
    //字符转换,读库
    mysql_query("set character set 'gbk'");
    //写库
    mysql_query("set names 'gbk'");
    ?>


    reg.php

    <?php
    if(!isset($_POST['submit'])){
        exit('非法访问!');
    }
    $username = $_POST['username'];
    $password = $_POST['password'];
    $email = $_POST['email'];
    //注册信息判断
    if(!preg_match('/^[\w\x80-\xff]{3,15}$/', $username)){
        exit('错误:用户名不符合规定。<a href="javascript:history.back(-1);">返回</a>');
    }
    if(strlen($password) < 6){
        exit('错误:密码长度不符合规定。<a href="javascript:history.back(-1);">返回</a>');
    }
    if(!preg_match('/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/', $email)){
        exit('错误:电子邮箱格式错误。<a href="javascript:history.back(-1);">返回</a>');
    }
    //包含数据库连接文件
    include('conn.php');
    //检测用户名是否已经存在
    $check_query = mysql_query("select uid from user where username='$username' limit 1");
    if(mysql_fetch_array($check_query)){
        echo '错误:用户名 ',$username,' 已存在。<a href="javascript:history.back(-1);">返回</a>';
        exit;
    }
    //写入数据
    $password = MD5($password);
    $regdate = time();
    $sql = "INSERT INTO user(username,password,email,regdate)VALUES('$username','$password','$email',
    $regdate)";
    if(mysql_query($sql,$conn)){
        exit('用户注册成功!点击此处 <a href="login.html">登录</a>');
    } else {
        echo '抱歉!添加数据失败:',mysql_error(),'<br />';
        echo '点击此处 <a href="javascript:history.back(-1);">返回</a> 重试';
    }
    ?>


    login.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
    <title>用户登录</title>
    <style type="text/css">
        html{font-size:12px;}
        fieldset{width:300px; margin: 0 auto;}
        legend{font-weight:bold; font-size:14px;}
        .label{float:left; width:70px; margin-left:10px;}
        .left{margin-left:80px;}
        .input{width:150px;}
        span{color: #666666;}
    </style>
    <script language=JavaScript>
    <!--
    
    function InputCheck(LoginForm)
    {
      if (LoginForm.username.value == "")
      {
        alert("请输入用户名!");
        LoginForm.username.focus();
        return (false);
      }
      if (LoginForm.password.value == "")
      {
        alert("请输入密码!");
        LoginForm.password.focus();
        return (false);
      }
    }
    
    //-->
    </script>
    </head>
    <body>
    <div>
    <fieldset>
    <legend>用户登录</legend>
    <form name="LoginForm" method="post" action="login.php" onSubmit="return InputCheck(this)">
    <p>
    <label for="username" class="label">用户名:</label>
    <input id="username" name="username" type="text" class="input" />
    <p/>
    <p>
    <label for="password" class="label">密 码:</label>
    <input id="password" name="password" type="password" class="input" />
    <p/>
    <p>
    <input type="submit" name="submit" value="  确 定  " class="left" />
    </p>
    </form>
    </fieldset>
    </div>
    </body>
    </html>

    login.php

    <?php
    session_start();
    
    //注销登录
    if($_GET['action'] == "logout"){
        unset($_SESSION['userid']);
        unset($_SESSION['username']);
        echo '注销登录成功!点击此处 <a href="login.html">登录</a>';
        exit;
    }
    
    //登录
    if(!isset($_POST['submit'])){
        exit('非法访问!');
    }
    $username = htmlspecialchars($_POST['username']);
    $password = MD5($_POST['password']);
    
    //包含数据库连接文件
    include('conn.php');
    //检测用户名及密码是否正确
    $check_query = mysql_query("select uid from user where username='$username' and password='$password' 
    limit 1");
    if($result = mysql_fetch_array($check_query)){
        //登录成功
        $_SESSION['username'] = $username;
        $_SESSION['userid'] = $result['uid'];
        echo $username,' 欢迎你!进入 <a href="my.php">用户中心</a><br />';
        echo '点击此处 <a href="login.php?action=logout">注销</a> 登录!<br />';
        exit;
    } else {
        exit('登录失败!点击此处 <a href="javascript:history.back(-1);">返回</a> 重试');
    }
    ?>

    my.php

    <?php
    session_start();
    
    //检测是否登录,若没登录则转向登录界面
    if(!isset($_SESSION['userid'])){
        header("Location:login.html");
        exit();
    }
    
    //包含数据库连接文件
    include('conn.php');
    $userid = $_SESSION['userid'];
    $username = $_SESSION['username'];
    $user_query = mysql_query("select * from user where uid=$userid limit 1");
    $row = mysql_fetch_array($user_query);
    echo '用户信息:<br />';
    echo '用户ID:',$userid,'<br />';
    echo '用户名:',$username,'<br />';
    echo '邮箱:',$row['email'],'<br />';
    echo '注册日期:',date("Y-m-d", $row['regdate']),'<br />';
    echo '<a href="login.php?action=logout">注销</a> 登录<br />';
    ?>


    转载自:http://www.5idev.com/p-php_user_reg_login_code.shtml





    展开全文
  • woocommerce 开启用户注册功能

    千次阅读 2019-03-14 09:41:03
    最近在帮朋友开发外贸网站,基于wordpress的woocommerce插件,需要开启用户注册功能,发现只要修改下配置即可, 首先登录你的Wordpress管理员帐号,并进入管理后台,点击左侧菜单栏的“设置”--“常规” 在打开...
  • 在现在衣食住行都联网的大时代背景下,各种外卖平台,社群论坛,网贷平台等越发普及,很多网贷平台为了拉新推出补贴政策,例如注册用户送现金等。通过自动注册机实现自动批量注册平台帐号,获取现金红包已经是很多...
  • 用户注册/登录模块实践

    千次阅读 2017-04-04 21:56:58
    用户注册/登录模块实践前言最近负责的网站项目正式进入开发阶段,首先面临的当然就是用户登录模块的设计与实现了。说起来自己虽然不是第一次进行类似模块的开发,但这次作为项目的负责人,突然就感觉有必要对以后...
  • PC网站扫一扫获取微信授权用户注册

    千次阅读 2016-08-01 22:06:44
    PC网站扫一扫获取微信授权用户注册小碎碎念:打算从今天开始写开发日记,注意是日记哈,所以很多内容可能。是今天做了什么,有点什么开发感悟。好的,不多说了,开始吧。 情景模式: 今天开发这样一个功能:针对“易...
  • 用户注册登录界面设计+代码

    热门讨论 2011-10-12 22:00:50
    简单的用户注册登录界面设计+源代码,采用DIV+CSS结构,简洁
  • //核心业务隐身符1,用手机号去自己数据库查询当前用户是否存在,如果不存在,则不能发送该类手机验证码,提示用户注册 //······· if(手机号未注册){//伪代码 result.setSuccess(false); ...
  • wordpress短代码显示用户注册日期

    千次阅读 2020-08-21 08:44:43
    如果你的网站提供用户注册的功能,你可能会在某种程度上希望能够显示用户的注册登记日期。以下是一个超级简单的代码片段,将显示特定用户的登记日期。这里我们使用了wp的短代码函数功能。 首先,在你主题的functions....
  • Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean(MVC)模式适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean...这里以一个最常用的用户登录注册程序来讲解Servle
  • JSP与Servlet实现用户注册

    万次阅读 多人点赞 2016-09-22 15:41:37
    JSP最令我痴迷的地方在于其神奇的Servlet映射,映射一直是现在网站开发,MVC ,SSH框架都必备的最重要的基础技能。 我们今天就用用户注册的实例来讲解Servlet的用法 下面是我提前建好的数据库: 首先我们新建一...
  • 摘要:PHP源码,其它类别,注册系统 PHP用户注册系统(模块)源码v0.1_带MySql数据库,含登录功能,在开发网上系统的时候,这几乎是一个不可缺少的模块,用户通过注册表单将信息提交至数据库,在提交过程中用户输入的...
  • Java Web实现用户注册页面的提交

    千次阅读 2019-06-17 09:11:09
    项目需求:创建一个Web项目,实现用户登录界面的注册,并将信息提交到数据库中。 运行环境:jdk1.8+MySQL5.6+Apache Tomcat9.0 步骤: 一、Web项目工程的创建; 1、File-->New Dynamic Web Project(如果没有...
  • Ajax用户注册页面

    千次阅读 2018-10-24 09:21:27
    一、实验目的: ...通过实验掌握层叠样式表CSS的创建及应用,掌握在网页中插入层叠样式表CSS的常用方法,掌握层叠样式表CSS的主要基本属性的使用。 通过实验了解JavaScript的编程规范及基本语法,能...
  • 本教程的学习条件: 了解微信公众号开发的基本知识。... 首先我们要明确绑定微信用户和系统用户,其目的是为了用户在一次绑定以后,再次通过微信访问系统时可以由系统自动为其登录,避免用户反复登录...
  • hook_user()入门...在你的模块中实现钩子hook_user()使你能够对用户帐号进行不同的操作,以及修改$user对象。着我们看一下这个函数的签名:   function hook_user($op, &$edit, &$user, $category = NULL)
  • 用户注册的邮箱激活模块的设计与实现

    万次阅读 多人点赞 2016-08-07 21:04:02
    在我们都知道在一个网站中,用户注册后需要来一个邮箱进行激活是很常见的功能,那么我们今天就来学习一下这个邮箱验证功能.这里以我的一个小项目“网上书店”的这个模块来说明这个邮箱激活的功能!采用的是mvc模式...
  • JavaMai——邮箱验证用户注册

    千次阅读 2012-05-15 15:46:48
    这篇文章简单的模拟了网上利用邮箱激活用户注册这样的一个功能 1. 呈现给用户的注册界面:(为了简单起见,就剩下两个输入域,邮箱和昵称) 用户注册利用邮箱进行验证 用户注册 邮箱: 昵称: ...
  • 前端利用ajax实现用户注册页面

    千次阅读 2020-07-29 11:47:28
    开发一个用户注册界面,使用ajax交互技术 ajax是什么呢?允许浏览器与服务器通信而无须刷新前页面的技术都被叫做Ajax. AJAX:(Asynchronous JavaScript and XML)并不是一项新技术,其实是多种技术的综合,包括...
  • 网站用户登录注册实现

    千次阅读 2010-04-18 22:29:00
    一边上课,一边复习软考,还得一边做网站,稍微有点忙活,所以网站的进度似乎比较慢。...然后就进行了注册和登录页面的开发,主要是想用一下AJAX,在用户注册时对用户名进行动态检验,经过两天的查找和学习,
  • 实例探析 任务5-1 探析手机麦包包网的用户注册网页 效果展示 手机麦包包网的用户注册网页0501.html的浏览效果如图5-1所示 ;网页探析 1网页0501.html的HTML代码探析 网页0501.html的HTML代码如表5-1所示;续表;2网页...
  • ThinkPHP实现用户注册、登录模块

    万次阅读 2016-11-10 21:25:57
    ThinkPHP实现用户注册、登录模块 一、开发环境 1、Windows+Apache+MySQL+PHP的环境。 2、文本编辑器:Sublime。 二、主要技术 PHP+ThinkPHP3.2.3+HTML+CSS 三、效果图与具体步骤 实现效果图,如图1、2、3所...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 199,768
精华内容 79,907
关键字:

网页开发用户注册