大四快毕业了,3年多的时间中,乱七八糟得学了一大堆,想趁找工作之前把所学的东西整理一遍,所以就尝试着做一个完整的JavaWeb系统,这几天试着做了一个用户登录的功能,分享给大家,肯定有很多不完善的地方,希望大家提提宝贵的意见,必将努力完善它。

我贴出此篇博客的目的是,将一些以后有可能用到的重复性的代码保存下来,用于以后需要时直接复制粘贴,所以,此篇博客大部分都是代码,讲解性的语句并不多,如果大家看得头疼,不如不看,以后万一用到的话再拿过来修修改改即可。

有可能用得到的部分:生成验证码的Java类、操作数据库的Java类

用户登录模块采用了多种语言:

Html、css、query:页面

Servlet、java:后台

运行效果图:

Login.html代码:

<!DOCTYPE html>

<html>

<head lang="en">

<meta charset="UTF-8">

<title>登录界面</title>

<script src="js/jquery-1.11.1.js"></script>

<script src="js/login.js"></script>

<link href="css/style.css" rel="stylesheet" type="text/css" />

</head>

<body>

<div id="loginpanelwrap">

<div class="loginheader">

<div class="logintitle">登录</div>

</div>

<form action = "/UserLogin/Sample1/loginServlet">

<div class="loginform">

<div class="loginform_row">

<label>用户名:</label>

<input type="text" class="loginform_input" name="username" />

</div>

<div class="loginform_row">

<label>密码:</label>

<input type="password" class="loginform_input" name="password" />

</div>

<div class = "loginform_row">

<label>验证码:</label>

<input type = "text" class="loginform_input_validationCode" name = "validationCode"/>

<img class = "validationCode_img" src="/UserLogin/Sample1/validationCode">

</div>

<div class="loginform_row">

<span class = "returnInfo"></span>

<input type="submit" class="loginform_submit" value="登录" />

</div>

<div class="clear"></div>

</div>

</form>

</div>

</body>

</html>

JQuery代码:login.js

$(function(){

$(".loginform_submit").click(function(){

if(checkInput()) {

$("form").action("/loginServlet");

}else{

return false;

}

});

$(".validationCode_img").click(function(){

$(".validationCode_img").attr("src","/UserLogin/Sample1/validationCode?"+Math.random());

});

function checkInput(){

//判断用户名

if($("input[name=username]").val() == null || $("input[name=username]").val() == ""){

alert("用户名不能为空");

$("input[name=username]").focus();

return false;

}

//判断密码

if($("input[name=password]").val() == null || $("input[name=password]").val() == ""){

alert("密码不能为空");

$("input[name=password]").focus();

return false;

}

//判断验证码

if($("input[name=validationCode]").val() == null || $("input[name=validationCode]").val() == ""){

alert("验证码不能为空");

$("input[name=validationCode]").focus();

return false;

}

return true;

}

});

生成验证码的Servlet:ValidationCode.java

package zh.userlogin.sample;

import javax.imageio.ImageIO;

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 java.awt.*;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.OutputStream;

import java.util.Random;

/**

* Created by zhang on 2014/9/13.

*/

public class ValidationCode extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//获得验证码集合的长度

int charsLength = codeChars.length();

//下面3条记录是关闭客户端浏览器的缓冲区

//这3条语句都可以关闭浏览器的缓冲区,但是由于浏览器的版本不同,对这3条语句的支持也不同

//因此,为了保险起见,同时使用这3条语句来关闭浏览器的缓冲区

resp.setHeader("ragma", "No-cache");

resp.setHeader("Cache-Control", "no-cache");

resp.setDateHeader("Expires", 0);

//设置图形验证码的长和宽

int width = 90, height = 30;

BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics(); //获得用于输出文字的Graphics对象

Random random = new Random();

g.setColor(getRandomColor(180, 250));

g.fillRect(0, 0, width, height);

g.setFont(new Font("Times New Roman",Font.ITALIC,height));

g.setColor(getRandomColor(120, 180));

//用户保存最后随机生成的验证码

StringBuilder validationCode = new StringBuilder();

//验证码的随机字体

String[] fontNames = {"Times New Roman","Book antiqua","Arial"};

//随机生成4个验证码

for(int i = 0; i < 4; i++){

//随机设置当前验证码的字符的字体

g.setFont(new Font(fontNames[random.nextInt(3)],Font.ITALIC,height));

//随机获得当前验证码的字符

char codeChar = codeChars.charAt(random.nextInt(charsLength));

validationCode.append(codeChar);

//随机设置当前验证码字符的颜色

g.setColor(getRandomColor(10, 100));

//在图形上输出验证码字符,x和y都是随机生成的

g.drawString(String.valueOf(codeChar), 16*i + random.nextInt(7), height-random.nextInt(6));

}

