2011-09-15 55 views
0

我想了解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拦截器可以处理这个,因为我猜它们是针对动作类的?

如果我错了,请纠正我。

+0

操作属于一个包,通常拦截器被分组为一个拦截器堆栈,然后应用到一个包。如您所示,您都可以将拦截器应用于特定的操作。本书“struts2 in action”展示了如何实现基本的安全性,就像你要求的那样,并解释你需要理解它(这个解决方案几乎是umesh提供的)。由于我提到了一本书,如果您需要快速加速,那么只需提及“Apache Struts 2 Web应用程序开发”即可。 – Quaternion

回答

1

以及史蒂芬告诉拦截器是不针对任何行动,他们其实是Struts2框架的核心 拦截器是一组可重用components.In它们被应用于请求处理周期从异常处理包括所有的情况下到角色处理。 当一个人为特定的Action写一个Interceptor时,它的用例非常简单。

您谈论的用例可以由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 
    } 
} 
1

拦截器并不一定专用于一个动作 - 实际上,在大多数情况下,它们被应用于许多动作或全局动作(非常类似于一个servlet过滤器)。

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

+0

感谢Steven Benitez,但是那个链接完全帮助我,它是一个登录拦截器,它是专门为一个类编写的,我的问题是如何直接输入http:myserver/Testing/Img2.jpg来重定向Loggedout用户。 – Pawan

+1

如果这是个问题,你应该在“我的问题是”之后把所有东西都拿出来放在问题中。 – Quaternion

+0

是的,请清楚解释你在原始问题中提出的问题。该问题中的拦截器_does_展示了如何将未登录的用户重定向到登录页面,而不是向用户显示所请求的内容。 –