做一个项目时遇到一个问题,需要拦截未登录的用户通过地址栏直接访问网络上的资源,解决办法是定义自己的拦截器,但要放过登录的action,把自定义的拦截器和默认的拦截器栈重新组合定义成默认的拦截器栈
拦截器的代码:
package chao.tool;
import java.util.Map;
//判断用户是否登录
public class MyInterceptor extends AbstractInterceptor
{
@Override
public String intercept(ActionInvocation invocation) throws Exception
{
// 获得拦截到的action名称
String actionName = invocation.getInvocationContext().getName();
// 如果拦截到的action是请求登录的action,则放行.
if ("login".equals(actionName))
{
return invocation.invoke();
}
//从Session中取得用户信息,判断用户是否登录
Map session = invocation.getInvocationContext().getSession();
Dlb user = (Dlb) session.get("user");
if (user == null)
{
return Action.LOGIN;
}
// 执行下一个拦截器或执行Action的Execute方法
return invocation.invoke();
}
}
struts.xml中的配置:
<package name="default" extends="struts-default">
<!-- 判断用户是否登录的拦截器 定义成默认的拦截器栈 -->
<interceptors>
<interceptor name="myInterceptor" class="chao.tool.MyInterceptor"/>
<interceptor-stack name="mystack">
<!-- 自定义的拦截器和默认的拦截器栈组合成新的拦截器栈 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认拦截器为上面定义的拦截器栈 -->
<default-interceptor-ref name="mystack"/>
<!-- 全局结果 如果用户没有登录通过地址栏访问其他页面,返回登录页面 -->
<global-results>
<result name="login">/login.jsp</result>
<result name="error">/error.jsp</result>
</global-results>