【问题标题】:How to redirect request after logoff in Struts2如何在Struts2中注销后重定向请求
【发布时间】:2016-10-07 04:25:16
【问题描述】:

该项目有一个 servlet,当用户注销时会调用该 servlet。

public class LogonServlet extends HttpServlet {

private static final long serialVersionUID = -4899047924930198118L;

public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    setFirmAndRedirect(request, response);
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    setFirmAndRedirect(request, response);
}

private void setFirmAndRedirect(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    String firm;
    String serverPath = request.getServletPath();

    firm = serverPath.replaceAll("/", "").replaceAll(".logon", "").trim()
                     .toLowerCase();

    request.setAttribute("firm", firm);

    RequestDispatcher dispatcher = request.getRequestDispatcher("/logon.do");
    dispatcher.forward(request, response);
}
}

servlet 尝试将请求转发到struts 的logon.do 动作。 以下是我的 web.xml 文件:

<web-app>
  <context-param>
    <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
    <param-value>/WEB-INF/tiles-defs.xml</param-value>
  </context-param>

  <filter>
    <filter-name>HibernateSessionFilter</filter-name>
    <filter-class>com.rolfeandnolan.ccp.filters.HibernateSessionFilter</filter-class>
  </filter>

    <!-- Struts 2 -->
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>

  <!-- Should only apply to Alerts Direct requests -->
  <filter-mapping>
    <filter-name>HibernateSessionFilter</filter-name>
    <url-pattern>*.do</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <servlet>
    <servlet-name>logon</servlet-name>
    <servlet-class>com.rolfeandnolan.ccp.servlets.LogonServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>logon</servlet-name>
    <url-pattern>*.logon</url-pattern>
  </servlet-mapping>

LogonServlet 用于按照以下 struts.xml 处理注销请求:

   <action name="logoff"
           class="com.rolfeandnolan.ccp.struts.actions.LogoffAction">
           <param name="allowedRoles">admin,margin,alerts,limitadmin,workfloweditor,eval,theocalc,stress,alertscustomer,useradmin</param>
       <result name="success">/logon.jsp</result>
       <result name="firmlogon" type="dispatcher">
        <param name="location">${firm}.logon</param>
       </result>

   </action>

转发时出现404错误:

HTTP 状态 404 - /ccpserver/logon.do 输入状态报告 消息 /ccpserver/logon.do 说明请求的资源 (/ccpserver/logon.do) 不可用。 JBoss Web/2.1.3.GA

在点击直接 URL http://localhost:8080/ccpserver/logon.do 时,它工作正常。

【问题讨论】:

    标签: jsp servlets struts2 actionresult valuestack


    【解决方案1】:

    如果valueStack 中有firm 值,则不需要servlet。注销后,您应该使用重定向类型结果重定向到登录操作。

    Redirect Action Result

    这个结果使用了ActionMapper ActionMapperFactory 将浏览器重定向到调用的 URL 指定的操作和(可选)命名空间。这比 ServletRedirectResult 因为它不需要您对 ActionMapper 处理的 URL 模式到您的 struts.xml 配置文件。这意味着您可以在以下位置更改您的 URL 模式 任何一点,您的应用程序仍然可以工作。它是强烈的 建议如果您要重定向到另一个操作,请使用 这个结果而不是标准的重定向结果。

    请参阅下面的示例,了解如何使用请求参数 进来了。

    <package name="passingRequestParameters" extends="struts-default" namespace="/passingRequestParameters">
       <!-- Pass parameters (reportType, width and height) -->
       <!--
       The redirectAction url generated will be :
       /genReport/generateReport.action?reportType=pie&amp;width=100&amp;height=100#summary
       -->
       <action name="gatherReportInfo" class="...">
          <result name="showReportResult" type="redirectAction">
             <param name="actionName">generateReport</param>
             <param name="namespace">/genReport</param>
             <param name="reportType">pie</param>
             <param name="width">100</param>
             <param name="height">100</param>
             <param name="empty"></param>
             <param name="suppressEmptyParameters">true</param>
             <param name="anchor">summary</param>
          </result>
       </action>
    </package>
    

    更多详情请见ActionMapper


    你可以编码一些东西

    <result name="firmlogon" type="redirectAction">
        <param name="actionName">logon</param>
        <param name="namespace">/</param>
        <param name="firm">${firm}</param>
    </result>
    

    【讨论】:

    【解决方案2】:

    您有LogonServlet 用于登录,因为您正在使用/logon.do。稍后在setFirmAndRedirect 方法中的同一个servlet 中为什么要将请求转发到同一个url?即/logon.do

    您需要另一个 URL,例如 /logout,它是一个包含您的注销代码的 servlet。
    该注销的映射应如下所示:

    RequestDispatcher dispatcher = request.getRequestDispatcher("logout");
    dispatcher.forward(request, response);
    
    <servlet>
      <servlet-name>logout</servlet-name>
      <servlet-class>com.rolfeandnolan.ccp.servlets.logout</servlet-class>
      </servlet>
    <servlet-mapping>
      <servlet-name>logout</servlet-name>
      <url-pattern>/logout</url-pattern>
    </servlet-mapping>
    

    【讨论】:

    • 它没有重定向到同一个 URL。当我们注销时,URL 是 /logoff.do,它由 struts.xml 设置提供并分派到 ${firmName}.logon 这是一个新的 URL,由 LogonServlet 提供,它试图将其转发到 /logon.do 但失败
    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多