Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vaadin 8 set session timeout

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.

like image 360
Stimpson Cat Avatar asked Feb 12 '18 07:02

Stimpson Cat


2 Answers

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:

  • javax.servlet.http.HttpSession::setMaxInactiveInterval(int interval) method
  • Servlet 3.1 specification (a PDF document)
  • Servlet 4 specification

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

like image 145
Basil Bourque Avatar answered Oct 11 '22 21:10

Basil Bourque


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

like image 30
André Schild Avatar answered Oct 11 '22 20:10

André Schild