3

事情是这样的,我不仅需要使用我的 .war 服务 java,还需要一些 javascript 文件。所以,例如。如果有人访问 URL:

example.com/js/foo.jar

然后我需要将其正确地用作 javascript 文件。同时,如果有人去:

example.com/bar

我需要 Struts2 将其作为可能的控制器提供服务。

我在网上找到的从 url 中删除后缀的方法会导致两个 URls 都由 struts 2 提供服务(因此foo.js即使第一个文件存在,也会给它一个错误)。有没有办法(例如拦截器)在给出错误之前首先检查给定的 .js 文件是否存在?

4

2 回答 2

12

DarkHorse 的回答并不完全准确。有两个值非常相似,但工作方式却大不相同:

<constant name="struts.action.extension" value=","/>
<constant name="struts.action.extension" value=""/>

您几乎肯定想要第一个选项,其中包括一个逗号。这告诉 Struts 动作扩展是空的。这也意味着 Struts 不会尝试匹配任何具有扩展名的请求例如 *.css、*.js 等。

第二个选项告诉 Struts 不应该有操作扩展,但它也表示您希望 Struts 匹配每个请求。我能想到的唯一可能的好处是,如果您想在操作映射中包含文件扩展名,例如以下内容:

<action name="robots.txt" class="...">
    ...
</action>

此外,从 Struts 过滤器中排除请求是使用该struts.action.excludePattern属性,如此所述。不要为此依赖拦截器,因为拦截器仅在框架找到要映射到的合适操作后运行。

于 2013-09-30T21:10:51.017 回答
0

要使 URL 没有后缀...您需要做的就是...在您的 struts.xml 文件中设置它

  <constant name="struts.action.extension" value=""/> 

如果您希望某些 url 不由 struts 操作提供服务...编写一个拦截器,在其中检查 url 的后缀..如果它有任何重定向它们,从而完全避免您的 struts 操作..

前任:

public class RestrictUrl extends AbstractInterceptor implements SessionAware {
    Map<String, Object> session;

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
        HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE);
        String url = request.getHeader("referer"); // Your url
        if(check something in url) {
            response.sendRedirect(where you want to go);
        }
        return invocation.invoke();
    }

}
于 2013-09-29T03:43:48.320 回答