admin 管理员组

文章数量: 888299

Cookie的应用

首先要创建一个数据库的表,表内含有用户名和密码,其代码如下:

      

drop table if exists t_user;
create table t_user(id int(10) primary key auto_increment,username varchar(32) not null unique,password varchar(32) not null unique,realname varchar(18) 
);
insert into t_user(username,password,realname) values('admin','123','管理员');
insert into t_user(username,password,realname) values('xiaoming','123','小明');
commit;
select * from t_user;
然后新建一个Web project,先进行web.xml的设置,代码如下:

  

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="" xmlns:xsi="" xsi:schemaLocation=" .xsd"><welcome-file-list><welcome-file>isLogin</welcome-file></welcome-file-list><servlet><servlet-name>login</servlet-name><servlet-class>com.bjpowernode.javaweb.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>login</servlet-name><url-pattern>/login</url-pattern></servlet-mapping><servlet><servlet-name>isLogin</servlet-name><servlet-class>com.bjpowernode.javaweb.servlet.CheckLoginStatusServlet</servlet-class></servlet><servlet-mapping><servlet-name>isLogin</servlet-name><url-pattern>/isLogin</url-pattern></servlet-mapping>
</web-app>

 下一步在Web-Root文件新建两个html页面文件,其中一个名为login.html,用于登陆的界面。其代码如下:

<!DOCTYPE html>
<html><head><title>login.html</title><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="this is my page"><meta http-equiv="content-type" content="text/html; charset=UTF-8"><!--<link rel="stylesheet" type="text/css" href="./styles.css">--></head><body><form action="/prj.servlet-19/login" method="post">用户名 <input type="text" name="username"><br>密码   <input type="password" name="password"><br><input type="checkbox" name="tenDayAutoLoginFlag" value="ok">十天内免登陆<br><input type="submit" value="登陆"></form></body>
</html>

  另外一个html文件用于用户登陆错误的界面。名为login_error.html,其代码如下所示:

<!DOCTYPE html>
<html><head><title>登陆失败</title><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="this is my page"><meta http-equiv="content-type" content="text/html; charset=UTF-8"><!--<link rel="stylesheet" type="text/css" href="./styles.css">--></head><body>登录失败,用户名不存在或者密码错误。请<a href="/prj.servlet-19/login.html">重新登陆</a></body>
</html>

在src下新建一个名为:com.bjpowernode.javaweb.servlet的包,包内新建一个名为:LoginServlet.java的类来继承HttpServlet接口。这个类用来处理用户登陆,其代码如下:

package com.bjpowernode.javaweb.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.sun.corba.se.spi.ior.ObjectKey;
import com.sun.jndi.url.corbaname.corbanameURLContextFactory;public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//获取用户名和密码request.setCharacterEncoding("UTF-8");String username=request.getParameter("username");String password=request.getParameter("password");//JDBC连接数据库验证用户名和密码Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;boolean flag=false;String realname=null;try {Class.forName("com.mysql.jdbc.Driver");conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","123");String sql="select id,username,password,realname from t_user where username=? and password=?";ps=conn.prepareStatement(sql);ps.setString(1,username);ps.setString(2,password);rs=ps.executeQuery();if(rs.next()){flag=true;realname=rs.getString("realname");}} catch (Exception e) {e.printStackTrace();}finally{if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(ps!=null){try {ps.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}if(flag==true){//登陆成功之后,获取用户是否选择了十天内免登陆String tenDayAutoLoginFlag=request.getParameter("tenDayAutoLoginFlag");if("ok".equals(tenDayAutoLoginFlag)){//创建Cookie对象Cookie cookie1=new Cookie("username",username);Cookie cookie2=new Cookie("password",password);//设置有效时间cookie1.setMaxAge(60*60*24*10);cookie2.setMaxAge(60*60*24*10);//设置关联路径cookie1.setPath(request.getContextPath());cookie2.setPath(request.getContextPath());//发送Cookie给浏览器response.addCookie(cookie1);response.addCookie(cookie2);}//登陆成功,跳转到成功界面response.setContentType("text/html;charset=UTF-8");PrintWriter out=response.getWriter();out.print("<html>                    ");out.print("<head>                    ");out.print(" <title>欢迎界面</title>      ");out.print("</head>                   ");out.print("<body>                    ");out.print("  欢迎访问                    ");out.print(realname);out.print("</body>                   ");out.print("</html>                   ");}else{//登陆失败,跳转到失败界面}}}

再在这个包中建立一个类,用来处理用户的免登陆信息。该类名为:CheckLoginStatusServlet.java。代码如下所示:
package com.bjpowernode.javaweb.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;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 CheckLoginStatusServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//从request中获取所有CookieCookie []cookies =request.getCookies();String username=null;String password=null;if(cookies!=null){//遍历Cookiefor(Cookie cookie:cookies){String cookieName=cookie.getName();String cookieValue=cookie.getValue();if("username".equals(cookieName)){username=cookieValue;}else if("password".equals(cookieName)){password=cookieValue;}}}if(username!=null&&password!=null){//连接数据库JDBC验证用户名和密码Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;boolean flag=false;String realname=null;try {Class.forName("com.mysql.jdbc.Driver");conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","123");String sql="select id,username,password,realname from t_user where username=? and password=?";ps=conn.prepareStatement(sql);ps.setString(1,username);ps.setString(2,password);rs=ps.executeQuery();if(rs.next()){flag=true;realname=rs.getString("realname");}} catch (Exception e) {e.printStackTrace();}finally{if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(ps!=null){try {ps.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}//登录成功跳转到成功界面if(flag==true){//登陆成功之后,获取用户是否选择了十天内免登陆//登陆成功,跳转到成功界面response.setContentType("text/html;charset=UTF-8");PrintWriter out=response.getWriter();out.print("<html>                    ");out.print("<head>                    ");out.print(" <title>欢迎界面</title>      ");out.print("</head>                   ");out.print("<body>                    ");out.print("  欢迎访问                    ");out.print(realname);out.print("</body>                   ");out.print("</html>                   ");}else{//登陆失败,跳转到失败界面response.sendRedirect(request.getContextPath()+"/login_error.html");}}else {//跳转到登陆界面response.sendRedirect(request.getContextPath()+"/login.html");}}}

最后将MySQL的驱动导入到该项目中,进行测试,运行效果图如下所示:




本文标签: Cookie的应用