一.验证码匹配图解分析
1.png分析:
1.浏览器通过访问路径/toLogin.do访问服务器,服务器用MianServlet转发给login.jsp处理请求,然后向浏览器做出响应返回一个html
2.1浏览器对网页进行加载(文本转换成对象显示),浏览器向服务器发送请求,要求返回路径相对应的图片
2.2图片由静态变成动态,服务器用MianServlet中的creatImg()方法去调ImageUtil这个工具类,返回图片和验证码字符串
3.处理表单中的请求点击登录后,服务器通过MianServlet中的login()方法去验证登录,那么这里添加判断验证码判断的逻辑
第二个请求生成验证码给第三个请求使用,需要用session去存储
二.验证码业务实现
1.在MainServlet类中增加createImg()
生成验证码图片的方法,里面通过ImageUtil工具类去生成图片数组,元素1位字符串存在session中,元素2位图片使用流发送到浏览器上
// 生成验证码
protected void createImg(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// 生成验证码及图片
Object[] objs = ImageUtil.createImage();
// 将验证码存入session
HttpSession session = req.getSession();
session.setAttribute("imgcode", objs[0]);
// 将图片发送给浏览器
res.setContentType("image/png");
// 获取字节输出流,该流由服务器创建,
// 其目标就是当前访问的那个浏览器.
OutputStream os = res.getOutputStream();
BufferedImage img = (BufferedImage) objs[1];
ImageIO.write(img, "png", os);
os.close();
}
2.在重写的service方法里做路径判断
else if("/createImg.do".equals(path)) {
createImg(req,res);
}
3.在login.jsp
界面中的要验证码图片进行路径的替换,并且添加点击事件
<tr>
<td class="login_info">验证码:</td>
<td class="width70"><input name="" type="text" class="width70" /></td>
<!-- <td><img src="images/valicode.jpg" alt="验证码" title="点击更换" /></td> -->
<td><img src="createImg.do" onclick="this.setAttribute('src','createImg.do?x='+Math.random());" alt="验证码" title="点击更换" /></td>
<td><span class="required"></span></td>
</tr>
2.png
注:
这里添加单击事件去切换验证码实质上是随机动态更改图片的请求路径
4.做登录的验证,验证这个验证码和填写的是否一致,在login.jsp的验证码的逻辑处name="code"
,
<td class="width70"><input name="code" type="text" class="width70" /></td>
5.在MianServlet中的login()方法去验证登录
String code = req.getParameter("code");
// 检查验证码
HttpSession session = req.getSession();
String imgcode = (String) session.getAttribute("imgcode");
if (code == null || !code.equalsIgnoreCase(imgcode)) {
req.setAttribute("error", "验证码错误");
req.getRequestDispatcher("WEB-INF/main/login.jsp").forward(req, res);
return;
}
三.登录检查图解分析
3.png分析:
1.浏览器向服务器发送请求,服务器交给LoginFilter过滤器去处理
2.当登录成功后,把adminCode
存入session中,后面用过滤器判断登录成功
3.如果过滤器判断没有登录过去重定向到登录界面,如果登陆过则可以访问其他的界面
四.登录检查业务实现
1.在src/main/java->web下创建LoginFilter文件,并实现Filter接口
2.在doFilter
方法中从session中获取账号,并做判断
// 从session中获取账号
HttpSession session = req.getSession();
Object user = session.getAttribute("adminCode");
// 判断用户是否登录
if (user == null) {
// 没登录,重定向到登录页
res.sendRedirect(req.getContextPath() + "/toLogin.do");
} else {
// 已登录,请求继续执行
chain.doFilter(req, res);
}
注:
这里重定向采用的是绝对路径,所以用req.getContextPath()
更加灵活
3.在web.xml中配置
<!-- 登录检查过滤器 -->
<filter>
<filter-name>login</filter-name>
<filter-class>web.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
注:
这里先全部过滤,然后再在LoginFilter
类中进行筛除
4.把不需要过滤的路径添加到数组中,再去获取当前的路径,然后遍历判断数组中的路径是否和当前的路径相等,如果相等则不需要过滤,后面代码不需要执行,程序的请求继续运行
String[] paths = new String[] { "/toLogin.do", "/login.do", "/createImg.do" };
String current = req.getServletPath();
for (String p : paths) {
if (p.equals(current)) {
chain.doFilter(req, res);
return;
}
}
网友评论