您的位置:首页 > 编程语言 > Go语言

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

2016-12-10 16:48 603 查看

登陆添加验证码:

首先浏览器加载图片的说明

是浏览器执行到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