【问题标题】:session-timeout not working for some links in Strutssession-timeout 不适用于 Struts 中的某些链接
【发布时间】:2015-08-25 14:27:25
【问题描述】:

我的应用程序正在使用 Struts 1,并且我在 web.xml 中将会话超时配置为 60。我正在使用框架,我的视图左侧的菜单树(链接)始终保持不变,右侧显示点击时的相应页面。超时时,大多数链接都显示登录页面。但很少有人不是,他们仍然在同一个流程中。不超时的链接请在下方查找配置和jsp sn-ps。

web.xml

<session-config>
  <session-timeout>60</session-timeout>
</session-config>
<login-config>
  <auth-method>FORM</auth-method>
  <realm-name>default</realm-name>
  <form-login-config>
    <form-login-page>/login.jsp</form-login-page>
    <form-error-page>/do/login</form-error-page>
  </form-login-config>
</login-config>

什么不起作用

struts-config.xml

<action path="/Report" scope="request" name="form.Report" type="com.mypack.ReportAction" input="/Data.jsp">
  <forward name="show" path="/Data.jsp" />
</action>

menu.jsp

<tr>
  <td height="24"><b><font size="2">
      <html:link forward="/Report" target="main">Reports</html:link></font></b>
  </td>
</tr>

【问题讨论】:

    标签: java jsp session-timeout struts-1


    【解决方案1】:

    会话超时与 struts 无关,而与您的 Web 应用程序容器有关。为确保会话结束时每个链接都重定向到登录页面,您可以在 web.xml 中添加一个过滤器,此过滤器将检查请求,如果达到超时,则将其重定向到登录页面,否则它会允许它继续。

    【讨论】:

    • 我当前的 web.xml 没有使用任何过滤器,并且会话超时仍然适用于大多数链接。我不明白它的那个方面。并且将 web.xml 中 login.jsp 的唯一映射添加到我上面的问题中。
    • 我的意思是,即使您配置了登录,您也必须添加过滤器。通过过滤器更安全。可能是struts可以绕过登录配置!
    • 正如@IBJ 所说的创建一个过滤器,在您的action class 对应于请求的url 之前调用过滤器。在filter 中检查session,如果session 不可用,您可以将您重定向到login pageFind the Example code for session filter
    【解决方案2】:

    您可以添加如下过滤器:

    在您的 web.xml 中添加以下行

    <filter>
        <filter-name>SessionFilter</filter-name>
        <filter-class>
            com.rbz.SessionFilter
        </filter-class>    
    </filter>
    <filter-mapping>
        <filter-name>SessionFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    然后在您的来源中,在下面添加类

    package com.rbz;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.StringTokenizer;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class SessionFilter implements Filter {
    
    
        public void destroy() {
        }
    
        public void doFilter(ServletRequest req, ServletResponse res,
                FilterChain chain) throws IOException, ServletException {
    
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;    
    
        // try to get session
        HttpSession session = request.getSession(false);
    
        String url = request.getServletPath();
    
        if ((null != session && !session.isNew()) || (null == session && url.contains("login.jsp")) {     
          chain.doFilter(req, res);          
        } else {          
          response.sendRedirect("login.jsp");
        }   
    
    
        }
    
        public void init(FilterConfig config) throws ServletException {
        }
    }
    

    此代码未经测试!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      相关资源
      最近更新 更多