目录
前言
本篇文章中实际代码是将登录时的用户表-user与展示时的客户信息表-customer分开创建的,后面一些关于功能实现思路图的地方未来得及改动,所以请阅读时稍微注意。
1 登录
登录主要有几个功能要点:
1.输入
输入{用户名;密码;验证码}
2.提交
{登录按钮}
3.判断(接收后)
{服务端进行判断}
4.响应(输出)
{成功/失败}
1.1 登录界面
界面主要实现上述提到的功能中的(1.输入+2.提交)
界面展示效果如下:
1.1.1 验证码生成
验证码图片采用Servlet编辑实现动态生成,代码如下:
/**
* 验证码
*/
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//服务器通知浏览器不要缓存
response.setHeader("pragma","no-cache");
response.setHeader("cache-control","no-cache");
response.setHeader("expires","0");
//在内存中创建一个长80,宽30的图片,默认黑色背景
//参数一:长
//参数二:宽
//参数三:颜色
int width = 80;
int height = 30;
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics g = image.getGraphics();
//设置画笔颜色为灰色
g.setColor(Color.GRAY);
//填充图片背景
g.fillRect(0,0, width,height);
//用编写好的方法,产生4个随机验证码,如:12Ey
String checkCode = getCheckCode();
//将验证码放入HttpSession中
request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);
//设置画笔颜色为黄色
g.setColor(Color.YELLOW);
//设置字体的小大
g.setFont(new Font("黑体",Font.BOLD,24));
//向图片上写入验证码
g.drawString(checkCode,15,25);
//将内存中的图片输出到浏览器
//参数一:图片对象
//参数二:图片的格式,如PNG,JPG,GIF
//参数三:图片输出到哪里去
ImageIO.write(image,"PNG",response.getOutputStream());
}
/**
* 产生4位随机字符串
*/
private String getCheckCode() {
String base = "0123456789ABCDEFGabcdefg";
int size = base.length();
Random r = new Random();
StringBuffer sb = new StringBuffer();
for(int i=1;i<=4;i++){
//产生0到size-1的随机值
int index = r.nextInt(size);
//在base字符串中获取下标为index的字符
char c = base.charAt(index);
//将c放入到StringBuffer中去
sb.append(c);
}
return sb.toString();
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
1.1.2 登录界面代码如下:
切换验证码图片的函数:
<script type="text/javascript">
function refreshCode() {
//切换验证码
//1.使用dom获取图片对象
var vcode = document.getElementById("vcode");
//2.添加时间戳
vcode.src="${pageContext.request.contextPath}/checkCodeServlet?time="
+new Date().getTime();
}
</script>
表单代码如下:
<div class="container" style="width: 400px;">
<h3 style="text-align: center;">管理员登录</h3>
<form action="${pageContext.request.contextPath}/loginServlet" method="post">
<div class="form-group">
<label for="user">用户名:</label>
<input type="text" name="userName" class="form-control" id="user" placeholder="请输入用户名"/>
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="password" name="passWord" class="form-control" id="password" placeholder="请输入密码"/>
</div>
<div class="form-inline">
<label for="vcode">验证码:</label>
<input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码" style="width: 120px;"/>
<a href="javascript:refreshCode()">
<img src="${pageContext.request.contextPath}/checkCodeServlet" title="看不清点击刷新" id="vcode"/>
</a>
</div>
<hr/>
<div class="form-group" style="text-align: center;">
<input class="btn btn btn-primary" type="submit" value="登录">
</div>
</form>
1.2 loginServlet
界面主要实现上述提到的功能中的(3.判断+4.响应)
功能:
1.获取表单提交的验证码+用户名+密码
注意:先获取并判断 验证码 ,再访问数据库验证用户名密码,避免不必要的开销
2.验证
3.响应
成功:页面跳转至 查询页面
失败: 跳转回登录界面,并提示错误信息(验证码/用户名或密码)
实现代码如下:
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置编码,避免Post请求导致的中文乱码问题
request.setCharacterEncoding("utf-8");
//2.获取数据
//2.1获取用户填写验证码
//getParameter()
String verifycode = request.getParameter("verifycode");
//3.验证码校验
HttpSession session = request.getSession();
String checkCodeServer = (String) session.getAttribute("CHECKCODE_SERVER");
//确保验证码一次性
session.removeAttribute("CHECKCODE_SERVER");
//equalsIgnoreCase()不区分大小写比较
if(!checkCodeServer.equalsIgnoreCase(verifycode)){
//验证码不正确
//提示信息
request.setAttribute("login_msg","验证码错误!");
System.out.println(request.getAttribute("login_msg").toString());
//跳转(转发)登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;
}
Map<String, String[]> map = request.getParameterMap();
//4.使用BenUtils的populate()方法封装User对象
User user = new User();
try {
BeanUtils.populate(user,map);
System.out.println(user.toString());
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
//5.调用Service查询
UserService service = new UserServiceImpl();
User loginUser = service.login(user);
//6.判断是否登录成功
if(loginUser != null){
//登录成功
//将用户存入session
session.setAttribute("user",loginUser);
//跳转页面
response.sendRedirect(request.getContextPath()+"/index.jsp");
}else{
//登录失败
//提示信息
request.setAttribute("login_msg","用户名或密码错误!");
System.out.println(request.getAttribute("login_msg").toString());
//跳转登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletRespons