一个关于struts2自定义拦截器使用的例子,觉得很好,记录下来,以备后用。
要求:建立一个拦截器,用户名后缀为“r”的才允许访问“/sec”命名空间下的所有 action。 (拦截器、struts.xml,需 要定义拦截器堆栈、缺省拦截器引用等)
- 关于拦截器的基础知识可以查看拦截器的使用网上教程一大堆,自己随便搜搜就有了,在此不加探讨。
一、项目结构图
二、主要jsp文件(部分省略)
<!--login.jsp -->
<body>
<form action="sec/login.action" method="post">
<br>用户名:<input type="text" name="userName"/><br>
<br>密码:<input type="submit" value="提交"/>
</form>
</body>
<!-- login_check_suc.jsp -->
<body>
<a href="sec/add.action">添加</a><br>
<a href="update.action">修改</a><br>
<a href="delete.action">删除</a><br>
<a href="query.action">查看</a><br>
</body>
Action代码
package experimentThree;
import com.opensymphony.xwork2.ActionSupport;
public class HandlerAction extends ActionSupport {
/**
* 处理用户Action逻辑
*/
private static final long serialVersionUID = 1L;
public String add(){
return SUCCESS;
}
public String delete(){
return SUCCESS;
}
public String update(){
return SUCCESS;
}
public String query(){
return SUCCESS;
}
}
package experimentThree;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport implements SessionAware {
/**
* 处理登录的action类
*/
private static final long serialVersionUID = 1L;
private String userName;
private Map<String, Object> sessionMap;
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserName(){
return userName;
}
@Override
public void setSession(Map<String, Object> arg0) {
// TODO Auto-generated method stub
sessionMap=arg0;
sessionMap.put("userName", userName);
}
public String execute(){
/*if(userName!=null){
sessionMap.put("userName", userName);
return SUCCESS;
}else{
return LOGIN;*/
return SUCCESS;
//}
}
}
package experimentThree;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;;
public class LoginCheck extends AbstractInterceptor {
/**
* 用户登录检查拦截器Action
*/
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//通过核心调度器invocation来获得调度的上下文
HttpServletRequest request = ServletActionContext.getRequest();
//ActionContext actionContext=invocation.getInvocationContext();
//获得session对象
//Map<String, Object>sessionMap=actionContext.getSession();
//从session中取出名为userName的session属性
//String userNameString=(String) sessionMap.get("userName");
String userNameString = request.getParameter("userName");
if (!userNameString.endsWith("r")) {
((ActionSupport) invocation.getAction())
.addActionMessage("用户名的最后一个字母不是r!!!");
System.out.println("这里就应该输出的是:" + userNameString);
return Action.LOGIN;
}
return invocation.invoke();
}
}
三、struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="disp" namespace="/sec" extends="struts-default">
<interceptors>
<!-- 定义拦截器 -->
<interceptor name="loginInterceptor" class="experimentThree.LoginCheck">
</interceptor>
<!-- 定义拦截器栈-->
<interceptor-stack name="myStack">
<!-- 使用拦截器loginInterceptor -->
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<!--使用内置拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<global-results>
<!-- 定义全局Result -->
<result name="login">login.jsp</result>
</global-results>
<!--配置登录Action -->
<action name="login" class="experimentThree.LoginAction">
<interceptor-ref name="myStack"></interceptor-ref>
<result>login_check_suc.jsp</result>
</action>
<!--配置handleEvent的action -->
<action name="*" class="experimentThree.HandlerAction" method="{1}">
<result>{1}.jsp</result>
</action>
</package>
</struts>
四、测试
(1)首页
(2)输入错误时,返回主页,并在控制台提示
(3)输入正确时,进入管理页面
五、参考文献
【1】struts2框架应用教程 清华大学出版社 陈恒、张一鸣编著