简单登陆升级版(加入验证码、在session时间内登陆logon.do直接进入成功登陆页面)

登陆添加验证码:

首先浏览器加载图片的说明
是浏览器执行到Img标签后,向服务端发请求。就是src 然后获取图片

   test...<br>
<img src="1.png">
</body>

服务端对应的在路径下放一张图片即可

这里写图片描述

所以那个src就是一个地址 那么就可以访问servlet。然后产生一个验证码就好了
先生成number 然后绑定在session。并把随机数变成一个图片

产生验证码就要先画出图片,并压缩输出

checkcodeServlet.java

package web;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Random;

import javax.imageio.stream.ImageOutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CheckcodeServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        /*
         * 一、绘图
         * 
         * 二、压缩图片并输出。
         */
        //1、画布
        BufferedImage image = new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);

        //获得画笔
        Graphics g = image.getGraphics();

        //给这个画笔设置相应的颜色。
        g.setColor(new Color(255,255,255));

        //给画布设置背景颜色

        g.fillRect(0, 0, 80, 30);

        //重新给笔设置颜色,之前的是用笔给背景设置颜色,所以先设置白色
        Random r = new Random();
        g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
        g.setFont(new Font(null,Font.ITALIC,24));
        //生成一个随机数

        String number = getNumber();
        //绑定到session,以便验证验证码
        HttpSession session = request.getSession();
        session.setAttribute("number", number);
        g.drawString(number, 2, 25);

        //加一些干扰线
        for(int i=0;i<8;i++){
            g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
        g.drawLine(r.nextInt(80), r.nextInt(30), r.nextInt(80), r.nextInt(300));
        }


        //设置服务器返回的数据类型,是一个图片
        response.setContentType("image/jpg");

        //获取流
        OutputStream out = response.getOutputStream();
        //压缩图片并输出

        javax.imageio.ImageIO.write(image, "jpeg", out);
        out.close();




    }
    //长度为5个字符的验证码(A-Z0-9排除0,O,1,I)
    private String getNumber(){
        String number = "";

        String chars="ABCDEFGHIJKLMNPQRSTUVWSYX23456789";
        Random r = new Random();
        for(int i=0;i<5;i++){
            number +=chars.charAt(r.nextInt(chars.length()));

        }
        return number;


    }


}

写一个jsp 在里面的放一个图片

 <img src="checkcode" border="1" onclick="this.src='checkcode?'+Math.random();"/>

这样的话就是说图片的地址是checkcode 然后点击图片会再次访问获取新的图片。

logon.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>


<!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=utf-8" />
<title>用户登陆检测</title>

<style type="text/css">
body {
    background-image: url(ruidian_sidegeermo_fengjing.jpg);
    background-attachment: fixed;
    background-repeat: no-repeat;
    background-size: 100% 100%;
    color: #FFF;
    font-family: "微软雅黑";
    font-size: 1.6em;
}
#div1 {
    margin: 120px;
    margin-left: 530px;
    text-align: center;
    width: 200px;
    height: 200px;
}
#div2 {
    background-image: url(1.png);
    background-repeat: no-repeat;
    height: 100px;
    margin-top: 120px;
    margin-left: 580px;
    width: 200px;
}
span {
    font-size: 9px;
}
#b1 {
}
</style>
</head>

<body>
<div id="div2"></div>
<div id="div1">
<% 
String msg = (String)request.getAttribute("error");

%>
<span style="color:red;"><%=(msg==null?"":msg) %></span>
  <form action="logon.do"  method="post">
    <p>
      <label for="username">用户名</label>
      <input type="text" name="username"  />
    </p>
    <p>
      <label for="password">密码</label>
      <input type="password" name="password"/>
    </p>
    <p>
     <label for="password">验证码</label>
      <img src="checkcode" border="1" onclick="this.src='checkcode?'+Math.random();"/>
      <input type="test" name="number"/>

    </p>

    <input type="submit" value="登陆" />
    <p> <span id="span"></span> </p>
  </form>
</div>
</body>
</html>

这样就可以在登陆界面看到验证码了
那么就要对验证码进行验证,就是在产生的验证码的时候将其绑定在session中。然后servlet接收时对其进行输出的和产生的进行比较。

Action控制器servlet控制进行判断。我还增加了如果登陆了之后设置session的时间为40s。然后先进行判断是否已经登陆过就是说session中已经绑定了usr。有的话就直接进入success.jsp页面。没有再进行验证码判断,用户名密码判断。

开始还是写乱了。后来才想到应该先判断是否登陆过,而不是验证码!

ActionServlet.java

package web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import dao.UserDao;
import entity.User;

public class ActionServlet extends HttpServlet {

    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
    //分享请求资源路径
        String uri = request.getRequestURI();
        String action = uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
        System.out.println("URI!!!"+action);
        if("/logon".equals(action)){
            //读取用户名和密码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            HttpSession session = request.getSession();
            //如果已经登陆过就不需要进行下面的
            if(username==null&& password==null&&session.getAttribute("user")!=null){
                response.sendRedirect("success.jsp");
                return ;
            }

            //如果没有登陆或者登陆的时间过长比较验证码是否正确
            String number1 = request.getParameter("number");

            String number2 = (String)session.getAttribute("number");
            if(number1==null){  request.getRequestDispatcher("logon.jsp").forward(request, response);
            return ;
            }
            if(!number1.equalsIgnoreCase(number2)){
                //验证码错误!!
                request.setAttribute("error", "验证码错误");
                request.getRequestDispatcher("logon.jsp").forward(request, response);
                return ;
            }

            //根据用户名和密码查询数据库中是否有这个用户
            UserDao ud = new UserDao();
            try {
                User user = ud.findByUsername(username);
                 session = request.getSession();
                System.out.println("sessionq:"+session);
                System.out.println(session.getAttribute("user"));
                System.out.println("name:"+username);
                System.out.println(session.getAttribute("user"));


                if(user!=null&& password.equals(user.getPwd())&&session.getAttribute("user")==null){
                     //用户有,并且密码对了。登陆成功!(第一次登陆)
                    session.setAttribute("user", username);
                    session.setMaxInactiveInterval(40);
                    response.sendRedirect("success.jsp");
                    return ;

                    //之后进入
                }

                else{                   
                    request.setAttribute("error", "用户名或者密码错误");
                    response.sendRedirect("logon.jsp");
                    System.out.println("进入else");
                    return ;
                }


            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                throw new ServletException(e);
            }

        }


        out.close();
    }

}

这里写图片描述

效果:

输入 logon.do

这里写图片描述

输入正确用户名、密码、验证码。输入错误会有提示
这里写图片描述

之后再次输入logon.jsp 还是会直接登陆到success.jsp页面
但是超过40s会再访问logon.do就要进入登陆界面进行登陆了。

session小结

相对于 cookie,session的优点就是安全。可以保存大量的数据,可以保存的数据类型更丰富
cookie是将数据保存在浏览器端
session是保存在服务器端
如果访问量很大,使用session机制占用大量的内存空间。但是数据很敏感的话就用session。

源码:

链接:http://pan.baidu.com/s/1pKMNeIZ 密码:l2l2

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值