2011-04-20 128 views
2

我有一个intercetpor,用于在提供请求的操作之前检查用户是否已登录。我曾尝试将此设置为所有操作的默认设置。对于除一个之外的所有地址,这就像一个魅力。当我因为某些原因进入根URL "http://localhost:8080/map/"时,拦截器不会触发。我猜有什么我失踪的struts.xml,但我无法弄清楚:在struts2中使用拦截器捕获根的问题

<struts> 

    <constant name="struts.devMode" value="true" /> 
    <constant name="struts.custom.i18n.resources" value="ApplicationResources,DatabaseResources" /> 

    <package name="map" extends="struts-default"> 
     <interceptors> 
      <interceptor name="loginintercept" 
       class="se.contribe.intercept.LoginInterceptor" /> 
      <interceptor-stack name="defaultLoginStack"> 
       <interceptor-ref name="loginintercept" /> 
       <interceptor-ref name="defaultStack" /> 
      </interceptor-stack> 
     </interceptors> 

     <default-interceptor-ref name="defaultLoginStack" /> 

     <default-action-ref name="index"></default-action-ref> 

     <global-results> 
      <result name="loginneeded">/login.jsp</result> 
     </global-results> 

     <action name="index" class="**.map.MapAction"> 
      <result>/index.jsp</result> 
     </action> 

     <action name="login"> 
      <result>/login.jsp</result> 
     </action> 

     <action name="loginInput" class="**.session.LoginAction"> 
      <result type="redirectAction"> 
       <param name="actionName">index</param> 
      </result> 
      <result name="input">/login.jsp</result> 
      <result name="error">/login.jsp</result> 
     </action> 

     <action name="*" class="**.map.MapAction"> 
      <result>/index.jsp</result> 
     </action> 
    </package> 

</struts> 

我已混淆的类名称了一下,以防万一我的雇主会反对。

+0

请求http:// localhost:8080/map /调用您的索引操作?如果是这样,那个拦截器是为了这个请求而被调用的? – 2011-04-20 14:23:32

回答

0

您的根网址可能是 http://localhost:8080/map/但包“地图”是指 http://localhost:8080/map/map

你可能要为“/”中定义的包,你可能希望有一个包“”定义的 http://localhost:8080/map/根,它允许从任何包中执行内部的操作。

编辑:在上面我糊涂了命名空间的名称(使用了插件约定太多好像!)

我强烈怀疑,如果你检查你的web.xml文件中,你会发现是这样的:

<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 

,如果你改变了,要

<welcome-file-list> 
    <welcome-file>index.action</welcome-file> 
</welcome-file-list> 

你会得到你所期望的,因为我可以同时拥有一个index.jsp和一个index.action,并改变该设置选择一个或另一个。

+0

@Qyaternion我想你正在谈论包的命名空间。如果没有提供,则使用namespace =“”。一个包的名称属性就是一个名称,除非提供了一个名称空间,否则没有与该URL的连接。至少这是我从Apache参考手册中得出的结论。 – Skadlig 2011-04-21 09:35:20

0

我终于弄清楚了这一点。
我测试写一个简单的输出在

<action name="index" class="**.map.MapAction"> 

当我打开网页没有输出被印在控制台中执行阶段到控制台。这让我思考。我的主页被命名为index.jsp,显然这个名字绕过了Struts常规控件。将名称更改为index2.jsp解决了问题。
我可能还有其他地方可以改变这种行为,但只需更改名称就容易了。