Servlet学习:利用Cookie实现两周内不用重复登录的效果

在用户登录界面添加复选框,当用户选中时则创建Cookie保存用户名和密码


用户登录界面代码为:

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

public class Login extends HttpServlet{

   //处理get请求
   public void doGet(HttpServletRequest req,HttpServletResponse res)
   {
   	try{
              res.setContentType("text/html;charset=utf-8");
              PrintWriter pw=res.getWriter();
    	        pw.println("<html>");
    		pw.println("<body>");
    		pw.println("<hl>Login</hl><br>");
    		pw.println("<form action=loginCK method=post>");
    		pw.println("User:<input type=text name=username> <br>");
    		pw.println("Passwd:<input type=password name=password> <br>");
    		pw.println("<input type=checkbox name=keep value=2>remember me <br>");  //增加复选框
    		pw.println("<input type=submit value=Login> <br>");
    		pw.println("</form>");
    		pw.println("</body>");
    		pw.println("</html>");
    		
    	  }catch(Exception ex){
    		ex.printStackTrace();
    	}
   }
   public void doPost(HttpServletRequest req,HttpServletResponse res)
   {
   	this.doGet(req,res);
   }
    
}
如果用户选中复选框,则在用户验证模块中创建Cookie。

用户验证的代码为:

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

public class LoginCK extends HttpServlet{

   //处理get请求
   public void doGet(HttpServletRequest req,HttpServletResponse res)
   {
   	  Connection ct=null;
   	  PreparedStatement ps=null;
   	  ResultSet rs=null;
     try{
   	     //接收用户名和密码
            String u=req.getParameter("username");
    	    String p=req.getParameter("password");
             //连接数据库
    	    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    	   ct=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Students","sa","lissdy033!");
            
    	    ps=ct.prepareStatement("select top 1 * from [Students].[dbo].[User] where name='"+u+"'and passwd='"+p+"'");  
            rs=ps.executeQuery(); 
           if(rs.next())   //如果用户合法
            {
            	String keep=req.getParameter("keep"); //复选框是否被选中
            	if(keep!=null)  //如果复选框选中则创建Cookie,令用户两周内不必登录
            	{
            	    //cookie
                    Cookie name=new Cookie("myname",u);
            	    Cookie passwd=new Cookie("passed",p);
            	    name.setMaxAge(14*24*3600);//two weeks
            	    passwd.setMaxAge(14*24*3600);
            	    res.addCookie(name);
            	    res.addCookie(passwd);
            	}
            //为了用户名和密码的安全性,以Session的方式传递这两个值
               HttpSession hs=req.getSession(true);
               hs.setMaxInactiveInterval(30);
               hs.setAttribute("uname",u);
               hs.setAttribute("pass",p);
               res.sendRedirect("Wel");   
               
            }else  
             {  
               res.sendRedirect("login");//写需要跳转的servlet的那个url   
              }  

    		 if(rs!=null)
    		 {
    		 		rs.close();
    		 }
    		 if(ps!=null)
    		 {
    		 	ps.close();
    		 }
    	     if(ct!=null)
    	     {
    	     	ct.close();
    	     }
    	        
    	
    	}catch(Exception ex){
    		ex.printStackTrace();
    	}
    
}

可以看见创建的Cookie内容如图:


如果用户直接访问欢迎界面,需要对Cookie中是否存在正确的用户名和密码进行判断,如果Cookie中内容正确,则可以直接访问欢迎界面,反之页面跳转到登录界面。

欢迎界面代码为:

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

public class Wel extends HttpServlet{

   //处理get请求
   public void doGet(HttpServletRequest req,HttpServletResponse res)
   {
   	 try{
   	 	
               PrintWriter pw=res.getWriter();
             //获取Session中信息
              HttpSession hs=req.getSession(true);
              String name=(String)hs.getAttribute("uname");
              String pass=(String)hs.getAttribute("passwd");
               if(name==null){   //判断直接访问欢迎界面的用户是否合法(session没有用户名,不是从登录界面进入的)
            	 String cname="";
            	 String cpasswd="";
                Cookie[] allCookies=req.getCookies();  //获取Cookie
                if(allCookies!=null)
                {   
                	for(int i=0;i<allCookies.length;i++)
                	{
                		Cookie temp=allCookies[i];
                		if(temp.getName().equals("myname"))
                		{
                		   cname=temp.getValue();  //获得cookie中的用户名和密码
                		}
                		else if(temp.getName().equals("passwd"))
                		{
                		   cpasswd=temp.getValue();
                		}
                	}
                  if(!cname.equals("")&&!cpasswd.equals(""))   //获取用户名和密码之后将其送至用户验证部分,验证其合法性
                  {
                  	res.sendRedirect("loginCK?username="+cname+"&password="+cpasswd);
                  	return;
                  }
                }
                res.sendRedirect("login");   //直接登录欢迎界面且cookie中无值,跳转登录界面
            }
          
            pw.println("<img src=imgs/0.jpg><br>");
         	pw.println("Welcome!"+name);
    	
    	}catch(Exception ex){
    		ex.printStackTrace();
    	}
   }
   public void doPost(HttpServletRequest req,HttpServletResponse res)
   {
   	this.doGet(req,res);
   }
    
}
直接登录欢迎界面效果如图:


cookie vs session:

1.存在的位置

cookie保存在客户端,session保存在服务器端

2.安全性

比较而言,cookie的安全性比session要弱

3.网络传输量

cookie通过网络在客户端与服务器端传输,而session保存在服务器端,不需要传输




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值