简单登陆升级版(加入验证码、在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相关文章推荐
- 怎么设置session无响应超时时间并且自动返回登陆页面
- HTTPclient 模拟登陆及登陆成功后直接访问登陆后的页面
- linux直接进入登陆页面,不能进入vi(解析/etc/inittab)
- 退出后点击浏览器后退不能回到成功页面;直接进入页面和跳转进入页面样式不同;防止直接输入页面地址或servlet;当servlet跳servlet时,进行其他操作后后退出现错误!
- 简单登陆页面验证码制作和jsp中获取验证码内容
- 用户未登陆不能进入页面,根据session
- javaWeb项目用过滤器filter实现登陆成功后才能访问主页面,否则直接输入主页面的地址自动跳转到登陆界面
- 实现session登陆时间的验证,验证用户登录页面的一个监听器
- 实现session登陆时间的验证,验证用户登录页面的一个监听器
- 【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能
- WEB登录页面加入简单验证码
- session过期跳转到登陆页面并跳出iframe框架的最简单方法
- 在页面中加入AspCompat=true属性后,使用session有问题
- CAS如何在服务器端的登陆成功页面获取登陆用户帐号的方法
- 登录成功之后转向登陆路成功前页面
- 一个简单的登陆页面实现
- ASP.NET2.0生成验证码(防一个session时间内攻击)
- asp.net2中精确计算页面执行时间原来如此简单!
- ExtJS直接在页面显示日期和时间控件
- 简单加入Css到页面中