项目结构
采用MVC结构搭建
访问数据库检验用户名密码的Logindao
登录是否成功的判断条件:Session中是否含有user
1.CheckCodeServlet:产生验证码图片输出,并将验证码内容存入session
2.LoginServlet:根据session和request中的数据。先判断验证码,再判断用户名是否正确。
上代码
Logindao
package dao;
import entity.User;
import java.sql.*;
/**
* 模型层,用于处理登录
*/
public class LoginDao {
public int login(User user){//登录
//返回: -1 系统异常 0:用户不存在 1:登陆成功
int result=-1;
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "105105");
String sql="select id,username,password from t_user where username= ? and password = ?";
ps = conn.prepareStatement(sql);
ps.setString(1,user.getUsername());
ps.setString(2,user.getPassword());
rs = ps.executeQuery();
if (rs.next()){
result = rs.getInt(1);
}
if (result>0){
return 1;//登录成功
}else {
return 0;//用户不存在
}
} catch (Exception e) {
e.printStackTrace();
return -1;
} finally {
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
user对象
package entity;
public class User {
private int id;
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
CheckCodeServlet
package servlet;
import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet("/CheckCodeServlet")
public class CheckCodeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int width=100;
int heigth=50;
//1.创建验证码图片对象
BufferedImage image=new BufferedImage(width,heigth,BufferedImage.TYPE_INT_RGB);//BufferedImage.TYPE_INT_RGB 三原色
//2.美化图片
//2.1 填充背景色
Graphics g = image.getGraphics();//画笔对象
g.setColor(Color.PINK);//设置画笔颜色
g.fillRect(0,0,width,heigth);//填充
//2.2画边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width-1,heigth-4);
StringBuilder sb=new StringBuilder();
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//生成随机角标
Random ran=new Random();
for (int i=1;i<=4;i++){
int index=ran.nextInt(str.length());//生成随机角标
char ch=str.charAt(index);//获取字符
sb.append(ch);
//2.3 写入验证码
g.drawString(ch+"",width/5*i,heigth/2);
}
String checkCode_session = sb.toString();
//将验证码存入session
req.getSession().setAttribute("checkCode_session",checkCode_session);
//2.4画干扰线
g.setColor(Color.GREEN);
//随机生成坐标点
for (int i=0;i<10;i++){
int x1=ran.nextInt(width);
int x2=ran.nextInt(width);
int y1=ran.nextInt(width);
int y2=ran.nextInt(width);
g.drawLine(x1,y1,x2,y2);
}
//3.将图片输出到页面展示
ImageIO.write(image,"jpg",resp.getOutputStream());
}
}
LoginServlet
package servlet;
import dao.LoginDao;
import entity.User;
import javax.servlet.*;
import java.io.IOException;
/**
* 控制层
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.处理编码
req.setCharacterEncoding("UTF-8");//对请求体中的数据采用指定方式进行编码【POST请求】
//2.获取参数
String username = req.getParameter("uname");
String password = req.getParameter("upwd");
String checkCode = req.getParameter("checkCode");
//3.从session中获取生成的验证码
String checkCode_session = (String) req.getSession().getAttribute("checkCode_session");
//删除验证码(保证只能使用一次就)
req.getSession().removeAttribute("checkCode_session");
//3.2 判断验证码是否正确
if (checkCode_session!=null && checkCode_session.equalsIgnoreCase(checkCode)){//忽略大小写的比较 equalsIgnoreCase
//验证码正确
//验证用户名和密码
User user=new User(username,password);
int result = new LoginDao().login(user);
if (result>0){
//登录成功
//存储用户信息
req.getSession().setAttribute("user",user);
req.getRequestDispatcher("success.jsp").forward(req,resp);
} else{
//登录失败
//存入错误信息到request
req.setAttribute("login_error","用户名密码错误");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
} else {
//验证码不正确
//存储错误信息到request
req.setAttribute("cc_error","验证码错误");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
}
}
前段页面
代码:
login.jsp
<%--
Created by IntelliJ IDEA.
User: Chef Liu
Date: 2020/5/19
Time: 18:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
<script>
window.onload=function () {
document.getElementById("img").onclick=function () {
this.src="CheckCodeServlet?time="+new Date().getTime();
// 这里new Date().getTime(),的作用是避免浏览器以为是同一张图片不会刷新了
}
}
</script>
<style>
div{
color: red;
}
</style>
</head>
<body>
<form action="LoginServlet" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="uname"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="upwd"></td>
</tr>
<tr>
<td>验证码</td>
<td><input type="text" name="checkCode"></td>
</tr>
<tr>
<td colspan="2"><img id="img" src="CheckCodeServlet"></td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="login"></td>
</tr>
</table>
<div><%=request.getAttribute("login_error")==null ? "" :request.getAttribute("login_error") %></div>
<div><%=request.getAttribute("cc_error")==null ? "" :request.getAttribute("cc_error")%></div>
</form>
</body>
</html>
登录成功页面:显示用户名+注销按钮
<%@ page import="entity.User" %><%--
Created by IntelliJ IDEA.
User: Chef Liu
Date: 2020/5/25
Time: 14:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
User user = (User) request.getSession().getAttribute("user");
%>
<%
if (user!=null){
%>
<h1><%=user.getUsername()%></h1>
<%
}
%>
</body>
</html>
注销(使Session失效)
<%--
Created by IntelliJ IDEA.
User: Chef Liu
Date: 2020/5/19
Time: 11:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注销</title>
</head>
<body>
<%
session.invalidate();//session失效
response.sendRedirect(request.getContextPath()+"/login.jsp");
%>
</body>
</html>