Jsp 在Struts2中注销后如何重定向请求

Jsp 在Struts2中注销后如何重定向请求,jsp,servlets,struts2,actionresult,valuestack,Jsp,Servlets,Struts2,Actionresult,Valuestack,该项目有一个servlet,当用户注销时调用该servlet public class LogonServlet extends HttpServlet { private static final long serialVersionUID = -4899047924930198118L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletExcept

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

org.apache.tiles.impl.basictelescontainer.DEFINITIONS\u CONFIG
/WEB-INF/tiles-defs.xml
HibernateSessionFilter
com.rolfeandnolan.ccp.filters.HibernateSessionFilter
支柱2
org.apache.struts2.dispatcher.ng.filter.strutspreadexecutefilter
HibernateSessionFilter
*.做
支柱2
/*
登录
com.rolfeandnolan.ccp.servlets.LogonServlet
登录
*.登录
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>

管理员、边距、警报、限制管理员、工作流编辑器、评估、theocalc、压力、警报管理员、用户管理员
/logon.jsp
${firm}.logon
在转发时,它给出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
,工作正常。

您有
LogonServlet
用于登录您正在使用的
/logon.do
。稍后在
setfirmandedirect
方法中的同一个servlet中,为什么要将请求转发到同一
url
?i、 e,
/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>
RequestDispatcher=request.getRequestDispatcher(“注销”);
转发(请求、响应);
注销
com.rolfeandnolan.ccp.servlets.logout
注销
/注销

如果在
值堆栈中有
固定值
,则不需要servlet。注销后,应使用重定向类型结果重定向到登录操作

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

请参阅下面的示例,以了解如何使用请求参数 过去了


更多细节


你可以编写代码


登录
/
${firm}


它没有重定向到同一URL。当我们注销时,URL是/logoff.do,它由struts.xml设置提供并发送到${firmName}。logon这是一个新的URL,由LogonServlet提供,它尝试将它转发到/logon.do,但失败解决方案对我有效,但我仍然无法理解为什么从servlet转发不起作用。您不应该转发到servlet,请参阅