【问题标题】:Cannot access filter Servlet's session attribute from another normal Http Servlet无法从另一个普通的 Http Servlet 访问过滤器 Servlet 的会话属性
【发布时间】:2012-05-11 03:42:51
【问题描述】:

我这里有个问题:

在我使用过滤器 servlet 设置会话属性后,我尝试在另一个普通的 http servlet 中检索会话属性,但看起来 getAttribute('system.userinfo') 无法检索任何内容。这有什么问题?谢谢!

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpReq = (HttpServletRequest) request;
    HttpServletResponse httpResp = (HttpServletResponse) response;
    HttpSession session = httpReq.getSession();

    httpReq.setCharacterEncoding("UTF-8");

    UserDTO dto = new UserDTO();
    session.setAttribute("system.userinfo", dto);

    chain.doFilter(request, response);

}


public class FileUpload extends HttpServlet {
    @SuppressWarnings("unchecked")
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");

        // cannot get anything here
        UserDTO userinfo = (UserDTO)request.getSession(false).getAttribute("system.userinfo");


        }
}

两个 servlet 在同一个 Web 应用程序中。

【问题讨论】:

  • 你是如何测试它的?什么请求方法 - GET/POST?
  • 您确定链中的所有过滤器都没有清除会话吗?
  • 我也在使用另一个lister servlet。它可以检索属性。所以我不认为我会清除属性。

标签: java servlets


【解决方案1】:

似乎您没有在您认为在过滤器中创建的 servlet 中获得会话。在过滤器中,您使用的是始终创建新会话的 req.getSession()。在您提供 request.getSession(false) 的 servlet 中,如果不存在会话,则容器应该返回 null 或返回现有会话。您使用的是哪个 servlet 容器?如果您使用的是 IDE,您能否放置一个调试点并比较会话 ID 以确认它们是否相同?另外,您的 UserDTO 是否可序列化?

【讨论】:

  • 我弄明白了,我没有在 web.xml 中将正确的过滤器 url-pattern 设置为正确的 servlt 映射。所以过滤器不适用于 servlet。
  • @terry :发布您的答案并接受它。这是一个很好的做法。
  • 看来我无法回答我自己的问题
猜你喜欢
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 2017-08-08
相关资源
最近更新 更多