代碼倉庫:https://gitee.com/DerekAndroid/CookieSession.git
案例一:記錄最後一次訪問時間
若用戶是第一次登錄該網站
提示:歡迎訪問
若用戶不是第一次登錄該網站
提示:您上次訪問的時間爲:xxxxxxxx
步驟分析:
1.獲取所有的cookie數組
2.從數組中查找含有最後一次訪問時間的cookie
3.若沒有查到對應的cookie 那麼說明是第一次訪問該網站 提示:歡迎訪問
4.若查到對應的cookie 說明 不是第一次訪問該網站 獲取當前cookie的value值 提示:您最後一次訪問時間爲value
5.獲取當前的時間
6.把當前的事件放到cookie中
驗證碼生成+session保存:
package com.itheima.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 使用java圖形界面技術繪製一張圖片
int charNum = 4;
int width = 20 * 4;
int height = 28;
// 1. 創建一張內存圖片
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 2.獲得繪圖對象
Graphics graphics = bufferedImage.getGraphics();
// 3、繪製背景顏色
graphics.setColor(Color.YELLOW);
graphics.fillRect(0, 0, width, height);
// 4、繪製圖片邊框
graphics.setColor(Color.GRAY);
graphics.drawRect(0, 0, width - 1, height - 1);
// 5、輸出驗證碼內容
graphics.setColor(Color.RED);
graphics.setFont(new Font("宋體", Font.BOLD, 22));
// 隨機輸出4個字符
String s = "ABCDEFGHGKLMNPQRSTUVWXYZ23456789";
Random random = new Random();
// session中要用到
String msg = "";
int x = 5;
for (int i = 0; i < charNum; i++) {
int index = random.nextInt(32);
String content = String.valueOf(s.charAt(index));
msg += content;
graphics.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
graphics.drawString(content, x, 22);
x += 20;
}
request.getSession().setAttribute("sessionYzm", msg);
// 6、繪製干擾線
graphics.setColor(Color.GRAY);
for (int i = 0; i < 5; i++) {
int x1 = random.nextInt(width);
int x2 = random.nextInt(width);
int y1 = random.nextInt(height);
int y2 = random.nextInt(height);
graphics.drawLine(x1, y1, x2, y2);
}
// 釋放資源
graphics.dispose();
// 圖片輸出 ImageIO
ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
登錄校驗驗證碼
package com.itheima.c_case;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LastTimeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//處理響應亂碼
response.setContentType("text/html;charset=utf-8");
//獲取所有的cookie數組
Cookie[] cookies = request.getCookies();
//從cookie數組中查找含有lastTime的cookie
Cookie co = null;
if(cookies!=null){
//查找cookie
for(Cookie cookie:cookies){
//哪個cookie含有lastTime
if("lastTime".equals(cookie.getName())){
co=cookie;
}
}
}
//判斷是否存在cookie
if(co!=null){
response.getWriter().print("您上次的訪問時間爲:"+co.getValue());
}else{
response.getWriter().print("歡迎訪問");
}
//獲取當前的時間
DateFormat df = DateFormat.getDateTimeInstance();
String format = df.format(new Date());
//把當前時間放入cookie中
Cookie cookie = new Cookie("lastTime", format);
//設置cookie的存活時間
cookie.setMaxAge(3600);
//寫回到瀏覽器
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
案例二:一次性驗證碼
需求:
把驗證碼添加到登錄案例中
並且對驗證碼的輸入進行校驗
若驗證碼沒有輸入或者輸入的爲空格 提示:請輸入驗證碼
若驗證碼輸入了 但是輸入的不正確 提示:請輸入正確的驗證碼
步驟:
1.複製day1102項目
2.修改web action
3.//把msg放入session域對象中
4.servlet的操作
//獲取前臺錄入的驗證碼
//若用戶沒有輸入或者輸入的爲空格 提示:請輸入驗證碼
//若用戶輸入值,但是值不正確
//判斷前臺錄入的值和session中的驗證碼是否一致
package com.itheima.servlet;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.itheima.bean.User;
import com.itheima.service.LoginService;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("content-type", "text/html;charset=utf-8");
//獲取請求的用戶名和密碼
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username="+username);
//獲取前臺錄入的驗證碼
String yzm = request.getParameter("yzm");
System.out.println("yzm="+yzm);
//從session中獲取圖片中的驗證碼
String sessionYzm=(String)request.getSession().getAttribute("sessionYzm");
System.out.println("sessionYzm="+sessionYzm);
//清空session 保證點擊登錄的時候 驗證碼是最新的
request.getSession().removeAttribute("sessionYzm");
//創建LoginService
LoginService ls = new LoginService();
try {
//校驗驗證碼
if(yzm==""||yzm.trim().length()==0){
//把錯誤信息放入request域中
request.setAttribute("msg", "請輸入驗證碼");
//請求轉發
request.getRequestDispatcher("/login.jsp").forward(request, response);
//直接返回,後續的不執行,不然會報錯: Cannot forward after response has been committed
return;
}else{
//如果兩個驗證不一樣 需要給出提示
if(!yzm.equalsIgnoreCase(sessionYzm)){
System.out.println("請輸入正確的驗證碼");
//把錯誤信息放入request域中
request.setAttribute("msg", "請輸入正確的驗證碼");
//請求轉發
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
}
//調用service中的方法
User user=ls.getUserByUsernameAndPwd(username,password);
//根據返回的對象,判斷提示信息的內容
System.out.println(request.getContextPath());
if(user==null){
//response.getWriter().println("登錄失敗");
//把錯誤信息放入request域對象中
request.setAttribute("msg", "登錄失敗");
//使用請求轉發跳轉到login.jsp
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
//不能使用重定向,因爲使用重定向後request失效
//response.sendRedirect("/day1102/login.jsp");
}else{
request.getSession().setAttribute("username", user.getUsername());
response.getWriter().println(user.getUsername()+":歡迎回來");
request.getRequestDispatcher("/1.jsp").forward(request, response);
System.out.println("/1.jsp");
return;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}