Jsp 如何筛选未经验证的用户并在不启动会话的情况下显示登录表单?
我的情况是:Jsp 如何筛选未经验证的用户并在不启动会话的情况下显示登录表单?,jsp,servlets,servlet-filters,Jsp,Servlets,Servlet Filters,我的情况是: 我有一个servlet,未经认证的用户不应该访问它。这个servlet执行一些业务逻辑,并通过RequestDispatcher::forward()将一些中间数据传递给jspsecret.jsp。(secret.jsp只是一个例子,将有许多servlet和/或jsp) 还有一个登录jsplogin.jsp servlet前面有一个过滤器,它应该重定向到login.jsp来自未经验证用户的所有请求。基本上,doFilter()看起来像: HttpServletRequest req
RequestDispatcher::forward()
将一些中间数据传递给jspsecret.jsp
。(secret.jsp
只是一个例子,将有许多servlet和/或jsp)login.jsp
login.jsp
来自未经验证用户的所有请求。基本上,doFilter()
看起来像:
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
if(-1 == req.getRequestURI().indexOf("login.jsp")) {//if page which is not whitelisted
HttpSession session = req.getSession(false);
if(null == session) {
RequestDispatcher rd = req.getServletContext().getRequestDispatcher("/login.jsp");
rd.forward(request, response);
}
else {
//not whitelisted but already logged in...
log("we are logged in");
}
}
chain.doFilter(request, response);
位置
标题来重定向,而是在内部执行
附录
secret.jsp
:
<%@page contentType="text/html" pageEncoding="UTF-8" import="java.util.*"%>
<%@taglib prefix="tags" uri="/WEB-INF/tlds/tag_library.tld" %>
<tags:wrapper title="hello world">
hello ${requestScope.msg}
</tags:wrapper>
servlet中的forward使过滤器被触发2*2=4次(两次,因为它在请求传入和响应传递时来回移动)。我希望它只被触发一次(当初始请求到来时)——或者至少只触发两次
您忘记在转发后返回,这导致您的筛选器仍然继续请求/响应链
rd.forward(request, response);
return;
调用任意Java方法肯定不会突然终止当前正在运行的方法块并跳出它(当然除了System\exit()
或者当它抛出异常时,但这是另外一回事)
会话已启动。我不想启动会话,直到用户实际上尚未成功通过身份验证(即,将JSESSIONID cookie发送到客户端) 这是由过滤器以外的其他地方引起的,很可能是由JSP引起的。将以下内容添加到JSP顶部,以显式禁用JSP创建隐式会话:
<%@page session="false" %>
如有必要,创建一个
HttpSessionListener
,并在sessionCreated()
方法上设置一个断点,以确定真正的根本原因。按照建议操作,在访问“TheServlet”后,我仍然会在登录表单中获得一个JSSessionID
。为什么jsp未经我同意就启动会话?我想自己控制它。@Flavius你不想开会有什么特别的原因吗?有一个没有(或非常,非常小)伤害。一般来说,检查会话中是否存在已知的会话属性比完全避免会话更容易。JSP会创建会话,除非您显式地将它们配置为不创建会话。在我看来,没有经过身份验证的用户的会话并不合适。从语义上讲。此外,这是一个毫无意义的会话,它只会污染服务器。除此之外,答案是否有助于解决问题?如果仍然不能解决问题,请告诉我。
<%@page session="false" %>