该项目有一个 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
时,它工作正常。
如果
firm
中有 valueStack
值,那么您不需要 servlet。注销后,您应该使用重定向类型结果重定向到登录操作。
你可以编写一些东西重定向操作结果
此结果使用由
将浏览器重定向到调用的 URL 指定的操作和(可选)命名空间。这比ActionMapper
因为它不需要你编码 由ActionMapperFactory
处理到您的ServletRedirectResult
中的 URL 模式 配置文件。这意味着您可以更改您的 URL 模式 任何一点,您的应用程序仍然有效。它是强烈的 建议如果您要重定向到另一个操作,请使用 此结果而不是标准重定向结果。请参阅下面的示例,了解请求参数的示例 通过了。ActionMapper
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&width=100&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>
<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