访问JAVA类中的会话属性

访问JAVA类中的会话属性,java,session,servlets,filter,attributes,Java,Session,Servlets,Filter,Attributes,我正在尝试获取java类中的会话属性。我看到了这篇帖子:。。。我试着按照Matej tymes的建议去做。我编写了一个RequestFilter并尝试获取请求和会话对象。从那里我尝试获取session属性。但我得到了一个空对象。请在下面找到我的代码: Front Controller Servlet: public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException,

我正在尝试获取java类中的会话属性。我看到了这篇帖子:。。。我试着按照Matej tymes的建议去做。我编写了一个RequestFilter并尝试获取请求和会话对象。从那里我尝试获取session属性。但我得到了一个空对象。请在下面找到我的代码:

    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过滤器实现类RequestFilter
*/
@WebFilter(“/RequestFilter”)
公共类RequestFilter实现过滤器{
private static ThreadLocal localRequest=new ThreadLocal();
/**
*默认构造函数。
*/
公共请求过滤器(){
//TODO自动生成的构造函数存根
}
/**
*@see Filter#destroy()
*/
公共空间销毁(){
//TODO自动生成的方法存根
}
公共静态HttpServletRequest getRequest(){
System.out.println(“获取请求!!!”;
返回localRequest.get();
}
公共静态HttpSession getSession(){
System.out.println(“获取会话!!!”;
HttpServletRequest=localRequest.get();
return(request!=null)?request.getSession():null;
}
/**
*@see Filter#doFilter(ServletRequest、ServletResponse、FilterChain)
*/
public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)抛出IOException、ServletException{
//TODO自动生成的方法存根
//把你的代码放在这里
//沿着过滤器链传递请求
链式过滤器(请求、响应);
if(HttpServletRequest的请求实例){
set((HttpServletRequest)请求);
}
试一试{
链式过滤器(请求、响应);
}
最后{
localRequest.remove();
}
}
/**
*@see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig)抛出ServletException{
//TODO自动生成的方法存根
}

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

  • @WebFilter(“/RequestFilter”)
    注释对我来说没有意义。它的设置方式必须能够命中对ThreadLocal值感兴趣的所有传入请求,例如,
    “/*”

  • 您将请求传递给链两次。必须首先设置
    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();
        }
    }
    
    public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)抛出IOException、ServletException{
    //沿着过滤器链传递请求
    
    chain.doFilter(请求,响应);我删除了第一个chain.doFilter()调用。然后从我的java类中调用:HttpSession session=RequestFilter.getSession();HttpServletRequest req=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(“检索到的用户:+user”);}
    session.getAttribute(“loggedUser”)出现空指针异常,这是否意味着该会话不存在?还是我在创建会话和设置属性时做错了什么?
    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();
        }
    }