Struts2:拦截器可以处理未经授权的访问吗?

时间:2011-09-15 17:10:59

标签: struts2

我正在尝试了解Struts2拦截器。如果我的问题很愚蠢,请原谅。

我猜这些拦截器特定于一个动作类(这意味着在调用一个特定的动作类之前,它们会被调用)。

例如:

<action name="test" class="com.jranch.Test">
    <interceptor-ref name="GuiStack”/>
    <result name="success">/secure.jsp</result>
</action>

我的问题是:假设必须保护网站中的图片免受未经授权的访问(如果用户直接在浏览器中输入URL,则不应允许他们在登录前查看图片)。

我的观点是,如果它与Servlet过滤器相关,我可以通过将 url-pattern标记放到/ *来检查所有请求来编写一个简单的过滤器。 Struts2拦截器可以处理这个,因为我猜它们是特定于动作类的吗?

如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:1)

拦截器不一定特定于某个动作 - 实际上,在大多数情况下,它们适用于所有动作或全局动作(非常类似于servlet过滤器)。

这篇answer讨论了如何在Struts2应用程序中使用拦截器进行身份验证。

答案 1 :(得分:1)

嗯,正如史蒂文告诉拦截器不是特定于任何Action,它们实际上是Struts2框架的核心 拦截器是一组可重用的组件。在所有情况下,它们都应用于请求处理周期,包括从异常处理到角色处理。 当一个人为一个特定的Action写一个拦截器时,它是非常简单的用例。

您正在谈论的用例可以由Interceptor处理,对于特定资源的每个请求都可以首先被拦截器拦截,并且基于允许访问的自定义标准,我们可以将请求转发到调用堆栈或者可以拒绝请求。

public String intercept (ActionInvocation invocation) throws Exception {
    final ActionContext context = invocation.getInvocationContext ();
    Map<String, Object> session = ActionContext.getContext().getSession();
     Object user = session.getAttribute (USER_HANDLE);
    if (user == null) {

                //Any processing
               return "login";   //User is not logged in so ask him/her to login
    } else {
        return invocation.invoke ();  //user is trusted one let her go ahead
    }
}