我目前正在使用servlet和JSP在J2EE中开发一个中级Web应用程序。它就像一个内容管理系统。我的网站根据我的需求工作非常相似,但在J2EE中使用 MVC 的最佳实践和不良实践有一些问题
用户登录应用的代码为:
<c:choose>
<c:when test="${not empty sessionScope.admin}">
<a href="/context/controller?action=add-content"> + Add a Content</a>
</c:when>
<c:otherwise>
<a href="/context/controller?action=log-in"> Admin Login</a>
</c:otherwise>
</c:choose>
控制器servlet中的Java代码是:
if (userDAO.isUser(request.getParameter("uname"), request.getParameter("upass"))) {
request.getSession().setAttribute("admin", request.getParameter("uname"));
request.getRequestDispatcher("/admin.jsp").forward(request, response);
} else {
request.getSession().setAttribute("admin", "");
request.getRequestDispatcher("/content.jsp").forward(request, response);
}
注销:
<a href="/context/controller?action=log-out">Logout</a>
控制器servlet中的Java代码是:
if (action != null && action.equals("log-out")) {
HttpSession session = request.getSession(false);
if(session != null){
session.invalidate();
}
request.getRequestDispatcher("index.jsp").forward(
request, response);
}
我想知道登录,注销和会话管理的逻辑是否正确?
我也无法阻止用户在注销后返回安全页面,我该如何设置?
答案 0 :(得分:0)
您可以使用此博客文章了解j2ee中的会话管理。
http://thisara.me/2015/12/21/session-management-in-j2ee/
为避免在签名后返回,您需要使用jsp上的session.invalidate()或HttpServlet上的request.getSession()。invalidate()使当前会话无效。
此外,您可以尝试添加NoCache过滤器,您需要在其中创建过滤器,并在web.xml上配置过滤器。
@WebFilter
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1
response.setHeader("Pragma", "no-cache"); // HTTP 1.0
response.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(req, res);
}
}