5

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.

Basil Bourque
  • 303,325
  • 100
  • 852
  • 1,154
Stimpson Cat
  • 1,444
  • 19
  • 44

2 Answers2

3

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?.

Basil Bourque
  • 303,325
  • 100
  • 852
  • 1,154
  • Thanks. I think 30 is still a magic number in your example, better use a constant SESSION_TIMEOUT_HALF_HOUR or anything like it. But nevertheless thanks! – Stimpson Cat Nov 21 '18 at 10:53
2

Session timeout is set in web.xml.

If you don't have one, then you will need to create one.

How do i set session timeout in seconds in web.xml?

As you seem to use spring boot, then this might apply to you

Spring Boot Java Config Set Session Timeout

André Schild
  • 4,592
  • 5
  • 28
  • 42
  • Where should this file be located? I am using spring boot – Stimpson Cat Feb 12 '18 at 08:25
  • @StimpsonCat Alternatively, you can programmatically set it by calling `VaadinSession.getCurrent().getSession().setMaxInactiveInterval(numberOfSeconds);` in your `init` method for example. – Morfic Feb 12 '18 at 09:43
  • While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. - [From Review](/review/low-quality-posts/18821037) – grizzthedj Feb 14 '18 at 14:07
  • @grizzthedj Agree for external links, but these are also stackoverflow posts. If the user had a more clear question, I could have marked it as duplicate of the spring boot stuff. – André Schild Feb 14 '18 at 15:14
  • The question is clear all the time. But the comments did not help, because they do not work – Stimpson Cat Aug 20 '18 at 14:30