php的JSP中的Header等价物

时间:2010-07-29 15:29:38

标签: php jsp header authentication jspinclude

在php中我曾经通过检查会话中的成员ID来验证用户是否已登录,如果设置为ok,则页面将通过Header重定向到登录页面。这个auth脚本在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>

2 个答案:

答案 0 :(得分:1)

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

此外,您可能希望查看容器级安全性甚至是Spring Security等内容。两者都为你处理。

编辑:

没问题。

与此同时,您可能希望在auth.jsp

中执行类似的操作
<%
  if (user == null){
    response.sendRedirect(redirectURL);
  }
%>

有点像

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

这有点像你习惯使用PHP。

答案 1 :(得分:1)

servlet filter肯定是您正在寻找的。您也可以抓住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>之前,依此类推。只要未提交响应,您就可以使用转发或重定向更改其目标。