花费半天研究了一下struts拦截器实现登录验证。做下笔记
附上源码
- 搭建struts2环境,新建web工程,导入struts的jar包:
- 编辑web.xml,配置struts。在src下配置struts.xml配置文件
<package name="haslogin" extends="struts-default"> <interceptors> <!--定义一个名为loginintercetor的拦截器--> <interceptor name="loginintercetor" class="com.tch.interceptor.LoginInterceptor"></interceptor> <!--定义一个包含权限检查的拦截器栈--> <interceptor-stack name="myStack"> <!--配置自定义的拦截器--> <interceptor-ref name="loginintercetor"></interceptor-ref> <!--配置内建默认拦截器--> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"></default-interceptor-ref> <global-results > <result name="login">/WEB-INF/jsp/manage/login.jsp</result> </global-results> </package>
其他包引用haslogin,会使用登录和权限控制用到的拦截器loginintercetor
- 编写拦截器类LoginInterceptor.java
package com.tch.interceptor;
import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor
{
@Override
public String intercept(ActionInvocation invocation) throws Exception
{
Map<String, Object> session= invocation.getInvocationContext().getSession();
if (session.get("username")==null)
{
return "login";
}
return invocation.invoke();
}
}
从session中获取登录信息,若有登录用户则继续访问;若没有返回登录,访问global-results。
- 配置登录登出的action
<package name="manage" namespace="/manage" extends="haslogin"> <!-- 登录和登出不需要拦截,可单独配置interceptor-ref拦截器为defaultStack --> <action name="login" class="com.tch.action.LoginAction" method="manageUserLogin"> <!-- 配置type="redirect"会重定向,也就是url地址栏地址会变化 --> <result name="success" type="redirect">index.action</result> <interceptor-ref name="defaultStack"></interceptor-ref> </action> <action name="loginOut" class="com.tch.action.LoginAction" method="manageUserLoginOut"> <interceptor-ref name="defaultStack"></interceptor-ref> </action> <action name="index" class="com.tch.action.LoginAction" method="goToIndex"> <result name="success">/WEB-INF/jsp/manage/index.jsp</result> </action> </package>
将jsp文件放在 WEB-INF下,出于安全性考虑,防止绕过struts直接访问jsp文件。
- 最后再说一下jsp文件里action路径问题
我struts配置的action配置在namespace="/manage"下,index.jsp如下
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>">
<body> 欢迎<%= session.getAttribute("username")%> <form action="manage/loginOut"> <button type="submit" value="">退出登录</button> </form> </body>
命名空间是 namespace="/XXX" 那你form表单中的action应该是
action=XXX/UserLogin.action 最前面没有 / 因为struts2的web.xml 的核心控制器里的
url-pattern 是/* 就是所有的action 都是以/开头 所以表单中的action 属性 = 命名空间/ Action名字.后缀