我有一个接受用户名并将其传递给 LoginServlet.java
的表单,后者依次:
- 如果没有 session :为该用户名创建一个 session 并将请求转发到
LoginResultView.jsp
,后者显示“成功登录,%username%”消息 - 如果已经有 session ,打印出“wow...”并使旧 session 无效:
表单:
<form method="POST" action="LoginResult.do">
<div>
<label id="username-label" for="usr">username:</label><br/><br/>
<input type="text"
value="Enter a username"
class="form-control form-input-field form- username-input-field default"
id = "form-username-input-field" name="login-username"
>
</div>
<button class="btn btn-success" type="submit">Sign up</button>
</form>
小服务程序:
public class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
IOException, ServletException {
String username = request.getParameter("login-username");
response.setContentType("text/html");
HttpSession session = request.getSession(false);
if (session==null) {
session = request.getSession(true);
session.setAttribute("loginUsername", username);
RequestDispatcher view= request.getRequestDispatcher("view/LoginResultView.jsp");
view.forward(request, response);
}
else {
response.getWriter().println(
"wow, how are you here, " +
session.getAttribute("loginUsername"));
response.getWriter().println(
session.getMaxInactiveInterval());
session.invalidate();
}
}
}
我还有一个导航栏,如果没有 session ,它会显示两个按钮:登录和注册,如果有 session ,它会显示与该 session 关联的 loginUsername
属性:
<% HttpSession session2 = request.getSession(false);
if (session.getAttribute("loginUsername") != null) {
%>
<div class="dropdown navbar-link">
<button class="btn btn-secondary dropdown-toggle"
type="button" id="dropdownMenuButton"
data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<a href="${pageContext.request.contextPath}/Login.jsp">
<%out.println(session2.getAttribute("loginUsername"));%>
</a>
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a class="dropdown-item"
href="${pageContext.request.contextPath}">Profile</a>
<a class="dropdown-item"
href="#">Link2</a>
<a class="dropdown-item"
href="${pageContext.request.contextPath}/LogoutResult.do">
Log out
</a>
</div>
</div>
<%
}
else {
%>
<a href="${pageContext.request.contextPath}/Login.jsp"
class="btn btn-info" role="button">Log in
</a>
<a href="${pageContext.request.contextPath}/Login.jsp"
class="btn btn-info" role="button">Sign up
</a>
<%
}
%>
问题是这样的:当我填写表单并将其发送到 LoginServlet
时,即使看似没有 session (它是那里的两个登录和注册按钮),我仍然会收到一条消息wow, how are you here, null 120
(120 是 session-timeout
,在 web.xml 文件中指定)。然后,我只能通过再次发送相同的 POST 数据来发送表单数据(我单击圆形的“更新”按钮并单击“确定”以保存以前的数据)。只有在那之后,我才能获得 LogoutResultView.jsp
页面。
为什么会这样?此 null
session 从何而来?我该如何解决?
最佳答案
您获得的 session 不为空。否则你会得到一个 NPE。
你需要把session="false"
属性进入 <%@page%>
Navbar JSP 的指令。否则,将在首次访问 JSP 时立即生成 session 。
例如:`
<%@ page language="java" contentType="text/html; charset="ISO-8859-1"
pageEncoding="ISO-8859-1" session="false"
import="java.util.*" %>`
session
属性默认为 true,因此如果您没有明确指定,如果 session 不存在,将始终在后台创建一个 session 。
所以,if (session.getAttribute("loginUsername") != null)
不会像通常那样生成 NPE。
如果你输入 session="false"
进入你的页面指令,检查必须是if ( session == null )
.这就是你想要的。
关于Java servlet, session : null session gets created, 无法使其失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54369422/