大四快毕业了,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. [poj 2186]Popular Cows[Tarjan强连通分量]

    题意: 有一群牛, a会认为b很帅, 且这种认为是传递的. 问有多少头牛被其他所有牛认为很帅~ 思路: 关键就是分析出缩点之后的有向树只能有一个叶子节点(出度为0). 做法就是Tarjan之后缩点统计 ...

  2. 【JAVA - SSM】之MyBatis动态SQL

    动态SQL就是在SQL语句中添加一些标签,以完成某些逻辑.通常用到的动态SQL标签有<if>.<choose>.<where>.<trim>.<s ...

  3. 获取WINDOWS特殊文件夹

    const// registry entries for special paths are kept in :  REGSTR_PATH_SPECIAL_FOLDERS   = REGSTR_PAT ...

  4. linux+nginx+tomcat负载均衡,实现session同步

    linux+nginx+tomcat负载均衡,实现session同步 花了一个上午的时间研究nginx+tomcat的负载均衡测试,集群环境搭建比较顺利,但是session同步的问题折腾了几个小时才搞 ...

  5. careercup-树与图 4.5

    4.5 实现一个函数,检查一棵二叉树是否为二叉查找树. 参考:http://blog.csdn.net/sgbfblog/article/details/7771096 C++实现代码: #inclu ...

  6. iOS 并行编程:GCD Dispatch Sources

    1 简介 dispatch source是一种用于处理事件的数据类型,这些被处理的事件为操作系统中的底层级别.Grand Central Dispatch(GCD)支持如下的dispatch sour ...

  7. 微信公众号支付(三):页面调用微信支付JS并完成支付

    一.调用微信的JS文件 1.首先要绑定[JS接口安全域名],“公众号设置”的“功能设置”中 2.引入JS文件 备注:支持使用 AMD/CMD 标准模块加载方法加载 <script type=&q ...

  8. Scala函数字面量

    Scala中函数为头等公民,你不仅可以定义一个函数然后调用它,而且你可以写一个未命名的函数字面量,然后可以把它当成一个值传递到其它函数或是赋值给其它变量.下面的例子为一个简单的函数字面量(参考整数字面 ...

  9. SQL错误:sql server 目录名无效

    今天遇到一个错误,在网上找了半天,还有人说需要重装sql.我出错误的是网站服务器..重装影响太大了.想找一个比较不影响网站运作的办法.终于也不负我努力(啊喂!其实满百度都是可是你看不懂好吧!)找到了一 ...

  10. Algorithm

    经过慎重考虑,也经过反复思考.查阅网上相关资料 一位高手对我的建议: 一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的 ,主要时间是花在思考算法上,不是花在写程 ...