//获得HttpSession对象

HttpSession session = req.getSession();

//设置session对象5分钟失效

session.setMaxInactiveInterval(5*60);

//将验证码保存在session对象中,key为validation_code

session.setAttribute("validation_code", validationCode.toString());

//关闭Graphics对象

g.dispose();

OutputStream outS = resp.getOutputStream();

ImageIO.write(image, "JPEG", outS);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req,resp);

}

//图形验证码的字符集,系统将随机从这个字符串中选择一些字符作为验证码

private static String codeChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

//返回一个随机颜色

private static Color getRandomColor(int minColor, int maxColor){

Random random = new Random();

if(minColor > 255){

minColor = 255;

}

if(maxColor > 255){

maxColor = 255;

}

//获得r的随机颜色值

int red = minColor + random.nextInt(maxColor-minColor);

//g

int green = minColor + random.nextInt(maxColor-minColor);

//b

int blue = minColor + random.nextInt(maxColor-minColor);

return new Color(red,green,blue);

}

}

操作数据库的代码:ManageSQLServer2008.java(本人使用的数据库为SQLServer 2008)

package zh.userlogin.sample.dbmanager;

import java.beans.Statement;

import java.sql.*;

public class ManageSQLServer2008 {

//数据库的驱动名

private final String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

//数据库的url地址

private final String url = "jdbc:sqlserver://localhost:1433;databaseName=zhDemo";

private final String userName = "sa";

private final String password = "123";

private Connection conn = null;

public ManageSQLServer2008(){

//加载数据库驱动

try {

Class.forName(dbDriver).newInstance();

//System.out.println("加载驱动成功");

} catch (Exception e) {

e.printStackTrace();

System.err.println("数据库驱动加载失败");

}

//获取数据库链接

try {

conn = DriverManager.getConnection(url,userName,password);

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.err.println("获取数据库链接失败");

}

}

//执行各种SQL语句的方法

private ResultSet execSQL(String sql,Object... args) throws SQLException{

//建立PreparedStatement对象

PreparedStatement pStmt = conn.prepareStatement(sql);

//为pStmt对象设置SQL参数值

for(int i = 0; i < args.length; i++){

pStmt.setObject(i+1, args[i]);

}

//执行SQL语句

pStmt.execute();

//返回结果集,如果执行的SQL语句不返回结果集,则返回null

return pStmt.getResultSet();

}

private void closeSQLConn(){

//关闭数据库链接

if(conn != null){

try {

conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

public String checkUser(String username,String password){

boolean has_username = false;

boolean password_correct = false;

ResultSet rs = null;

try {

rs = execSQL("select * from zh_users");

} catch (SQLException e) {

System.err.println("查询数据库出错");

e.printStackTrace();

return null;

}

try {

while(rs.next()){

String temp_username = rs.getString("user_name").trim();

String temp_password = rs.getString("password_md5").trim();

if(username.equals(temp_username)){

has_username = true;

if(password.equals(temp_password)){

password_correct = true;

return "hasUserNameAndPasswordCorrect";

}

return "hasUserNameButPasswordInCorrect";

}

}

} catch (SQLException e) {

System.err.println("操作ResultSet出错");

e.printStackTrace();

}

return "hasNoUserName";

}

}

用于处理用户登录的Servlet:LoginServlet.java

package zh.userlogin.sample;

import zh.userlogin.sample.dbmanager.ManageSQLServer2008;

import javax.servlet.RequestDispatcher;

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 java.io.IOException;

import java.io.OutputStream;

/**

* Created by zhang on 2014/9/13.

*/

public class LoginServlet extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

OutputStream out = resp.getOutputStream();

String username = req.getParameter("username");

String password = req.getParameter("password");

String validationCode = req.getParameter("validationCode");

HttpSession session = req.getSession();

String validation_code = (String)session.getAttribute("validation_code");

if(validationCode.equalsIgnoreCase(validation_code)){

System.out.println("验证码正确");

}else{

System.out.println("验证码错误");

}

ManageSQLServer2008 mss = new ManageSQLServer2008();

String result = mss.checkUser(username,password);

if (result.equals("hasUserNameAndPasswordCorrect")) {

System.out.println("用户名和密码均正确");

} else if (result.equals("hasUserNameButPasswordInCorrect")) {

System.out.println("用户名正确,密码不正确");

} else if (result.equals("hasNoUserName")) {

System.out.println("没有此用户");

}

//转发到result.jsp

RequestDispatcher rd = req.getRequestDispatcher("Login.html");

rd.forward(req, resp);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req,resp);

}

}

