您的位置:首页 > 其它

Cookie的应用---十天免登陆设计

2017-05-09 15:51 369 查看
首先要创建一个数据库的表,表内含有用户名和密码,其代码如下:

       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="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.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 {

@Override
protected 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 block
e.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 {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//从request中获取所有Cookie
Cookie []cookies =request.getCookies();
String username=null;
String password=null;
if(cookies!=null){
//遍历Cookie
for(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 block
e.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的驱动导入到该项目中,进行测试,运行效果图如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: