idea做一个带有验证码的登录界面,包函forword转发和sendRedirect重定向方法

实现原理:
1.在网页上访问URL(HTTP:localhost:8080/Login),服务器获取请求头Get,forword转发到(HTTP:localhost:8080/Login.jsp),在浏览器上显示登录窗口。
2.用户在浏览器填写用户信息,点击submit按钮以Post方式请求服务器,服务器通过request获取到请求体的数据,通过代码实现验证用户登录是否正确。
3.如果登录验证成功,则sendRedirect重定向到(HTTP:localhost:8080/Main),服务器获取请求头Get,forword转发到(HTTP:localhost:8080/Main.jsp),在浏览器上显示登录成功。
4.如果登录验证失败,则sendRedirect重定向到(HTTP:localhost:8080/Login),服务器获取请求头Get,forword转发到(HTTP:localhost:8080/Login.jsp),在浏览器上显示登录窗口。
idea做一个带有验证码的登录界面,包函forword转发和sendRedirect重定向方法_第1张图片
为了让用户不能够直接在URL直接访问到 .JSP文件,我们可以把.JSP文件放在WEB-INF文件底下。
idea做一个带有验证码的登录界面,包函forword转发和sendRedirect重定向方法_第2张图片
代码实现:
1.每个服务器端对应一个.jsp
*LoginController.java

 protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		//把request和response转发到login.jsp文件
         request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request,resp);

    }

*MainController.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//把request和response转发到main.jsp文件
        request.getRequestDispatcher("/WEB-INF/main.jsp").forward(request,response);
    }

2.在login.jsp文件中敲登录界面,通过标签的src属性填写随机验证码CaptcheController.java(/Charles/Captche)路径地址


        <form action="/Charles/Login" method="post">
            <label for='LoginName'>登录名称:</label><input  name='LoginName' placeholder='请输入登录名' id='LoginName'><br>
            <label for='LoginPwd'>登录密码:</label><input type='password' name='LoginPwd'  placeholder='请输入密码' value='' id='LoginPwd'><br>
            <label for='verification'>验证码:</label><input  name='verification' value='' placeholder='请输入验证码' id='verification'><br>
            <img src="/Charles/Captche" ><a >看不清换一张</a>
            <input type='reset' name='reset' value='取消'>
            <input type='submit' name='submit' value='登录'>
        </form>

idea做一个带有验证码的登录界面,包函forword转发和sendRedirect重定向方法_第3张图片
新写一个Java Class–CaptcheController.java,Servlet路径为(/Charles/Captche),在里面敲验证码的代码

int width = 100;
        int height = 50;
        //1.创建一个对象,在内存中存图片(验证码图片对象)
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //2.美化图片
        //2.1 填充背景色
        Graphics graphics = image.getGraphics(); //画笔对象
        //        graphics.fill//填充
        //        graphics.draw//画
        graphics.setColor(Color.yellow);//画笔的颜色
        graphics.fillRect(0,0,width,height);//填充 rect 矩形
        //2.2 画边框
        graphics.setColor(Color.blue);
        graphics.drawRect(0,0,width-1,height-1);

        String str="QWERTYPADFGHLBNM123456789qwertypadfghjkbnm";

        //生成随机角标
        Random random = new Random();
        String randomnumber="";
        //2.3 写验证码
        for (int i = 1; i <= 4; i++) {
            int nextInt = random.nextInt(str.length());
            //获取字符
            char charAt = str.charAt(nextInt);//随机字符
            randomnumber+=charAt;
            graphics.drawString(charAt+"",width/5*i,25);
        }
        System.out.println(randomnumber);
        //通过ServletContext和程序的容器(服务器)来通信共享数据
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("message",randomnumber);

        //2.4干扰线
        graphics.setColor(Color.green);
        //随机生成坐标点

        for (int i = 0; i < 10; i++) {
            int nextWidth = random.nextInt(width);
            int nextHeight = random.nextInt(height);

            int nextWidth2 = random.nextInt(width);
            int nextHeight2 = random.nextInt(height);
            graphics.drawLine(nextWidth,nextHeight,nextWidth2,nextHeight2);
        }

        //3.将图片输出到页面展示
        ImageIO.write(image,"jpg",response.getOutputStream());

实现了随机验证码的生成,当用户点击submit按钮时,*LoginController.java获取请求体里的数据,进行判断验证,

		String loginName=request.getParameter("LoginName");//根据LoginName名称获取用户名参数值
        String loginPwd=request.getParameter("LoginPwd");//根据LoginPwd名称获取登录密码
     	String verification=request.getParameter("verification");//根据verification名称获取验证码值
     	//通过ServletContext获取数据
		 ServletContext servletContext = this.getServletContext();
        Object validCode = servletContext.getAttribute("message");
		//进行判断,如果用户输入的用户名为admin,并且密码为1234,并且验证码为随机生成的验证码,就为登录成功,否则为登录失败
        if(("admin").equals(loginName) && ("1234").equals(loginPwd)&&validCode.equals(verification)) {
			 //如果登录成功,则重定向到/Charles/Main
             response.sendRedirect("/Charles/Main");
        }
        else {
       		 //如果登录失败,则重定向到/Charles/Login
            response.sendRedirect("/Charles/Login");
        }


    }

登录效果
1.访问URL(HTTP://localhost:9090/Charles/Login)
idea做一个带有验证码的登录界面,包函forword转发和sendRedirect重定向方法_第4张图片
2.输入错误的验证码,重定向到本窗体
idea做一个带有验证码的登录界面,包函forword转发和sendRedirect重定向方法_第5张图片
3.输入正确的验证码,重定向到新的窗体
idea做一个带有验证码的登录界面,包函forword转发和sendRedirect重定向方法_第6张图片

你可能感兴趣的:(java,web,servlet,http)