途牛旅游项目—注册篇

注册功能_功能分析
在这里插入图片描述

在这里插入图片描述

注册的后台功能代码

编写UserService的register方法测试

 @Test
    public void test03() {

        UserService userService = new UserService();

        User user = new User();
        user.setUsername("jackhello");
        user.setPassword("123456");
        user.setStatus('Y');

        int code = userService.register(user);

        System.out.println(code);
    }

编写UserDao的方法

  //select * from tab_user where username='jackhello3'
    User queryUsername(String username);
    //insert into tab_user values(null,...)
    void save(User user2);

编写对应的mysql语句


  <select id="queryUsername" resultType="com.qst.bean.User"  parameterType="string">
        select * from tab_user where username=#{username}
    </select>

    <insert id="save" parameterType="com.qst.bean.User" >
        insert into tab_user values(null,#{username},
        #{password},#{name},#{birthday},#{sex},#{telephone},#{email},#{status},#{code})
    </insert>

编写测试方法

 @Test
    public void test01(){
        UserDao userDao= MySessionUtils.getSession().getMapper(UserDao.class);
        User user=userDao.queryUsername("12");
        System.out.println(user);

    }
    @Test
    public void test02() {
        UserDao dao =    MySessionUtils2.getMapper(UserDao.class);
        User user= new User(33,"jackhello33","jackhello34",new Date(),"jack","男","3333","333@qq.com",'N',"ddd");
        // User(int uid, String username, String password, Date birthday, String name, String sex, String telephone, String email, char status, String code)
        dao.save(user);
    }

编写servlet

Map<String, String[]> map = request.getParameterMap();
        User user = new User();
        //将请求中的参数赋值给变量
        try {
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println("注册数据1");
        //对参数处理
        UserService userService = new UserService();
        int code = userService.register(user);
        System.out.println("注册数据2");
        //响应给浏览器
        ResponseInfo info = new ResponseInfo();

        if(code==1){
            info.setData("注册成功");
            //用于注册成功后向邮箱发送信息激活
            /*
            MailUtils.sendMail(user.getEmail(),"<a href='http://localhost:8080/Lvyou/activeServlet?activeCode="+user.getCode()+"'>点击激活途牛旅游账户</a>","激活账户");
            */
        }else{//-1,-2,-3
            info.setData("注册失败");
        }
        info.setCode(code);
         /*info.setCode(1);
        info.setData("注册成功");*/
        System.out.println(info.getCode()+info.getCode());
        String json =new ObjectMapper().writeValueAsString(info);
        System.out.println("注册数据3");
        response.getWriter().println(json);

验证码机制

图片验证码效果
在这里插入图片描述

Servlet随机生成一个字符串,然后将字符串转成图片,通过响应的字节流写到浏览器的img标签

图片验证码分析

在这里插入图片描述

验证码servlet开发

@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		
		//服务器通知浏览器不要缓存
		response.setHeader("pragma","no-cache");
		response.setHeader("cache-control","no-cache");
		response.setHeader("expires","0");
		
		//在内存中创建一个长80,宽30的图片,默认黑色背景
		//参数一:长
		//参数二:宽
		//参数三:颜色
		int width = 80;
		int height = 30;
		BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		Random rd = new Random();
		//获取画笔
		Graphics g = image.getGraphics();
		//设置画笔颜色为灰色
		g.setColor(Color.GRAY);
		//填充图片
		g.fillRect(0,0, width,height);
		
		//产生4个随机验证码,12Ey
		String checkCode = getCheckCode();
		//将验证码放入HttpSession中
		request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);
		
		//设置画笔颜色为黄色
		g.setColor(Color.YELLOW);
		//设置字体的小大
		g.setFont(new Font("黑体",Font.BOLD,24));
		//向图片上写入验证码
		g.drawString(checkCode,15,25);
		for(int i=0;i<2;i++)
		{
			g.setColor(new Color(rd.nextInt(120), rd.nextInt(120), rd.nextInt(120)));
			g.drawLine(rd.nextInt(75), rd.nextInt(28), rd.nextInt(75), rd.nextInt(28));

		}
		//将内存中的图片输出到浏览器
		//参数一:图片对象
		//参数二:图片的格式,如PNG,JPG,GIF
		//参数三:图片输出到哪里去
		ImageIO.write(image,"PNG",response.getOutputStream());
	}
	/**
	 * 产生4位随机字符串 
	 */
	private String getCheckCode() {
		String base = "0123456789ABCDEFGabcdefg";
		int size = base.length();
		Random r = new Random();
		StringBuffer sb = new StringBuffer();
		for(int i=1;i<=4;i++){
			//产生0到size-1的随机值
			int index = r.nextInt(size);
			//在base字符串中获取下标为index的字符
			char c = base.charAt(index);
			//将c放入到StringBuffer中去
			sb.append(c);
		}

		return sb.toString();
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request,response);
	}
}

前端验证码模块

				<tr>
                        <td class="td_left">
                            <label for="check">验证码</label>
                        </td>
                        <td class="td_right check">
                            <input type="text" id="check" name="check" class="check" autocomplete="off">
                            <img src="checkCode" height="32px" alt="" onclick="changeCheckCode(this)">
                            <script type="text/javascript">
                                //图片点击事件
                                function changeCheckCode(img) {
                                    img.src = "checkCode?" + new Date().getTime();
                                }
                            </script>
                        </td>
                    </tr>

后台获取验证码,并验证

  //从请求中获取check1码
        String check1 = request.getParameter("check");
        //从session中获取check2码
        String check2 = (String) request.getSession().getAttribute("CHECKCODE_SERVER");
        System.out.println(check1);
        System.out.println(check2);
        //从session中删除check2码
        request.getSession().removeAttribute("CHECKCODE_SERVER");
        //比较check1 与 check2
        //相同表示验证码不正确,将提示信息写到页面的错误提示
        if (check1 == null || !check1.equalsIgnoreCase(check2)) {
            //验证码不看大小写
            ResponseInfo info = new ResponseInfo();
            info.setCode(-4);
            info.setData("注册失败,验证码出错");

            //json
            String json = new ObjectMapper().writeValueAsString(info);
            response.getWriter().println(json);
             return;
        }

邮件激活

工具类

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public final class MailUtils {
    private static final String USER = "XXXX@163.com "; // 发件人称号,同邮箱地址
    private static final String PASSWORD = ""; // 客户端授权码,或者登录密码
   /* *
     *
     * @param to 收件人邮箱
     * @param text 邮件正文
     * @param title 标题
     发送验证信息的邮件 */
    public static boolean sendMail(String to, String text, String title){
        
        try {
            final Properties props = new Properties();

            props.setProperty("mail.smtp.host", "smtp.163.com"); // 指定的smtp服务器
            props.setProperty("mail.smtp.auth", "true");
            props.setProperty("mail.transport.protocol", "smtp");//设置发送邮件使用的协议

            // 发件人的账号
            props.setProperty("mail.user", USER);
            //发件人的密码
            props.setProperty("mail.password", PASSWORD);
            // 构建授权信息,用于进行SMTP进行身份验证
            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    // 用户名、密码
                    String userName = props.getProperty("mail.user");
                    String password = props.getProperty("mail.password");
                    return new PasswordAuthentication(userName, password);
                }
            };
            // 使用环境属性和授权信息,创建邮件会话
            Session mailSession = Session.getInstance(props, authenticator);
            // 创建邮件消息
            MimeMessage message = new MimeMessage(mailSession);
            // 设置发件人
            String username = props.getProperty("mail.user");
            InternetAddress form = new InternetAddress(username);
            message.setFrom(form);
            // 设置收件人
            InternetAddress toAddress = new InternetAddress(to);
            message.setRecipient(Message.RecipientType.TO, toAddress);
            // 设置邮件标题
            message.setSubject(title);
            // 设置邮件的内容体
            message.setContent(text, "text/html;charset=UTF-8");
            // 发送邮件
            Transport.send(message);
            return true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return false;
    }
}

测试代码

 
public class MailUtilsTest {

    @Test
    public void sendMail() {
        //参1 收件人
        //参2 内容
        //参3 标题
        MailUtils.sendMail("hadoop101@126.com","<a href='http://localhost:8080/lvyou_war_exploded/activeServlet?activeCode=bb26f0d05ea745c5986bc18ff7b4cef9'>点击激活途牛旅游账户</a>","激活账户");
    }
}

在注册业务方法中添加发邮件

 info.setData("注册成功");
            //用于注册成功后向邮箱发送信息激活        
 MailUtils.sendMail(user.getEmail(),"<a href='http://localhost:8080/Lvyou/activeServlet?activeCode="+user.getCode()+"'>点击激活途牛旅游账户</a>","激活账户");
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值