Обновление данных при выходе из системы в веб-приложении Java EE - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть веб-приложение, созданное с использованием jsp / servlets. Сеанс веб-приложения настроен на тайм-аут после, скажем, 5 минут бездействия пользователя, установленного в web.xml.

Теперь я хочу обновитьнекоторые детали незадолго до истечения времени ожидания этого сеанса относятся к пользователю, у которого истекает время ожидания сеанса.

Допустим, пользователь вошел в систему и время, которое пользователь выбирает, чтобы оставаться неактивным в этой ситуации, мне нужно обновить некоторую информациюдля пользователя, время сеанса которого истекло.

Как мне добиться того же.

package com.student.track;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSessionListener; 

public class sessionInfo implements HttpSessionListener {


    public void sessionCreated(HttpSessionEvent event) { 

    } 
    public void sessionDestroyed(HttpSessionEvent event) { 

        String query = "insert into SessionInfo values(?)";
        try
        {
        runQuery(query);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    } 

    public static void runQuery(String query)  throws Exception

    {
        Connection conn=null;
        int result=0;
        try
        {
            conn = getConnection();
            PreparedStatement stat=null;
            stat = conn.prepareStatement(query); 
            stat.setString(1,"first");
            result = stat.executeUpdate(query);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        catch(SQLException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try 
            {
                conn.close();
            } 
            catch (SQLException e) 
            {
                throw e;
            }
        }

    }

    public static Connection getConnection() throws SQLException, IOException, Exception
    {
        Properties props = new Properties();
        FileInputStream in = new FileInputStream("database.properties");
        props.load(in);
        in.close();

        String drivers = props.getProperty("dbcb.jdbcDriver");
        try
        {
            Class.forName(drivers);
        }
        catch(Exception e)
        {
            throw e;
        }

        if (drivers != null)
            System.setProperty("jdbc.drivers", drivers);

            String url = props.getProperty("dbcb.jdbcURL");
            String username = props.getProperty("dbcb.dbUser");
            String password = props.getProperty("dbcb.dbPassword");
            return DriverManager.getConnection(url, username, password);
    }


    }

И web.xml

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
    <servlet>
    <servlet-name>InitServlet</servlet-name>
    <servlet-class>com.student.track.InitServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
    <servlet-mapping>
    <servlet-name>InitServlet</servlet-name>
    <url-pattern>/InitServlet</url-pattern>
  </servlet-mapping>
  <taglib>
    <taglib-uri>/orataglib</taglib-uri>
    <taglib-location>tlds/orataglib_1_0_2.tld</taglib-location>
  </taglib>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <resource-ref>
 <description>Sybase Datasource example</description>
 <res-ref-name>jdbc/mysybase</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

<listener> 
<description>sessionListener</description> 
<listener-class> com.student.track.sessionInfo </listener-class> 
</listener>  
</web-app>

1 Ответ

2 голосов
/ 20 февраля 2012

Довольно просто, реализовать HttpSessionListener . Контейнер сработает sessionDestroyed(), если решит удалить сеанс из своего кэша.

Пример:

@WebListener /* or reister it in web.xml */
public final class MySessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(final HttpSessionEvent se) { }

    @Override
    public void sessionDestroyed(final HttpSessionEvent se) {

        // obtain HTTP session
        HttpSession session = se.getSession();

        /* as you cannot retrieve the user ID from the
         * HTTP session, getRemoteUser() is not available, you must
         * read the user ID from a custom parameter
         */
        String user = (String) session.getAttribute("myCustomAttribute");

        // work with it

    }

}

Обновление. Чтобы указать прослушиватель в web.xml, добавьте следующие теги в web.xml:

<listener>
  <listener-class>com.test.MySessionListener</listener-class>
</listener>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...