Servlet 中的登录系统

Login System in Servlet

我在 Servlet 的登录系统中遇到问题。 当我单击登录按钮时应该执行 DoLoginServlet 然后访问数据库并检查登录然后重定向到 userInfoView.jsp 。 但是当我单击按钮时出现错误。

主页:index.jsp

<a href="${pageContext.request.contextPath}/MyJsps/login.jsp" target="_blank"><img src="<c:url value="/images/login1.png"/>"

登录页面:login.jsp

<%@ page language="java" contentType="text/html; charset=windows-1256"
        pageEncoding="windows-1256"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!DOCTYPE html>
    <!--[if lt IE 7 ]> <html lang="en" class="no-js ie6 lt8"> <![endif]-->
    <!--[if IE 7 ]>    <html lang="en" class="no-js ie7 lt8"> <![endif]-->
    <!--[if IE 8 ]>    <html lang="en" class="no-js ie8 lt8"> <![endif]-->
    <!--[if IE 9 ]>    <html lang="en" class="no-js ie9"> <![endif]-->
    <!--[if (gt IE 9)|!(IE)]><!-->
    <html lang="en" class="no-js">
    <!--<![endif]-->
    <head>
    <meta charset="UTF-8" />
    <!-- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">  -->
    <title>Login and Registration</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description"
        content="Login and Registration Form with HTML5 and CSS3" />
    <meta name="keywords"
        content="html5, css3, form, switch, animation, :target, pseudo-class" />
    <meta name="author" content="Codrops" />
    <link rel="shortcut icon" href="<c:url value="../favicon.ico"/>">
    <link rel="stylesheet" type="text/css"
        href="<c:url value="/css/demo.css"/>" />
    <link rel="stylesheet" type="text/css"
        href="<c:url value="/css/style.css"/>" />
    <link rel="stylesheet" type="text/css"
        href="<c:url value="/css/animate-custom.css"/>" />
    </head>
    <body>
        <div class="container">
            <!-- Codrops top bar -->
            <!--/ Codrops top bar -->

            <header>
                <nav class="codrops-demos"></nav>
            </header>

            <section>
                <div id="container_demo">
                    <!-- hidden anchor to stop jump http://www.css3create.com/Astuce-Empecher-le-scroll-avec-l-utilisation-de-target#wrap4  -->
                    <a class="hiddenanchor" id="toregister"></a> <a class="hiddenanchor"
                        id="tologin"></a>

                    <div id="wrapper">

                        <div id="login" class="animate form">
                            <form method="POST" action="/doLogin" autocomplete="on"> <!-- here--!>
                                <h1>Log in</h1>
                                <p>
                                    <label for="username" class="uname" data-icon="u"> Your
                                        email</label> <input id="username" name="username" required
                                        type="email" placeholder="eg. /////@gmail.com" />
                                </p>
                                <p>
                                    <label for="password" class="youpasswd" data-icon="p">
                                        Your password </label> <input id="password" name="password" required
                                        type="password" placeholder="eg. X8df!90EO" />
                                </p>
                                <p class="keeplogin">
                                    <input type="checkbox" name="loginkeeping" id="loginkeeping"
                                        value="loginkeeping" /> <label for="loginkeeping">Keep
                                        me logged in</label>
                                </p>
                                <p class="login button">
                                    <input type="submit" value="Login" />
                                </p>
                                <p class="change_link">
                                    Not a member yet ? <a href="#toregister" class="to_register">Join
                                        us</a>
                                </p>
                            </form>
                        </div>

DoLoginServlet Class:

package com.magician.project.servlets;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
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.servlet.http.HttpSession;

import com.magician.project.beans.UserAccount;
import com.magician.project.utils.DBUtils;
import com.magician.project.utils.MyUtils;



@WebServlet(name = "doLogin",urlPatterns = { "/doLogin" })
public class DoLoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public DoLoginServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        String rememberMeStr = request.getParameter("loginkeeping");
        boolean remember= "Y".equals(rememberMeStr);


        UserAccount user = null;
        boolean hasError = false;
        String errorString = null;

        if (userName == null || password == null
                 || userName.length() == 0 || password.length() == 0) {
            hasError = true;
            errorString = "Required username and password!";
        } else {
            Connection conn = MyUtils.getStoredConnection(request);
            try {

                user = DBUtils.findUser(conn, userName, password);

                if (user == null) {
                    hasError = true;
                    errorString = "User Name or password invalid";
                }
            } catch (SQLException e) {
                e.printStackTrace();
                hasError = true;
                errorString = e.getMessage();
            }
        }

        // If error, forward to /login.jsp
        if (hasError) {
            user = new UserAccount();
            user.setUserName(userName);
            user.setPassword(password);


            // Store information in request attribute, before forward.
            request.setAttribute("errorString", errorString);
            request.setAttribute("user", user);


            // Forward to login.jsp
            RequestDispatcher dispatcher= this.getServletContext().getRequestDispatcher("/MyJsps/login.jsp");
            dispatcher.forward(request, response);
        }

        // If no error
        // Store user information in Session
        // And redirect to userInfo page.
        else {
            HttpSession session = request.getSession();
            MyUtils.storeLoginedUser(session, user);

             // If user checked "Remember me".
            if(remember)  {
                MyUtils.storeUserCookie(response,user);
            }

            // Else delete cookie.
            else  {
                MyUtils.deleteUserCookie(response);
            }                       

            // Redirect to userInfo page.
            response.sendRedirect(request.getContextPath() + "/MyJsps/userInfoView.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

另一个问题: 以及我如何 运行 从主页而不是 login.jsp 登录 servlet class。 然后使用servlet 运行 login.jsp .

登录 servlet class :

import java.io.IOException;

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

@WebServlet(name = "login",urlPatterns = { "/login"})
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public LoginServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {


        // Forward to /loginView.jsp        
        RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/MyJsps/login.jsp");

        dispatcher.forward(request, response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

第一个问题:

<form method="POST" action="/doLogin" autocomplete="on">

将其更改为:

<form method="GET" action="${pageContext.request.contextPath}/doLogin" autocomplete="on">

第二个问题: 调用登录 servlet

<a href="${pageContext.request.contextPath}/login" target="_blank"><img src="<c:url value="/images/login1.png"/>"