day_7在servlet中實現cookie技術

cookie會以文件的形式將用戶名密碼保存在電腦端(客戶端)內,在設定的時間內(即使關機)不會被清除,這點要好於session

那麼如何讓之前編寫的網頁app實現用戶登錄的cookie技術呢?


完成效果:

在login界面登錄用戶


填好後勾選兩週內不再重新登錄



進入後可以退出瀏覽器

這時再次打開瀏覽器,發現輸入wel界面的url,一樣可以進入wel界面(爲了和session區分,請在session設定時間之後測試cookie)

結果如圖




代碼修改如下

//登錄界面的servlet
package test1;

import java.io.*;
import javax.servlet.http.*;

public class Login extends HttpServlet{
	public void doPost(HttpServletRequest req,HttpServletResponse res){
		this.doGet(req,res);
	}
	public void doGet(HttpServletRequest req,HttpServletResponse res){
		//res:頁面向控制檯迴應,頁面發出信息。req:控制檯向頁面要求,控制檯接收頁面信息。
		try
		{
			res.setContentType("text/html;charset=gbk");//中文防止亂碼
			
			PrintWriter pw = res.getWriter();
			
			
			pw.println("<html>");//html文件體
			pw.println("<body>");//body體
			pw.println("<hr />");//分割線
			pw.println("<h1>登陸界面</h1>");
			pw.println("<form action = logincl method=post>");//該段組件體和logincl體進行關聯
			pw.println("用戶名:<input type = text name = username><br />");//用戶名組件體
			pw.println("密碼:<input type = password name = passwd><br />");//密碼組件體
			
			pw.println("<input type=checkbox name=keep valu=2>兩週內不再重新登錄<br />");//cookie
			
			pw.println("<input type = submit value = '登錄'><br />");
			pw.println("<hr />");
			pw.println("<form>");
			//得到error信息
			String info = (String)req.getParameter("info");
			
			if(info.equals("error1") )
			{
				pw.println("您的名或密碼輸入錯誤");
			}
			if(info.equals("error2") )
			{
				pw.println("您的session超時請重新登錄");
			}
			
			pw.println("</center></body>");//body體
			pw.println("</html>");//html文件體
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
}

//登錄控制文件的servlet

package test1;

import javax.servlet.http.*;
import java.io.*;
import java.sql.*;

public class LoginCl extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse res){
		this.doPost(req,res);
	}
	public void doPost(HttpServletRequest req,HttpServletResponse res){
	
		Connection ct = null;
		ResultSet rs = null;
		Statement sm = null;
		
		try{
			//服務器接收login頁面發來的用戶名和密碼,要用到req。
			String u = req.getParameter("username");//此處填寫組件名
			String p = req.getParameter("passwd");//此處填寫組件名
			System.out.println("name = "+u+",passwd="+p);
			
			//連接到數據庫
			
			 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			 
			 //得到鏈接
			 
			 ct = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=rvdb","sa","2887005");
			 
			 //創建Statrment
			 sm=ct.createStatement();
			 rs=sm.executeQuery("select top 1 passwd from users where username ='"+u+"'");
			 
			if(rs.next())
				{
					//說明用戶是存在的
					String dbPasswd=rs.getString(1);
					if(dbPasswd.equals(p))
					{
						//密碼和數據庫中的一致,用戶合法
						
						String keep = req.getParameter("keep");
						
						if(keep!=null)
						{
							//將用戶名和密碼保存在客戶端
							Cookie name = new Cookie("myname",u);
							Cookie pass = new Cookie("mypasswd",p);
							//設置時間
							name.setMaxAge(14*24*3600);
							pass.setMaxAge(14*24*3600);
							//回寫到客戶端
							
							res.addCookie(name);
							res.addCookie(pass);	
						}
						
						
						HttpSession hs = req.getSession(true);
						//得到和req相關聯的session,如果沒有就創建session
						hs.setMaxInactiveInterval(20);
						
						//hs.setAttribute("pass","ok");
						hs.setAttribute("pass",u);
						//連接登錄後的歡迎界面
				 		//sendRedirect的作用是跳轉界面
				 		res.sendRedirect("wel?username="+u+"&passwd="+p);//該處填寫域名
					}
					else
						res.sendRedirect("login?info=error1");
				}
			else
				{
					//說明連用戶名都沒有輸對,跳轉
					res.sendRedirect("login?info=error1");
					
				}
			
			}
		catch(Exception ex){
			ex.printStackTrace();
		}
		finally
		{
			try
			{
				if(rs!=null)
				{
					rs.close();
				}
				if(sm!=null)
				{
					sm.close();
				}
				if(ct!=null)
				{
					ct.close();
				}
				
				
			}
			catch (Exception ex)
			{
				ex.printStackTrace();
			}		
		}
	}
		
	
}

//登入後界面
package test1;

import javax.servlet.http.*;
import java.io.*;
import java.sql.*;

