【问题标题】:How to redirect to a page when session times out?会话超时时如何重定向到页面?
【发布时间】:2018-01-24 23:45:26
【问题描述】:

我遇到了一个问题,我的页面上有一个会话超时,并且我在会话超时时创建了一个 html 页面,它将转到该页面。但是,现在当会话超时时,它会转到index page,我不想这样做。有没有办法可以将用户重定向到超时页面?谢谢。

这是我的代码。

<!DOCTYPE html>

<html>
    <head>
        <title>Session Expired</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>


         <style type="text/css">


        html {
            font-family: sans-serif;
            line-height: 1.15;
            -ms-text-size-adjust: 100%;
            -webkit-text-size-adjust: 100%
        }

        body {
            margin: 0
        }

        article,
        aside,
        footer,
        header,
        nav,
        section {
            display: block
        }

        h1 {
            font-size: 2em;
            margin: .67em 0
        }

        figcaption,
        figure,
        main {
            display: block
        }

        figure {
            margin: 1em 40px
        }

        hr {
            box-sizing: content-box;
            height: 0;
            overflow: visible
        }

        pre {
            font-family: monospace, monospace;
            font-size: 1em
        }

        a {
            background-color: transparent;
            -webkit-text-decoration-skip: objects
        }

        a:active,
        a:hover {
            outline-width: 0
        }

        abbr[title] {
            border-bottom: none;
            text-decoration: underline;
            text-decoration: underline dotted
        }

        b,
        strong {
            font-weight: inherit
        }

        b,
        strong {
            font-weight: bolder
        }

        code,
        kbd,
        samp {
            font-family: monospace, monospace;
            font-size: 1em
        }

        dfn {
            font-style: italic
        }

        mark {
            background-color: #ff0;
            color: #000
        }

        small {
            font-size: 80%
        }

        sub,
        sup {
            font-size: 75%;
            line-height: 0;
            position: relative;
            vertical-align: baseline
        }

        sub {
            bottom: -.25em
        }

        sup {
            top: -.5em
        }

        audio,
        video {
            display: inline-block
        }

        audio:not([controls]) {
            display: none;
            height: 0
        }

        img {
            border-style: none
        }

        svg:not(:root) {
            overflow: hidden
        }

        button,
        input,
        optgroup,
        select,
        textarea {
            font-family: sans-serif;
            font-size: 100%;
            line-height: 1.15;
            margin: 0
        }

        button,
        input {
            overflow: visible
        }

        button,
        select {
            text-transform: none
        }

        [type=reset],
        [type=submit],
        button,
        html [type=button] {
            -webkit-appearance: button
        }

        [type=button]::-moz-focus-inner,
        [type=reset]::-moz-focus-inner,
        [type=submit]::-moz-focus-inner,
        button::-moz-focus-inner {
            border-style: none;
            padding: 0
        }

        [type=button]:-moz-focusring,
        [type=reset]:-moz-focusring,
        [type=submit]:-moz-focusring,
        button:-moz-focusring {
            outline: 1px dotted ButtonText
        }

        fieldset {
            border: 1px solid silver;
            margin: 0 2px;
            padding: .35em .625em .75em
        }

        legend {
            box-sizing: border-box;
            color: inherit;
            display: table;
            max-width: 100%;
            padding: 0;
            white-space: normal
        }

        progress {
            display: inline-block;
            vertical-align: baseline
        }

        textarea {
            overflow: auto
        }

        [type=checkbox],
        [type=radio] {
            box-sizing: border-box;
            padding: 0
        }

        [type=number]::-webkit-inner-spin-button,
        [type=number]::-webkit-outer-spin-button {
            height: auto
        }

        [type=search] {
            -webkit-appearance: textfield;
            outline-offset: -2px
        }

        [type=search]::-webkit-search-cancel-button,
        [type=search]::-webkit-search-decoration {
            -webkit-appearance: none
        }

        ::-webkit-file-upload-button {
            -webkit-appearance: button;
            font: inherit
        }

        details,
        menu {
            display: block
        }

        summary {
            display: list-item
        }

        canvas {
            display: inline-block
        }

        template {
            display: none
        }

        [hidden] {
            display: none
        }

        body,
        html {
            width: 100%;
            height: 100%;
            background-color: #21232a
        }

        body {
            color: #fff;
            text-align: center;
            text-shadow: 0 2px 4px rgba(0, 0, 0, .5);
            padding: 0;
            min-height: 100%;
            -webkit-box-shadow: inset 0 0 75pt rgba(0, 0, 0, .8);
            box-shadow: inset 0 0 75pt rgba(0, 0, 0, .8);
            display: table;
            font-family: "Open Sans", Arial, sans-serif
        }

        h1 {
            font-family: inherit;
            font-weight: 500;
            line-height: 1.1;
            color: inherit;
            font-size: 36px
        }

        h1 small {
            font-size: 68%;
            font-weight: 400;
            line-height: 1;
            color: #777
        }

        a {
            text-decoration: none;
            color: #fff;
            font-size: inherit;
            border-bottom: dotted 1px #707070
        }

        .lead {
            color: silver;
            font-size: 21px;
            line-height: 1.4
        }

        .cover {
            display: table-cell;
            vertical-align: middle;
            padding: 0 20px
        }

        footer {
            position: fixed;
            width: 100%;
            height: 40px;
            left: 0;
            bottom: 0;
            color: #a0a0a0;
            font-size: 14px
        }
        </style>
    </head>
    <body>
        <div class="cover">
            <h1>Your session has expired  due to inactivity. </h1>
            <h1>  Please login again 
                  <a href="index.xhtml">here</a>. Thank you.</h1>


        </div>
    </body>
</html>

【问题讨论】:

  • 根本不需要超时的html,因为它永远不会根据您的问题显示。问题出在其他地方。
  • 签出this example然后创建相同的监听器,但是你必须在会话失效后添加重定向用户到N页。

标签: java html session session-timeout


【解决方案1】:

在过滤器中试试这个:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
                    ServletException
    {


            String ipAddress = request.getRemoteAddr();

            System.out.println("IP " + ipAddress + ", Time " + new Date().toString());

            boolean authorized = false;
            String username = null;
            String role = null;
            if (request instanceof HttpServletRequest)
            {
                    HttpSession session = ((HttpServletRequest) request).getSession(false);
                    if (session != null)
                    {
                            username = (String) session.getAttribute("username");
                            role = (String) session.getAttribute("role");
                            if (username != null && role != null)
                                    authorized = true;
                    }else{ 

                            ((HttpServletResponse)response).sendRedirect("showlogin");
                    //or response.sendError(..) etc.
                    return ;
               }
            }

【讨论】:

  • 这是做什么的?
【解决方案2】:

用户友好的解决方案是使 javascript-timeout 的持续时间与您的 sessiontimeout 相同,并在结束前 60 秒弹出一个弹出窗口以警告用户该问题...

【讨论】:

  • 我创建了一个 js 超时,但是当服务器会话超时达到那一分钟时,它会自动将用户注销并转到 index 页面
  • 现在,当会话超时时,它会显示我的 500 自定义错误页面。
  • 你应该重新考虑你的过滤器类。总是将所有未登录的用户发送到同一页面真的很聪明吗?因此,对于未注册的用户(您的 index.jsp),您只能拥有一页。没有其他页面的空间,例如您的 session-timeout-page...
  • 我的会话超时在我的web.xml 中过期,这就是原因
  • 是的,我知道我们遇到了同样的问题。您必须重新设计过滤器类。因此,对于未注册的人(例如没有会话的人),只有一页是可能的。
【解决方案3】:

在 Java 上,您有一个 httpSessionListener 接口。 当你实现这个接口时,你必须实现2个方法:

sessionCreated(httpSessionEvent e) sessionDestroyed(httpSessionEvent e)

SessionDestroyed 在会话终止时被激活。因此您可以将代码放入此方法中。

编辑:

Class Listen implements httpSessionListener {
Public void SessionDestroyed (httpSessionEvent e){
 //Redirection code
}
}

//Web.xml:

<Listener>
<Listener-class>path of class</listener-class>
</Listener>

XML 监听器标记必须在 servlet 标记之外。

【讨论】:

  • 所以我有一个方法:public void destroy() 我应该把页面timeout 放在那个方法里面吗?
  • 通常,您使用 httpSession.setMaxInactiveInterval(int sec) 设置一个会话的持续时间。然后当会话结束时自动调用列表器。您只需将重定向代码放入监听器
  • 监听器必须实现httpSessionListener
  • 你能在我上面的代码之前给我看一些代码吗?
  • 因为我的会话超时在我的web.xml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 2012-09-12
  • 2016-11-12
  • 2012-05-04
  • 2015-06-18
相关资源
最近更新 更多