我有一个Java Webapp项目,它使用Struts2作为控制器层。我需要在做任何事情之前检查用户的权限(比如打开网页)。我开发了一个需要在struts动作中执行的授权系统。那么,如何在加载页面之前执行此操作呢?我应该使用拦截器吗?
答案 0 :(得分:4)
当然,您应该实现自己的拦截器并将其置于其他拦截器之上(不一定在顶部)。如果你把它放在最前面,它可以在你的页面执行之前工作,并且可以改变你的返回值。
例如:
在你的struts.xml
中<interceptor name="security"
class="com.solekia.common.SecurityInterceptor">
</interceptor>
<interceptor-stack name="defaultStack">
<interceptor-ref name="security"/>
<interceptor-ref name="exception" />
...
</interceptor-stack>
<global-results>
<result name="login" type="redirectAction">Login</result>
<result name="adminlogin" type="redirectAction">AdminLogin</result>
<result name="error">/error.jsp</result>
</global-results>
你的拦截器:
public class SecurityInterceptor extends AbstractInterceptor
{
public static final String CURRENT_USER = "current_user";
public static final String LOGIN = "login";
public static final String ADMINLOGIN = "adminlogin";
public String intercept(ActionInvocation invocation) throws Exception {
Object user = invocation.getInvocationContext().getSession().get(CURRENT_USER);
Object action = invocation.getAction();
if(action instanceof Login)
{
return invocation.invoke();
}
else if(action instanceof Register)
{
return invocation.invoke();
}
else if(action instanceof Pro)
{
return invocation.invoke();
}
if( user == null )
{
invocation.getInvocationContext().getSession().clear();
return LOGIN;
}
else
{
if(user instanceof User)
{
if(action instanceof AdminLogin)
return ADMINLOGIN;
}
if(user instanceof Admin)
{
if(action instanceof ClientPortal)
return LOGIN;
}
synchronized(user)
{
return invokeLocal(invocation) ;
}
}
}
protected String invokeLocal(ActionInvocation invocation) throws Exception
{
return invocation.invoke();
}
}
希望这有帮助
答案 1 :(得分:4)
你无法理解像Struts这样的MVC框架的全部意义。在MVC应用程序中,您应该从不具有指向JSP的任何链接或表单。
您应始终指向映射到Struts servlet / filter的URL。然后servlet根据URL调用相应的操作,操作返回结果(要转到的JSP),Struts转发到此JSP。
如果直接指向JSP,那么您完全绕过Struts。阅读http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html