В течение нескольких дней я пытаюсь решить проблему в крошечном приложении сервлет / jsp.
У меня есть 2 файла JSP, index.jsp и adminPage.jsp. Сначала один с формой входа, почтой и паролем, кнопкой для отправки формы сервлету входа и кнопкой, которая перенаправляет сервлет adminPage, который вызывает adminpage.jsp, если действие входа успешно. Действие входа работает хорошо, то же самое для перехода к сервлету adminPage и пересылки к adminPage.jsp.
Проблема pp заключается в том, что при нажатии кнопки отправки из adminPage.jsp она передается сервлету входа в один из 3 атрибутов. из сессии удаляется из нее. Поэтому, когда он входит в сервлет входа в систему, этот атрибут имеет значение nullАтрибут, который просто исчезает, это "BackEndNames.ACCOUNT". Я не удаляю его в сервлете adminPage.
Сервлеты
//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 Pages
//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
[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
Из администратора jP администратора в сервлет входа
[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
В чем может быть проблема и как ее исправить? У меня кончились идеи.