在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>
答案 0 :(得分:1)
至少,您可以编写自己的自定义Servlet过滤器。每次发出请求时都会调用它,而不必执行任何操作。
此外,您可能希望查看容器级安全性甚至是Spring Security等内容。两者都为你处理。
编辑:
没问题。
与此同时,您可能希望在auth.jsp
中执行类似的操作<%
if (user == null){
response.sendRedirect(redirectURL);
}
%>
有点像
response.addHeader("location", "/login.jsp");
这有点像你习惯使用PHP。
答案 1 :(得分:1)
servlet filter肯定是您正在寻找的。您也可以抓住container managed或spring 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>
之前,依此类推。只要未提交响应,您就可以使用转发或重定向更改其目标。