在用户登录界面添加复选框,当用户选中时则创建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保存在服务器端,不需要传输