您的位置:首页 > Web前端 > JavaScript

JSP+Servlet实现用户登录状态的保存

2017-11-03 17:23 836 查看
题目:编写一个用户登录页面(如果是ip地址为“192”开头的客户访问,则在页面显示该用户的ip地址),输入账号和密码,让用户选择“是否保存登录状态”,如果账号密码相等,则登陆成功,进入欢迎页面。

在登录时,如果保存了登录状态,下次登录时,如果访问登录页面,则进入欢迎页面。但是,客户如果没有经过登录就访问欢迎页面,则跳转到登录页面。

以下为思路分析,其中,前端用Bootstrap框架实现,后台基于JSP+Servlet+Mysql实现。代码下载(网盘,永久有效):http://pan.baidu.com/s/1bo9qwIb,后台数据库需自己创建和修改。

页面展示及数据库设计如下:



登陆成功显示:



工程文件主目录:



数据库设计:



思路分析:

1.当访客访问登陆页面welcome.jsp,先判断是否存在保存的cookie,如果是则跳转到欢迎页面bootstrap.jsp,如果不存在cookie则输入登陆信息;以下为登陆页面代码:welcome.jsp

<%@page language="java"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<meta name="viewport" content="
4000
width=device-width, initial-scale=1.0">
<!-- 引入 Bootstrap -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<title>欢迎登录</title>
</head>
<body>

<%
//首先进入登陆页面先判断是否存在cookie,如果是跳转到欢迎界面
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for(int i=0;i<cookies.length;i++) {
if(cookies[i].getName().equals("name")){
//如果cookie与保存的相等,即找到cookie
response.sendRedirect("bootstrap.jsp");
}
}
}
%>
<br><br><br><br><br>

<div class="jumbotron">
<div class="container">

<form action="servlet/servlet_login" method="post" class="form-horizontal" role="form"><br><br>
<div class="form-group">

<label class="col-sm-2 col-md-offset-4 control-label" ><span class="glyphicon glyphicon-user"></span>数据库账户:</label>
<div class="col-sm-6">
<input type="text" class="form-control" style="width:30%" name="name" value="" placeholder="请输入账户名"><br><br>
</div>
</div>

<div class="form-group">
<label class="col-sm-2 col-md-offset-4 control-label"><span class="glyphicon glyphicon-ok-circle"></span>数据库密码:</label>
<div class="col-sm-6">
<input type="text" class="form-control" style="width:30%" name="password" value="" placeholder="请输入密码"><br><br>
</div>

<!--打勾-->
<div class="checkbox col-sm-2 col-md-offset-6">
<label>
<input type="checkbox" name="save">保存密码
</label>
</div>
</div>
<input type="submit" class="col-sm-1 col-md-offset-5 btn btn-primary" value="登陆">
<input type="reset"  class="col-sm-1 col-md-offset-1 btn btn-primary" value="重置">
</form>

<%!public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
if(ip.startsWith("192")){}
else{ip="";}
return ip;
}%>
<label class="col-sm-4 col-md-offset-5 control-label">
<span class="glyphicon glyphicon-ok-circle" style="color: rgb(255, 0, 28); font-size: 14px;">你的IP地址为:</span>
<%=getIpAddr(request)%></label>;

</div>
</div>
</body>
</html>


2.当用户输入登陆用户名及密码时,提交到后台的servlet_login,servlet此时从web.xml中读取数据库用户名及密码进入数据库,从中查询用户名及密码是否正确,如果正确则判断用户是否勾选了保存密码;

3.如果用户勾选了保存密码,则设置cookie存活时间为1天(60*60*24),如果没有勾选保存密码的话就设置cookie存活时间为19s(为了便于验证,当然也可以设置更久);以下为servlet_login代码:servlet_login.java

package servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class servlet_login
*/
@WebServlet("/servlet_login")
public class servlet_login extends HttpServlet {
private static final long serialVersionUID = 1L;
Connection conn = null;
Statement stmt = null;
public void init(ServletConfig config) throws ServletException {
//载入连接数据库的信息
//ServletContext application=this.getServletContext();
String driverClass =config.getInitParameter("driverClass");
String url=config.getInitParameter("url");
String username = config.getInitParameter("username");
String password = config.getInitParameter("password");
System.out.println(username+"\n"+password);
//连接数据库MySQL,进行验证
try {
Class.forName(driverClass);
conn = DriverManager.getConnection(url,username,password);//得到连接
System.out.println("数据库连接成功");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//加载驱动
catch (SQLException e) {
e.printStackTrace();
}
}
/**
* @see HttpServlet#HttpServlet()
*/
public servlet_login() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
//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
//先判断cookie是否存在

Cookie[] cookies=request.getCookies();

if(cookies!=null){
for(int i=0;i<cookies.length;i++) {
if(cookies[i].getName().equals("name")){
//如果cookie与保存的相等,即找到cookie
response.sendRedirect("/Test666/bootstrap.jsp");break;
}
}
}
System.out.println("即将进行数据库查询");
//比较账号及密码是否正确
try {
stmt = conn.createStatement();
String name=request.getParameter("name");
String password=request.getParameter("password");
System.out.println(name+" "+password+"\n");

String sql="select * from count where name='"+name+"' and password='"+password+"'";
ResultSet rs=stmt.executeQuery(sql);

if(rs.next()==true) {//存在这个账户,密码
System.out.println("账户,密码正确");
//如果用户勾选了保存密码,则保留用户登陆信息,将用户名name存入Cookie
//此处判断是否勾选保存密码
//response.getWriter().append(request.getParameter("save"));

if(request.getParameter("save")!=null) {//如果勾选了保存密码
response.getWriter().append(request.getParameter("save"));
Cookie cookie=new Cookie("name",request.getParameter("name"));
cookie.setPath("/");//保证cookie存放的根目录相同
//设置cookie存活时间为1天
cookie.setMaxAge(60*60*24);
//将cookie保存在客户端
response.addCookie(cookie);
}
else {//如果没有勾选保存密码
Cookie cookie=new Cookie("name",request.getParameter("name"));
cookie.setPath("/");//保证cookie存放的根目录相同
//设置cookie存活时间为19s
cookie.setMaxAge(19);
//将cookie保存在客户端
response.addCookie(cookie);
}
//response.getWriter().append("欢迎登陆");
response.sendRedirect("/Test666/bootstrap.jsp");

System.out.println("测试,已跳转");
return ;

}
else {
System.out.println("账户及密码错误");
//如果账户,密码错误,则返回登陆界面
response.sendRedirect("/Test666/welcome.jsp");return ;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//Ending

}

}


4.添加cookie后,重定向到bootstrap.jsp欢迎页面,在欢迎页面先判断cookie是否存在,如果符合则显示欢迎页面内容,如果不符合则跳转到登陆页面。以下为欢迎页面代码:bootstrap.jsp

<%@ page language="java"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<!-- 引入 Bootstrap -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<title>Insert title here</title>
</head>
<body>

<%
Cookie[] cookies=request.getCookies();
boolean flag=false;
if(cookies!=null){
System.out.println("cookie的长度为:"+cookies.length);
for(int i=0;i<cookies.length;i++) {
if(cookies[i].getName().equals("name")){
//如果cookie与保存的相等,即找到cookie
flag=true;break;
//response.sendRedirect("bootstrap.jsp");
}
}
}
if(flag==false){response.sendRedirect("welcome.jsp");}//如果没找到cookie,就返回登陆界面
%>

<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<nav class="navbar navbar-default" role="navigation">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button> <a class="navbar-brand" href="#">导航1</a>
</div>

<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active">
<a href="#">导航2</a>
</li>
<li>
<a href="#">导航3</a>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">导航4<strong class="caret"></strong></a>
<ul class="dropdown-menu">
<li>
<a href="#">Action</a>
</li>
<li>
<a href="#">Another action</a>
</li>
<li>
<a href="#">Something else here</a>
</li>
<li class="divider">
</li>
<li>
<a href="#">Separated link</a>
</li>
<li class="divider">
</li>
<li>
<a href="#">One more separated link</a>
</li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-left" role="search">
<div class="form-group">
<input type="text" class="form-control" />
</div> <button type="submit" class="btn btn-default">Submit</button>
</form>
<ul class="nav navbar-nav navbar-right">
<li>
<a href="#"></a>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown<strong class="caret"></strong></a>
<ul class="dropdown-menu">
<li>
<a href="#">Action</a>
</li>
<li>
<a href="#">Another action</a>
</li>
<li>
<a href="#">Something else here</a>
</li>
<li class="divider">
</li>
<li>
<a href="#">Separated link</a>
</li>
</ul>
</li>
</ul>
</div>

</nav>
<div class="jumbotron">
<h1>
欢迎登录!
</h1>
<p>
欢迎来到登录界面!
</p>
<p>
<a class="btn btn-primary btn-large" href="#">Learn more</a>
</p>
</div>
</div>
</div>
</div>
</body>
</html>


5.当然,如果访客没经过登陆,直接访问欢迎页面bootstrap.jsp也会由于判断cookie不存在而跳转到登陆页面,最后,web.xml设置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Test666</display-name>
<servlet>
<servlet-name>servlet_login</servlet-name>
<servlet-class>servlet.servlet_login</servlet-class>

<init-param>
<param-name>driverClass</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>

<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/count?useUnicode=true&characterEncoding=utf-8</param-value>
</init-param>

<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>

<init-param>
<param-name>password</param-name>
<param-value>160337</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>servlet_login</servlet-name>
<url-pattern>/servlet/servlet_login</url-pattern>
</servlet-mapping>

<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>Filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
</welcome-file-list>
</web-app>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: