使用struts2拦截功能进行登入拦截,整个过程主要依赖session中是否有用户的信息;
如果没有我们就进行拦截,然后自动跳转到登入页面。
1.首先,我们创建一个拦截类,并继承AbstractInterceptor实现其方法intercept(ActionInvocation invocation);
public class FilterLogin extends AbstractInterceptor {
Logger logger = Logger.getLogger(this.getClass());
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext actionContext = invocation.getInvocationContext();
HttpServletRequest request = (HttpServletRequest) actionContext
.get(StrutsStatics.HTTP_REQUEST);
//获取用户session 用于判断用户是否登入
Map<String, Object> session = actionContext.getSession();
//首先判断session,查找是否登录成功,通过拦截器
if (session != null && session.get("username") != null) {
logger.info("通过拦截器,session中有记录[" + session.get("username") + "]");
return invocation.invoke();
}
System.out.println("you no login ");
return "loginUI";
}
}
2.拦截类我们已经完成,下面就是登入页面,这里我们将登入页面省略
3.配置struts.xml文件,在配置前,需要说一下,配置自定义拦截器需要继承struts默认提供的defaultStack,这样真正意义的拦截器才能生效
拦截器要放在<package>中
<!-- 自定义拦截器 -->
<interceptors>
<interceptor name="loginInterceptor" class="com.mo.filter.FilterLogin" />
<interceptor-stack name="loginDefaultStack">
<interceptor-ref name="loginInterceptor" />
<interceptor-ref name="defaultStack" /> <!-- 一定要依赖struts2的拦截器 -->
</interceptor-stack>
</interceptors>
<!-- 自定义默认拦截器,包括struts2默认的拦截器 -->
<default-interceptor-ref name="loginDefaultStack" />
<!-- 全局 -->
<global-results>
<result name="loginUI" type="redirect">user_loginUI.action</result>
</global-results>
4.当然我们的登入页面是不需要被拦截的,所以我们只需要让登入部分继承struts默认的拦截器就行了
<action name="user_*" class="userAction" method="{1}">
<!-- 登录页面不用拦截,直接继承struts2默认的拦截器 -->
<interceptor-ref name="defaultStack" />
<result name="OK" type="redirectAction">music_show.action</result>
<result name="input">/jsp/login/login.jsp</result>
</action>
5.完成,,,,,,在这里我们要注意一点,我们拦截的只是.action的请求,对应.jsp,我们可以将jsp文件全部放到/WEB-INF/目录下,这样客户端就不能通过路径访问到jsp文件,只能通过.action跳转访问!