public class Wel extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse res){
		this.doPost(req,res);
	}
	public void doPost(HttpServletRequest req,HttpServletResponse res){
			
			//打開操作數據庫必要的變量
			Connection ct = null;
			ResultSet rs = null;
			PreparedStatement ps = null;
			Statement sm = null;
			
			
			
		try{
			//得到session
			res.setContentType("text/html;charset=gbk");//中文防止亂碼
			PrintWriter pw = res.getWriter();
			HttpSession hs = req.getSession(true);
			String valu = (String)hs.getAttribute("pass");//得到鍵值取對值(用戶名)
		
			
			String u = req.getParameter("username");
			String p = req.getParameter("passwd");
			String name="";
			String passwd="";
			 
			if(valu == null)//防止非法登登錄
			{
				//如果session中沒有用戶信息,看看有沒有用戶的cookie信息
				
				//從客戶端得到所有cookie信息
				Cookie [] allCookies = req.getCookies();
				int i = 0;
				//如果allCookies不爲空,遍歷
				if(allCookies!=null)
				{
					//從中取出cookie
					for(i=0;i<allCookies.length;i++)
					{
						//依次取出
						Cookie temp = allCookies[i];
						if(temp.getName().equals("myname"))
							//得到cookie的值
							name = temp.getValue();
									
						else if(temp.getName().equals("mypasswd"))
							passwd = temp.getValue();
						
					}
					
					if(!name.equals("")&&!passwd.equals(""))
					{
						//到logincl去驗證
						res.sendRedirect("logincl?username="+name+"&passwd="+passwd);
						System.out.println("name = "+name+",passwd="+passwd);
						return ;
					}
					
					
					
				}
				
				//返回登錄界面
				res.sendRedirect("login?info=error2");
				return ;
			}
			else
			{
				
				
			
				//在sevlet中顯示圖片
				pw.println("<body><center>");//body體,讓html文字在網頁中間顯示
				pw.println("<img src=imgs/welcome.gif><br />");//在tomcat/webapps/自己的網頁文件夾 創立imgs文件夾,放入圖片然後在html語句中插入圖片路徑即可
				
				pw.println("<h1>歡迎光臨!用戶"+valu+"</h1><br />");
				//pw.println("<p>您的密碼是"+p+"</p><br />");
				pw.println("<a href='http://localhost:8080/RevenWebsite/login'>返回重新登錄</a><br />");
				pw.println("<a href='http://www.baidu.com'>不懂?百度一下!</a><br />");
				
			
			//==================分頁功能==============//
			int pageSize = 3; //一頁顯示3條記錄
			int pageNow = 1;//當前顯示頁數
			int rowCount = 0;//一共有幾條記錄(查表)
			int pageCount = 0;//一共有幾頁
			int pageSize2 = 5;
			
			//動態地接受pageNow
			String sPageNow = req.getParameter("pageNow");
			if(sPageNow != null)
			{
				pageNow = Integer.parseInt(sPageNow);
			}
			
			//得到rowCount
			//操作數據庫
			//連接到數據庫
			
			 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			 
			 //得到鏈接
			 
			 ct = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=rvdb","sa","2887005");
			 
			 ps = ct.prepareStatement("select count(*) from users");
			 rs = ps.executeQuery();//得到結果集的方法
			 if(rs.next())
			 {
			 	rowCount = rs.getInt(1);
			 }
			 //計算pageCount
			 if(rowCount % pageSize == 0)
				{
			 		pageCount = rowCount/pageSize;
			 	}
			 	else
			 	{
			 		pageCount = rowCount/pageSize+1;
			 	}
			 ps = ct.prepareStatement("select top "+pageSize+" * from users where userId not in (select top "+pageSize*(pageNow-1)+" userId from users)");
			
			rs = ps.executeQuery();
			//表格
				pw.println("<table border = 1");
				pw.println("<tr><th>id</th><th>賬戶名</th><th>密碼</th><th>郵箱</th><th>權限等級</th></tr>");
				while(rs.next())
				{
					pw.println("<tr>");
					pw.println("<td>"+rs.getInt(1)+"</td>");
					pw.println("<td>"+rs.getString(2)+"</td>");
					pw.println("<td>"+rs.getString(3)+"</td>");
					pw.println("<td>"+rs.getString(4)+"</td>");
					pw.println("<td>"+rs.getInt(5)+"</td>");
					pw.println("</tr>");
				}
			pw.println("</table>");
			
			
			//顯示超鏈接
			//顯示上一頁
			if(pageNow!=1)
			pw.println("<a href=wel?pageNow="+(pageNow-pageSize2)+">上一頁</a>");
			for(int i = pageNow;i <= pageNow+pageSize2-1;i++)
			{
				pw.println("<a href=wel?pageNow="+i+">"+i+"</a>");
			}
			//顯示下一頁
			if(pageNow!=pageCount)
			pw.println("<a href=wel?pageNow="+(pageNow+pageSize2)+">下一頁</a>");
			
			}
			
			//=======實現跳轉頁(待調試)=======//
			//pw.println("<form action=wel method=post>");
			//pw.println("跳轉到第<input type=text name=SpageNow >頁");
			//pw.println("<form>");
			//String s =req.getParameter("SpageNow");
			//pw.println(s);
			//int t = Integer.parseInt(s);
			//pw.println(t);
			//pw.println("<a href=wel?pageNow=1>Go</a>");//req.getIntHeader()
			//=======實現跳轉頁(待調試)=======//
		
			
			pw.println("</center></body>");//body體,讓html文字在網頁中間顯示
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
		
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章