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

时间:2016-10-07 04:25:17

标签: jsp servlets struts2 actionresult valuestack

项目有一个servlet,当一个人注销时会调用它。

    protected $redirectTo = '/home';

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

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);
}
}

LogonServlet用于按照以下struts.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>

转发时,它给出了404错误:

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

点击直接网址 <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> 时,工作正常。

2 个答案:

答案 0 :(得分:1)

如果 [self loadGoogleAdMobBanner]; -(void)loadGoogleAdMobBanner { } 中有GoogleAdsCategoryCell *myGoogleAdCell = [tableView dequeueReusableCellWithIdentifier:@"GoogleAdsCategoryCell"]; if (myGoogleAdCell == nil) { NSArray *nib_Array = [[NSBundle mainBundle]loadNibNamed:@"GoogleAdsCategoryCell" owner:self options:nil]; myGoogleAdCell = [nib_Array objectAtIndex:0]; } [myGoogleAdCell.bannerView addSubview:_homeBannerView]; return myGoogleAdCell; 值,那么您不需要servlet。注销后,您应该使用重定向类型结果重定向到登录操作。

  

Redirect Action Result

     

此结果使用的是firm   valueStack将浏览器重定向到调用的URL   指定的操作和(可选)命名空间。这比   ActionMapper因为它不需要你编码   ActionMapperFactory处理的ServletRedirectResult处理的网址格式   配置文件。这意味着您可以更改您的网址格式   任何一点,你的申请仍然有效。这是强烈的   建议您在重定向到其他操作时使用   这个结果而不是标准的重定向结果。

     

请参阅下面的示例,了解请求参数的示例   传入。

ActionMapper
     

有关详细信息,请参阅ActionMapper

您可以编写代码

struts.xml

答案 1 :(得分:0)

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

你需要另一个像/logon.do这样的网址,它是一个包含你的注销码的servlet 该注销的映射应如下所示:

/logout