0

我有一个 servlet 过滤器,它接受 jsessionid 并将其附加到响应中。但是,它无法正常工作,因为应用程序陷入了无限循环。代码看起来是正确的,但是 Tomcat 如何处理请求和响应是混淆的地方。

下面是 doFilter 方法(destroy 和 init 为空):

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) {

        HttpServletRequest rQ = ((HttpServletRequest)request);
        HttpServletResponse rS = ((HttpServletResponse)response);

        if ((!request.isSecure())) {

            String uRL = rS.getRequestURL().toString();
            String qS = (rS.getQueryString() == null) ? "" : rS.getQueryString();
            String sID = rS.getSession().getId();
            String redirectURL = uRL + ";jsessionid=" + sID + qS;

            rS.sendRedirect(redirectURL);
        }
        else {

            chain.doFilter(request, response);
        }
    }
}

我已将过滤器应用于所有 JSP 页面。我看到发生的是一个 http JSP 页面被调用——我们称之为 Content.jsp——servlet 获取这个页面并附加 jsessionid。然后,再次调用 Content.jsp,因为我应用了调用所有 JSP 页面的规则,并且它不断重定向。

要么我必须更改我的代码,要么以某种方式在 servlet 访问页面之前拦截它。我该如何解决这个问题?也许,我可以检查 jsessionid 是否附加到 URL 但我怎么能这样做???

谢谢你。

4

1 回答 1

0

如果我没看错,我希望它会无限循环。

!request.isSecure(),正在询问“客户端是否使用了 https?”。由于重定向永远不会改变这个特性,重定向也不会使用 https 并再次进入那个 if-block。

我建议 if 语句应该检查 jsessionid 是否未在 url 中设置。

于 2012-12-10T18:11:55.423 回答