简体   繁体   English

Vaadin 8设置会话超时

[英]Vaadin 8 set session timeout

How to set timeout of a session in Vaadin 8? 如何在Vaadin 8中设置会话超时?

I am not using web.xml, which has been the place to set it in prior versions of the framework. 我没有使用web.xml,它已经成为在框架的早期版本中设置它的地方。

Session timeout is set in web.xml. 会话超时在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? 如何在web.xml中设置会话超时(以秒为单位)?

As you seem to use spring boot, then this might apply to you 当你似乎使用弹簧靴时,这可能适用于你

Spring Boot Java Config Set Session Timeout Spring Boot Java Config设置会话超时

tl;dr TL;博士

You can set the standard Servlet session's timeout as a int number of whole seconds, after extracting from the wrapping VaadinSession . 从包装VaadinSession提取后,可以将标准Servlet会话的超时设置为整数秒的int数。

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. 设置会话超时是Web容器 ,Servlet引擎(如Tomcat,Jetty等)中的一项功能.Servlet规范为Java应用程序定义了此行为,作为其会话处理的一部分。

Vaadin wraps the Servlet session inside a VaadinSession . Vaadin将Servlet会话包装在VaadinSession So extract the regular Servlet session from Vaadin as a WrappedSession , then call the setMaxInactiveInterval method to set the time to expire. 因此,从Vaadin中提取常规Servlet会话作为WrappedSession ,然后调用setMaxInactiveInterval方法设置到期时间。

Specify the time limit as a number of whole seconds. 将时间限制指定为整秒数。 The TimeUnit enum is handy to calculate the seconds without resorting to “magic” numbers . TimeUnit枚举可以方便地计算秒数而不需要求助于“魔术”数字

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 . 以下是从Maven原型vaadin-archetype-application创建的完整示例Vaadin 8.5应用vaadin-archetype-application We added a single line to the beginning of the init method. 我们在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, not Vaadin Servlet,而不是Vaadin

I am not using web.xml, which has been the place to set it in prior versions of the framework. 我没有使用web.xml,它已经成为在框架的早期版本中设置它的地方。

Actually, the session timeout is a Servlet thing, not a Vaadin-specific thing. 实际上,会话超时是Servlet的事情,而不是Vaadin特定的事情。 And the web.xml is a Servlet thing, not a Vaadin-specific thing. web.xml是一个Servlet的东西,而不是Vaadin特有的东西。

See: 看到:

Further discussed in How to set session timeout dynamically in Java web applications? 如何在Java Web应用程序中动态设置会话超时? .

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM