如何在服务器发送响应之前使用servlet过滤器拦截页面请求,将jsessionid附加到响应URL

时间:2012-12-10 17:50:00

标签: jsp session tomcat servlet-filters jsessionid

我有一个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但我怎么能这样做?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果我正确地读它,我希望它无限循环。

!request.isSecure(),问“客户端是否使用https?”。由于重定向永远不会改变此特性,因此重定向也不会使用https并再次输入if-block。

我建议if语句应该检查是否在网址中没有设置jsessionid。