如何在 Struts 2 中注销后重定向请求

问题描述 投票:0回答:2

该项目有一个 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 网页/2.1.3.GA

点击直接网址

http://localhost:8080/ccpserver/logon.do
时,它工作正常。

jsp servlets struts2 actionresult valuestack
2个回答
1
投票

如果

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

重定向操作结果

此结果使用由

ActionMapper
将浏览器重定向到调用的 URL 指定的操作和(可选)命名空间。这比
ActionMapperFactory
因为它不需要你编码 由
ServletRedirectResult
处理到您的
ActionMapper
中的 URL 模式 配置文件。这意味着您可以更改您的 URL 模式 任何一点,您的应用程序仍然有效。它是强烈的 建议如果您要重定向到另一个操作,请使用 此结果而不是标准重定向结果。
请参阅下面的示例,了解请求参数的示例
通过了。

struts.xml

请参阅
ActionMapper

了解更多详细信息。

你可以编写一些东西

<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>

    


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

登录,因为您正在使用

LogonServlet
。稍后在
/logon.do
方法中的同一个 servlet 中,为什么要将请求转发到相同的
setFirmAndRedirect
?即
url

您需要另一个 url,例如

/logon.do

,它是一个包含您的注销代码的 servlet。

该注销的映射应如下所示:

/logout

© www.soinside.com 2019 - 2024. All rights reserved.