Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp 如何筛选未经验证的用户并在不启动会话的情况下显示登录表单?_Jsp_Servlets_Servlet Filters - Fatal编程技术网

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

我的情况是:

  • 我有一个servlet,未经认证的用户不应该访问它。这个servlet执行一些业务逻辑,并通过
    RequestDispatcher::forward()
    将一些中间数据传递给jsp
    secret.jsp
    。(
    secret.jsp
    只是一个例子,将有许多servlet和/或jsp)

  • 还有一个登录jsp
    login.jsp

  • servlet前面有一个过滤器,它应该重定向到
    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);
    
  • 问题是

  • servlet中的forward使过滤器被触发2*2=4次(两次,因为它在请求传入和响应传递时来回移动)。我希望它只被触发一次(当初始请求到来时)——或者至少只触发两次

  • 会话已启动。我不想启动会话,直到用户实际上尚未成功通过身份验证(即,将JSESSIONID cookie发送到客户端)

  • 解决这些问题最优雅的方法是什么

    我不想通过向浏览器发送
    位置
    标题来重定向,而是在内部执行

    附录

    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" %>