【问题标题】:Accessing a session attribute in a JAVA Class访问 JAVA 类中的会话属性
【发布时间】:2013-07-03 11:15:27
【问题描述】:

我正在尝试获取 java 类中的会话属性。我遇到了这个帖子:get HttpSession|Request from simple java class not servlet class... 我试着按照 Matej tymes 的建议去做。我写了一个 RequestFilter 并试图获取请求和会话对象。从那里我试图获取会话属性。但我得到一个空对象。请在下面找到我的代码:

    Front Controller Servlet:
public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException{
    PrintWriter out=response.getWriter();
    response.setContentType("text/html");
    String userName=request.getParameter("userName");
    String pass=request.getParameter("userPassWord");
    String clientId = request.getParameter("client");

    try {

        Class.forName("com.mysql.jdbc.Driver");

        connection =
         DriverManager.getConnection("jdbc:mysql://localhost:3306/ABC", "xyz", "*****");

        String queryString = "SELECT * FROM userInfo WHERE UserName=?";

        //connection =ConnectionFactory.getInstance().getConnection();
        ptmt = connection.prepareStatement(queryString);
        ptmt.setString(1, userName);
        resultSet = ptmt.executeQuery();
        //Creating Servlet Context object
        if(resultSet.next() && pass.equalsIgnoreCase(resultSet.getString("UserPass")))
        {
            HttpSession session=request.getSession(true);
            session.setAttribute("loggedUser", userName);
            session.setAttribute("clientId", clientId);

            ServletContext context=getServletContext(); 
            RequestDispatcher dispatcher=context.getRequestDispatcher("/tabmenu.html");
            dispatcher.forward(request, response);

        }else{
            request.setAttribute("wrongUser",userName);

            ServletContext context=getServletContext(); 
            RequestDispatcher dispatcher=context.getRequestDispatcher("/fail");
            dispatcher.forward(request, response);

        }

    } catch (SQLException e) {
        e.printStackTrace();
    }catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    }

/**   
 * Servlet Filter implementation class RequestFilter
 */
@WebFilter("/RequestFilter")
public class RequestFilter implements Filter {
private static ThreadLocal<HttpServletRequest> localRequest = new ThreadLocal<HttpServletRequest>();

/**
 * Default constructor. 
 */
public RequestFilter() {
    // TODO Auto-generated constructor stub
}

/**
 * @see Filter#destroy()
 */
public void destroy() {
    // TODO Auto-generated method stub
}

public static HttpServletRequest getRequest() {
    System.out.println("Fetching the Request!!!");
    return localRequest.get();
}

public static HttpSession getSession() {
    System.out.println("Fetching the Session!!!");
    HttpServletRequest request = localRequest.get();
    return (request != null) ? request.getSession() : null;
}

/**
 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
 */
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // TODO Auto-generated method stub
    // place your code here

    // pass the request along the filter chain
    chain.doFilter(request, response);

    if (request instanceof HttpServletRequest) {
        localRequest.set((HttpServletRequest) request);
    }

    try {
        chain.doFilter(request, response);
    }
    finally {
        localRequest.remove();
    }
}


/**
 * @see Filter#init(FilterConfig)
 */
public void init(FilterConfig fConfig) throws ServletException {
    // TODO Auto-generated method stub
}

}

【问题讨论】:

    标签: java session servlets filter attributes


    【解决方案1】:

    您的代码中至少有 2 个问题:

    1. @WebFilter("/RequestFilter") 注释对我来说没有意义。它必须设置为命中所有对 ThreadLocal 值感兴趣的传入请求,例如"/*".

    2. 您将请求两次传递给链。必须先设置ThreadLocal值,然后转发到链上,最后去掉ThreadLocal值。只需删除第一个 chain.doFilter(...) 调用即可。

      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      
          // pass the request along the filter chain
          chain.doFilter(request, response); <-------------------- PROBLEM
      
          if (request instanceof HttpServletRequest) {
              localRequest.set((HttpServletRequest) request);
          }
      
          try {
              chain.doFilter(request, response);
          } finally {
              localRequest.remove();
          }
      }
      

    【讨论】:

    • 我已经删除了第一个 chain.doFilter() 调用。然后从我的 java 类中调用: HttpSession session = RequestFilter.getSession(); HttpServletRequest 请求 = RequestFilter.getRequest(); String user = (String) session.getAttribute("loggedUser");但我仍然收到一个空错误。
    • 我只使用来自 java 类的请求过滤器来检索会话属性。那么注释会有什么不同吗?我只是调用请求过滤器来获取会话和请求对象。
    • 你的 servlet 的路径是什么?请使用静态过滤器方法显示类...
    • 这里是访问过滤器的java类:public static void FetchSessionAttributes(){ HttpSession session = RequestFilter.getSession(); HttpServletRequest req = RequestFilter.getRequest(); String user = (String) session.getAttribute("loggedUser"); System.out.println("Retrieved User: "+user); }
    • 我得到一个空指针异常 session.getAttribute("loggedUser");这是否意味着会话不存在?还是我在创建会话和设置属性时做错了什么?
    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2017-05-11
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多