web.xml文件的配置:

<servlet>

<servlet-name>loginServlet</servlet-name>

<servlet-class>zh.userlogin.sample.LoginServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>loginServlet</servlet-name>

<url-pattern>/loginServlet</url-pattern>

</servlet-mapping>

<servlet>

<servlet-name>validationCode</servlet-name>

<servlet-class>zh.userlogin.sample.ValidationCode</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>validationCode</servlet-name>

<url-pattern>/validationCode</url-pattern>

</servlet-mapping>

最后的style.css代码,太多了,而且有点乱,所以就没有贴出来,至于CSS代码,大家可以去网上下载:http://sc.chinaz.com/tag_moban/htmlMoBan.html这个上面就有好多,大家根据喜好选择一个,然后稍加即可。

JavaWeb用户登录功能的实现的更多相关文章

  1. JavaWeb学习记录(六)——用户登录功能

    使用JDBC.spring框架.servlet实现一个简单的用户登录功能. 一.mySql数据库 SET FOREIGN_KEY_CHECKS=0; -- ---------------------- ...

  2. Struts2整合Hibernate3实现用户登录功能

    所用技术:struts2 ,hibernate,jsp,mysql 本DEMO仅仅实现用户登录功能,采用MVC思想,自己也觉得相对是比较简单,比较容易理解数据流向的一个例子,通过整合这个过程,能够清晰 ...

  3. 实现Web上的用户登录功能

    关于如何实现web上的自动登录功能 文章来源http://coolshell.cn/articles/5353.html Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能 ...

  4. 使用Struts1完成用户登录功能

    1.Struts框架 框架(framework):就是一系列代码和开发模式的整合,使用框架后,所有开发人员都会按照框架提供的规范进行开发,使代码更容易维护和扩展. 使用框架的优点: 1)   易于维护 ...

  5. 你会做Web上的用户登录功能吗?

    Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能.下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关 ...

  6. 利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版)

    利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版) CREATE DEFINER=`root`@`%` FUNCTION `uc_session_login`( `reqjson` JS ...

  7. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  8. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  9. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

随机推荐

  1. mongodb在java驱动包下的操作(转)

    推荐几章很有用的文章 java操作参考文档 http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.html http://blog.csdn. ...

  2. JAVA的反射机制原理

    http://www.cnblogs.com/hongxinlaoking/p/4684652.html 一  反射机制的概念: 指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于 ...

  3. 使用webview如何做超时判断

    在加载网页时给一个timer定时器,规定超时时间,然后再超时时间的方法中提示超时 如果没有超时,则在webview协议中的“加载完成”方法中 取消timer定时器 - (void)openWebVie ...

  4. NPIV介绍

    我们知道在存储区域网络(SAN:storage area network),主机(Host)能够访问后端存储(比如CLARiiON,VNX)必备的一个前提是主机必须配备HBA卡(Host Bus Ad ...

  5. DirectoryExists

    判断文件夹是否存在 关键点 GetFileAttributes The GetFileAttributes function retrieves attributes for a specified  ...

  6. mongodb的地理位置索引

    mongoDB支持二维空间索引,使用空间索引,mongoDB支持一种特殊查询,如某地图网站上可以查找离你最近的咖啡厅,银行等信息.这个使用mongoDB的空间索引结合特殊的查询方法很容易实现.前提条件 ...

  7. 【VBA研究】变量定义的类型和实际赋值类型

    作者:iamlaosong VBA中变量能够先定义后使用,也能够不定义直接使用.假设模块前面加了Option Explicit语句,则变量必须先定义后使用. 只是.实验发现.VBA对变量类型没有进行严 ...

  8. 基于x86架构的内核Demo的详细开发文档

    http://hurlex.0xffffff.org/ 这里是hurlex这个基于x86架构的内核Demo的详细开发文档, 包含PDF文档和生成PDF的XeLaTex源码和文档每章节的阶段代码. 你可 ...

  9. Add an IPv6 route through an interface

    Not often needed, sometimes in cases of dedicated point-to-point links. 7.4.1. Using "ip" ...

  10. Java Inner class

    2016-03-27 内部类:就是把一个类的定义放在另外一个外围类定义的里面. class OutterClass{ class InnerClass { } } 1. 内部类主要有四种:成员内部类( ...