Ad

Vaadin 8 Set Session Timeout

- 1 answer

How to set timeout of a session in Vaadin 8?

I am not using web.xml, which has been the place to set it in prior versions of the framework.

Ad

Answer

tl;dr

You can set the standard Servlet session’s timeout as a int number of whole seconds, after extracting from the wrapping VaadinSession.

VaadinSession.getCurrent().getSession().setMaxInactiveInterval ( ( int ) TimeUnit.MINUTES.toSeconds( 30 ) ) ;

Set session timeout programmatically

Setting the session timeout is a feature in your web container, your Servlet engine, such as Tomcat, Jetty, etc. The Servlet spec defines this behavior for Java apps as part of its session handling.

Vaadin wraps the Servlet session inside a VaadinSession. So extract the regular Servlet session from Vaadin as a WrappedSession, then call the setMaxInactiveInterval method to set the time to expire.

Specify the time limit as a number of whole seconds. The TimeUnit enum is handy to calculate the seconds without resorting to “magic” numbers.

VaadinSession               // Wraps a standard Servlet session.
.getCurrent()               // Access the current user’s session.
.getSession()               // Access the wrapped standard Servlet session.
.setMaxInactiveInterval(    // Set the timeout.
    ( int )                 // Cast a `long` to an `int`.
    TimeUnit                // The `TimeUnit` enum is more self-documenting than using a literal integer number.
    .MINUTES                // Here we set a half hour, 30 minutes.
    .toSeconds( 30 )        // Set a number of whole seconds.      
)
;

Here is a complete example Vaadin 8.5 app created from the Maven archetype vaadin-archetype-application. We added a single line to the beginning of the init method.

package com.basilbourque.example;

import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.server.VaadinSession;
import com.vaadin.ui.Button;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

import java.util.concurrent.TimeUnit;

/**
 * This UI is the application entry point. A UI may either represent a browser window
 * (or tab) or some part of an HTML page where a Vaadin application is embedded.
 * <p>
 * The UI is initialized using {@link #init(VaadinRequest)}. This method is intended to be
 * overridden to add component to the user interface and initialize non-component functionality.
 */
@Theme ( "mytheme" )
public class MyUI extends UI {

    @Override
    protected void init ( VaadinRequest vaadinRequest ) {
        // Set Session timeout programmatically. Overrides the default timeout configured for Servlet.
        VaadinSession.getCurrent().getSession().setMaxInactiveInterval( ( int ) TimeUnit.MINUTES.toSeconds( 45 ) );  // Setting timeout of 45 minutes = ( 45 * 60 ) seconds.

        final VerticalLayout layout = new VerticalLayout();

        final TextField name = new TextField();
        name.setCaption( "Type your name here:" );

        Button button = new Button( "Click Me" );
        button.addClickListener( e -> {
            layout.addComponent( new Label( "Thanks " + name.getValue()
                                                + ", it works!" ) );
        } );

        layout.addComponents( name , button );

        setContent( layout );
    }

    @WebServlet ( urlPatterns = "/*",
        name = "MyUIServlet",
        asyncSupported = true )
    @VaadinServletConfiguration ( ui = MyUI.class,
        productionMode = false )
    public static class MyUIServlet extends VaadinServlet {
    }
}

Servlet, not Vaadin

I am not using web.xml, which has been the place to set it in prior versions of the framework.

Actually, the session timeout is a Servlet thing, not a Vaadin-specific thing. And the web.xml is a Servlet thing, not a Vaadin-specific thing.

See:

Further discussed in How to set session timeout dynamically in Java web applications?.

Ad
source: stackoverflow.com
Ad