2

在 php 中,我曾经通过检查会话中的成员 ID 来验证用户是否登录,如果设置正确,则页面将通过 Header 重定向到登录页面。这个身份验证脚本在 auth.php 中,我曾经将它包含在任何需要登录的页面中。简单的。但是我不能在 jsp 中做同样的事情。因为无论 auth.jsp 做什么,包含 auth.jsp 的页面的其余部分都会被加载。auth.jsp 是

<%
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if (user == null) {
%>
<jsp:forward page="/index"/>
<%
return; 
}
%>

如果用户没有登录,他仍然可以在登录页面下方看到原始页面。因此,我必须在每个页面上手动包含用户使用 if else 检查,非常不方便。有什么解决办法??包含页面是

<jsp:include page="auth.jsp" />
<p>Welcome</p>
4

2 回答 2

1

至少,您可以编写自己的自定义 Servlet 过滤器。每次发出请求时都会调用它,而您无需执行任何操作。

此外,您可能想研究容器级别的安全性,甚至是 Spring Security。两者都为您处理。

编辑:

没问题。

同时,您可能想在 auth.jsp 中执行类似的操作

<%
  if (user == null){
    response.sendRedirect(redirectURL);
  }
%>

这有点像

response.addHeader("location", "/login.jsp");

这有点像您习惯使用 PHP 的方式。

于 2010-07-29T15:33:39.030 回答
1

servlet 过滤器绝对是您正在寻找的。您也可以使用container managedspring security,但是根据您的知识,这些步骤可能太远了,无法正确掌握。

这是一个基本示例doFilter(),您的过滤器方法应如下所示:

if (UserServiceFactory.getUserService().getCurrentUser() != null) {
    chain.doFilter(request, response); // User is logged in, just continue request.
} else {
    ((HttpServletResponse) response).sendRedirect("/login.jsp"); // Not logged in, show login page. You can eventually show the error page instead.
}

web.xml将此过滤器映射到url-pattern您要验证的页面上。例如/secured/*,,/private/*/authenticated/*,并将所有 JSP(除了登录页面!)放在同一个文件夹中。


至于为什么它在 JSP 中失败:当响应已经提交时可能会发生这种情况。如果您已经阅读了服务器日志,您应该已经看到了被调用IllegalStateException: Response already committed的点。<jsp:forward>这在 PHP 中有效可能是因为它具有更大的响应缓冲区,或者因为巧合地在响应主体的任何部分之前正确调用了该逻辑,因此就在之前<!DOCTYPE>等等。只要响应未提交,您就可以使用转发或重定向更改其目的地。

于 2010-07-29T16:45:57.860 回答