2

该项目有一个 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

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

4

2 回答 2

1

如果你firm有价值,valueStack那么你不需要一个servlet。注销后,您应该使用重定向类型结果重定向到登录操作。

重定向操作结果

此结果使用ActionMapper提供的 ActionMapperFactory将浏览器重定向到调用指定操作和(可选)命名空间的 URL。这比 更好, ServletRedirectResult因为它不需要您将ActionMapperin 处理的 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>

于 2016-10-07T13:11:06.633 回答
0

您必须LogonServlet登录您正在使用的/logon.do. 稍后在setFirmAndRedirect方法中的同一个 servlet 中为什么要将请求转发给同一个url?IE,/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>
于 2016-10-07T04:42:32.953 回答