Vaadin 8设置会话超时

时间:2018-02-12 07:59:37

标签: java session vaadin vaadin8

如何在Vaadin 8中设置会话超时?

我没有使用web.xml,它已经成为在框架的早期版本中设置它的地方。

2 个答案:

答案 0 :(得分:2)

会话超时在web.xml中设置。

如果您没有,那么您需要创建一个。

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

由于你似乎使用弹簧靴,这可能适用于你

Spring Boot Java Config Set Session Timeout

答案 1 :(得分:2)

tl; dr

从包装int中提取后,您可以将标准Servlet会话的超时设置为VaadinSession秒数。

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

以编程方式设置会话超时

设置session超时是web container和Servlet引擎(例如Tomcat,Jetty等)的一项功能。Servlet规范将Java应用程序的这种行为定义为它的会话处理。

Vaadin将Servlet会话包装在VaadinSession中。因此,将Vaadin中的常规Servlet会话提取为WrappedSession,然后调用setMaxInactiveInterval方法来设置过期时间。

将时间限制指定为整秒数。 TimeUnit枚举很容易计算秒数,而无需求助于“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.      
)
;

这是从Maven原型vaadin-archetype-application创建的Vaadin 8.5应用的完整示例。我们在init方法的开头添加了一行。

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,而不是Vaadin

  

我没有使用web.xml,它是在框架的早期版本中进行设置的地方。

实际上,会话超时是Servlet,而不是Vaadin特定的。 web.xml是Servlet,而不是Vaadin特定的东西。

请参阅:

How to set session timeout dynamically in Java web applications?中有进一步讨论。