会话中缺少属性

时间:2019-10-20 17:49:26

标签: java jsp servlets

几天来,我一直在尝试解决小型servlet / jsp应用程序中的问题。

我有2个JSP文件,即index.jsp和adminPage.jsp。 第一个带有登录表单,邮件和密码,一个用于提交表单以登录servlet的按钮,以及一个重定向到adminPage servlet的按钮,如果登录操作成功,该按钮将调用adminpage.jsp。 登录操作效果很好,与过渡到adminPage servlet和转发到adminPage.jsp一样。

Thep问题是,当按下adminPage.jsp中的“提交”按钮,并从会话中删除会话的3个属性之一时,它提交登录servlet。因此,当它进入登录servlet时,该属性为null。 刚刚消失的属性是“ BackEndNames.ACCOUNT”。我不会在adminPage servlet中将其删除。

Servlets

//login
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Account account;
        UserDetails userDetails;
        HttpSession httpSession = request.getSession();
        LOG.debug("httpSession ID: " + httpSession.getId());
        LOG.debug("is httpSession new: " + httpSession.isNew());
        Enumeration<String> sessionEnum = httpSession.getAttributeNames();
        while(sessionEnum.hasMoreElements()){
            LOG.debug("SESSION PARAM NAME: " + sessionEnum.nextElement());
        }
        try{
            if(httpSession.getAttribute(BackEndNames.ACCOUNT) == null){
                LOG.debug("ACCOUNT FROM SESSION: " + httpSession.getAttribute(BackEndNames.ACCOUNT));
                account = login(request);
                // put account and login state on the session
                httpSession.setAttribute(BackEndNames.ACCOUNT, account);
                LOG.debug("ACCOUNT SET ON SESSION: " + httpSession.getAttribute(BackEndNames.ACCOUNT));
            }else{
                account = (Account)httpSession.getAttribute(BackEndNames.ACCOUNT);
            }

            if(httpSession.getAttribute(BackEndNames.USER_DETAILS) == null){
                userDetails = getUserDetailsForAccount(account);
                httpSession.setAttribute(BackEndNames.USER_DETAILS, userDetails);
            }else {
                userDetails = (UserDetails)httpSession.getAttribute(BackEndNames.USER_DETAILS);
            }

            request.setAttribute(BackEndNames.LOGIN_STATUS, true);
            httpSession.setAttribute(BackEndNames.LOGIN_STATUS, true);

            LOG.debug("LOGIN SUCCESSFULY");

            // set account and the login state for the jsp
            request.setAttribute(BackEndNames.ACCOUNT, account);
            request.setAttribute(BackEndNames.USER_DETAILS, userDetails);

            //redirect to index.jsp with the above data
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/index.jsp");
            dispatcher.forward(request, response);
        }catch (Exception e){
            LOG.debug("EXCEPTION !!! " + e.getMessage() );
            e.printStackTrace();
            request.setAttribute(BackEndNames.LOGIN_STATUS, false);
            httpSession.setAttribute(BackEndNames.LOGIN_STATUS, false);
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/index.jsp");
            dispatcher.forward(request, response);
        }
    }
//adminPage
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession httpSession = request.getSession();
        LOG.debug("httpSession ID: " + httpSession.getId());
        Enumeration<String> sessionEnum = httpSession.getAttributeNames();
        while(sessionEnum.hasMoreElements()){
            LOG.debug("SESSION PARAM NAME: " + sessionEnum.nextElement());
        }
        Account adminUser = (Account) httpSession.getAttribute(BackEndNames.ACCOUNT);
        UserDetails userDetails = (UserDetails) httpSession.getAttribute(BackEndNames.USER_DETAILS);
        LOG.debug("adminUser: " + adminUser.toString());
        LOG.debug("user details for account " + adminUser.getMail() + " are " + userDetails.toString());
        request.setAttribute(BackEndNames.USER_DETAILS, userDetails);
        RequestDispatcher requestDispatcher = getServletContext().getRequestDispatcher("/adminPage.jsp");
        requestDispatcher.forward(request, response);
    }

JSP页面

//index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<%--java class imports--%>
<%@page import="constantNames.JspFieldsName"%>

