Servlet实现登录功能
题目:
创建一个项目,使用ServletA完成一个登陆页面,当用户在登陆页面上输入用户名和密码发给ServletB,
ServletB获得用户名和密码以后,提前在Web.xml文件中创建一个正确的用户名和密码作为共享静态数据.
ServletB获得共享静态数据和接收到浏览器发过来的用户名和密码进行匹配,如果匹配成功,返回浏览器登陆成功.
如果不匹配,跳转至ServletC,显示"登陆失败,用户名不存在或者密码错误,请点击这里进行重新登陆,或者5秒之后自动跳转至登陆页面"。
这道题想要掌握的知识——Servlet的四个对象。
分析:
第一步:
首先创建一个ServletA,然后在该Servlet中使用response对象来完成一个登录的页面。具体代码如下:
package com.Servlet.HomeWorks;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 该Servlet是用来显示浏览器登录功能的页面效果
* Servlet implementation class ServletA
*/
@WebServlet("/SerA")
public class ServletA extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ServletA() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码格式
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
//创建一个登录页面
PrintWriter pw = response.getWriter();
pw.print("<div align='center'>");
pw.print("<h1>用户登录</h1>");
//创建一个表单
pw.print("<form action='SerB' method='get'>");
pw.print("用户名:<input type='text' name='userName'> ");
pw.print("密 码:<input type='text' name='passWord'> <br /><br />");
pw.print("<input type='submit' value='登录'> ");
pw.print("</form>");
pw.print("</div>");
//response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
运行后的结果为:显示出登录页面。
第二步:
在创建ServletB之前,提前在web.xml配置文件中的配置好可共享的静态数据,该静态数据的作用:用来在用户登录时判断的依据。具体代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>JSP_HomeWorks</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>Bio.jsp</welcome-file>
<welcome-file>OldBio.jsp</welcome-file>
</welcome-file-list>
<!-- 提前设置好可共享的静态数据——用户名和密码 -->
<context-param>
<param-name>name</param-name>
<param-value>余文君</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>20020525</param-value>
</context-param>
<!-- 注意:这些数据都是最终用来进行验证用户名和密码是否与已有的账户是否相等 -->
</web-app>
之后,将从ServletA中获取到的用户名和密码与提前准备好的可共享的静态数据进行判断。如果用户名和密码都符合,则浏览器上将显示“浏览器登录成功”的提示信息;如果用户名和密码不符合,则跳转至ServletC上。具体代码如下:
package com.Servlet.HomeWorks;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 该Servlet是用来显示用户输入用户名和密码后的效果
* 需求:
* 当用户输入的用户名和密码都符合时,就会显示出浏览器登录成功提示信息;
* 当用户输入的用户名和密码都不符合时,那么就跳转至另一页面上,
* 该页面显示的效果为:
* 显示“用户名不存在或者密码错误”;
* 并且实现请点击这里进行重新登录或者5秒之后自动跳转至登录页面。
* Servlet implementation class ServletB
*/
@WebServlet("/SerB")
public class ServletB extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ServletB() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码格式
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
String userNames = request.getParameter("userName");
String passWord = request.getParameter("passWord");
//pw.print(userNames + "---" + passWord);
//进行用户名和密码的验证:
/**
* 如果用户名和密码都符合已有用户的数据,则显示提示信息——浏览器登陆成功;
* 如果不符合,则跳转到下一页面,显示“登陆失败,用户名不存在或者密码错误”,
* 并且实现以下功能:
* 请大家这里进行重新登录,或者5秒之后自动跳转至登录页面。
*/
//首先的是要获取到配置文件中的共享静态数据
//该数据是用来作为判断的标志
//创建一个ServletContext对象
ServletContext context = getServletContext();
String name = context.getInitParameter("name");
String password = context.getInitParameter("password");
//进行判断
if(name.equals(userNames) && password.equals(passWord)) {
//当用户输入的用户名和密码都符合时,显示登录成功提示信息
pw.print("<h1>浏览器登录成功!</h1>");
}else {
//当用户名和密码不符合时,跳转至另一页面
response.sendRedirect("SerC");
}
//response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
第三步:
最后,创建一个ServletC,该Servlet是用来显示登陆失败后的页面。该效果为:显示“登录失败,用户名不存在或者密码错误”的提示信息,并且实现可以通过点击返回到登录页面或者通过5秒自动跳转回登录页面的功能。具体代码如下:
package com.Servlet.HomeWorks;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.Response;
import javax.xml.ws.soap.AddressingFeature.Responses;
/**
* 该Servlet是用来显示浏览器登录失败的效果
* 目的:
* 该页面显示的效果为:
* 显示“用户名不存在或者密码错误”;
* 并且实现请点击这里进行重新登录或者5秒之后自动跳转至登录页面。
* Servlet implementation class ServletC
*/
@WebServlet("/SerC")
public class ServletC extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ServletC() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
//当跳转至该页面时,就表明了浏览器登录失败
//提前设置好提示信息
String info = "<h1 style='color:red;'>登陆失败,用户名不存在或者密码错误!</h1>";
//那么就发出登录失败的提示信息
PrintWriter pw = response.getWriter();
//输出提示信息
pw.print(info);
//方式一:
//实现请点击这里进行重新登录
//pw.print("<a href='SerA'>请重新登录<br>");
//方式二:
//实现5秒之后自动跳转至登录页面
//创建一个ServletContext对象
ServletContext context = getServletContext();
//创建一个变量用来表示当前所剩的时间
int number = 5;
Object ob = context.getAttribute("time");
if(ob == null) {
context.setAttribute("time", number);
}else {
number = Integer.parseInt(ob + "");
context.setAttribute("time", number != 0 ? number - 1 : 5);
if(number == 0) response.sendRedirect("SerA");
}
response.getWriter().write("回到登录页面倒计时:" + number + "S");
response.setHeader("refresh", "1");
//response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
这里使用的是a标签来实现“通过点击后跳转回登录页面”;而对于5秒倒计时后跳转回登录页面,如果有不懂的,可以参照我之前所写的博客。<五秒后自动跳转页面>。
总结:
对于这道题,难度是没有太大的。不过,一定要掌握好Servlet的四个基本对象——ServletConfig、ServletContext、response和request。