当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2021-06-25
题目:编写一个用户登录页面(如果是ip地址为“192”开头的客户访问,则在页面显示该用户的ip地址),输入账号和密码,让用户选择“是否保存登录状态”,如果账号密码相等,则登

题目:编写一个用户登录页面(如果是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="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&amp;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>
网友评论