<html>
  <head>
    <title>Login Action</title>
  </head>
  <body>
    <c:set var="account" value="${requestScope.account}" />
    <c:set var="userDetails" value="${requestScope.userDetails}"/>
    <c:set var="loginStatuts" value="${requestScope.loginStatus}"/>
    <c:set var="registrationStatus" value="${requestScope.registrationStatus}"/>

    <c:choose>
      <c:when test="${loginStatuts}">
        <form name="logout" method="post" action="${pageContext.request.contextPath}/logout">
          <p>
            Welcome ${fn:toUpperCase(userDetails.name)} <br/>
            <input type="hidden" value="out" name="logOut">
            <button type="submit">LOG OUT</button>
          </p>
        </form>
        <form name="adminPage" method="post" action="${pageContext.request.contextPath}/adminPage">
          <button type="submit">TO ADMIN PAGE</button>
        </form>
      </c:when>
      <c:otherwise>
        <p><c:out value="${JspFieldsName.LOGIN_TEXT_FIELD}"/></p>
        <form name="login" method="post" action="${pageContext.request.contextPath}/login">
          <input type="text" name="${JspFieldsName.LOGIN_TEXT_FIELD}"/>
          <input type="password" name="${JspFieldsName.LOGIN_PASSWORD_FIELD}"/>
          <input type="checkbox" name="saveLogin" value="Save login"/>
          <button type="submit">LOG IN</button>
        </form>
        <form name="register" method="post" action="registerAction.jsp">
          <input type="submit" value="Make new Accout"/>
        </form>
            <c:if test="${registrationStatus}">
              <p>Successful</p>
            </c:if>
      </c:otherwise>
    </c:choose>
  </body>
</html>
//adminPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<html>
<head>
    <title>Title</title>
</head>
<body style="background-color: black">
    <c:set var="account" value="${requestScope.account}" />
    <c:set var="userDetails" value="${requestScope.userDetails}"/>
    <p style="align-content: center; color: orangered">
        WELCOME HOME ${userDetails.name} !!
    </p>
<form name="back" method="post" action="${pageContext.request.contextPath}/login">
    <input type="submit" value="Back">
</form>
</body>
</html>

这是InteliJ Tomcat日志的一部分:

新登录

    [DEBUG] 2019-10-20 20:37:49.088 [http-nio-8080-exec-3] LogIn - httpSession ID: 6FE16EE7F3D96154753F50A9A5AC3551
    [DEBUG] 2019-10-20 20:37:49.096 [http-nio-8080-exec-3] LogIn - is httpSession new: false
    [DEBUG] 2019-10-20 20:37:49.097 [http-nio-8080-exec-3] LogIn - ACCOUNT FROM SESSION: null

从索引jsp到adminPage servlet

    [DEBUG] 2019-10-20 20:37:58.074 [http-nio-8080-exec-4] AdminPage - httpSession ID: 6FE16EE7F3D96154753F50A9A5AC3551
    [DEBUG] 2019-10-20 20:37:58.074 [http-nio-8080-exec-4] AdminPage - SESSION PARAM NAME: loginStatus
    [DEBUG] 2019-10-20 20:37:58.074 [http-nio-8080-exec-4] AdminPage - SESSION PARAM NAME: userDetails
    [DEBUG] 2019-10-20 20:37:58.074 [http-nio-8080-exec-4] AdminPage - SESSION PARAM NAME: account

从adminPage jsp到登录servlet

    [DEBUG] 2019-10-20 20:37:58.806 [http-nio-8080-exec-5] LogIn - httpSession ID: 6FE16EE7F3D96154753F50A9A5AC3551
    [DEBUG] 2019-10-20 20:37:58.806 [http-nio-8080-exec-5] LogIn - is httpSession new: false
    [DEBUG] 2019-10-20 20:37:58.806 [http-nio-8080-exec-5] LogIn - SESSION PARAM NAME: loginStatus
    [DEBUG] 2019-10-20 20:37:58.806 [http-nio-8080-exec-5] LogIn - SESSION PARAM NAME: userDetails
    [DEBUG] 2019-10-20 20:37:58.806 [http-nio-8080-exec-5] LogIn - ACCOUNT FROM SESSION: null

可能是什么问题,以及如何解决?我没有想法。

0 个答案:

没有答案
相关问题