2016-10-07 8 views
2

Проект имеет сервлет, который вызывается, когда человек выходит из системы.Как перенаправить запрос после выхода из системы Struts2

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

Сервлет пытается перенаправить запрос на 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 Status 404 - /ccpserver/logon.do тип отчета Статус message /ccpserver/logon.do описание Запрошенный ресурс (/ccpserver/logon.do) недоступен. JBoss Web/2.1.3.GA

Ударяя прямой URL http://localhost:8080/ccpserver/logon.do, он работает нормально.

ответ

1

Если у вас есть firm значение в valueStack, то вам не нужно сервлет. После выхода из системы вы должны перенаправить на действие входа, используя результат типа перенаправления.

Redirect Action Result

This result uses the ActionMapper provided by the ActionMapperFactory to redirect the browser to a URL that invokes the specified action and (optional) namespace. This is better than the ServletRedirectResult because it does not require you to encode the URL patterns processed by the ActionMapper in to your struts.xml configuration files. This means you can change your URL patterns at any point and your application will still work. It is strongly recommended that if you are redirecting to another action, you use this result rather than the standard redirect result.

See examples below for an example of how request parameters could be passed in.

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

See ActionMapper for more details.


Вы можете закодировать что-то

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

+0

Решение работало для меня, но все же я не могу понять, почему пересылка с сервлета не работает. – Prashant

+0

Вы не должны пересылать сервлет, см. Http://stackoverflow.com/a/31483491/573032 –

0

У вас есть LogonServlet для регистрации, для которой вы используете /logon.do. позже в том же сервлете в setFirmAndRedirect метод, почему вы пересылаете запрос тем же url? то есть /logon.do

нужен другой URL-адрес, например /logout, который является сервлетом, который содержит код выхода.
и отображение для этого выхода из системы должна быть ниже:

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

Не перенаправлять на тот же URL. Когда мы выходим из системы, URL-адрес /logoff.do, который обслуживается установкой struts.xml и отправляется в $ {firmName} .logon, это новый URL-адрес, который обслуживается LogonServlet, который отправляет его в /logon.do, но не выполняет – Prashant