1. 拦截器创建
拦截器生命周期:随项目的启动而创建,随项目关闭而销毁
方式一:
//拦截器:第一种创建方式
//拦截器生命周期:随项目的启动而创建,随项目关闭而销毁
public class MyInterceptor implements Interceptor {
@Override
//初始化方法
public void init() {
}
@Override
//拦截方法
public String intercept(ActionInvocation arg0) throws Exception {
return null;
}
@Override
//销毁方法
public void destroy() {
}
}
方式二:
//创建方式2: 继承AbstractInterceptor -> struts2的体贴
//帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法
public class MyInterceptor2 extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation arg0) throws Exception {
return null;
}
}
方式三:
//继承:MethodFilterInterceptor 方法过滤拦截器
//功能: 定制拦截器拦截的方法.
// 定制哪些方法需要拦截.
// 定制哪些方法不需要拦截
public class MyInterceptor3 extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//前处理
System.out.println("MyInterceptor3 的前处理!");
//放行
String result = invocation.invoke();
//后处理
System.out.println("MyInterceptor3 的后处理!");
// 根据结果来进行页面的跳转处理
return result;
}
}
2. 拦截器配置
拦截action的请求
Demo1Action
public class Demo1Action extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("Demo1Action");
return SUCCESS;
}
}
拦截器MyInterceptor3
//继承:MethodFilterInterceptor 方法过滤拦截器
//功能: 定制拦截器拦截的方法.
// 定制哪些方法需要拦截.
// 定制哪些方法不需要拦截
public class MyInterceptor3 extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
//前处理
System.out.println("MyInterceptor3 的前处理!");
//放行
String result = actionInvocation.invoke();
//后处理
System.out.println("MyInterceptor3 的后处理!");
return result;
}
}
在配置中设置哪些方法进行拦截,哪些方法不拦截
add,delete,execute
/index.jsp
/hello.jsp
3. 登录拦截
- 提供登录的action
public class UserAction extends ActionSupport implements ModelDriven {
private UserService userService = new UserServiceImpl();
private User user = new User();
public String login() throws Exception {
User u = userService.findUser(user);
ActionContext.getContext().getSession().put("user", u);
return "toHome";
}
@Override
public User getModel() {
return user;
}
}
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public User findUser(User user) {
Session session = HibernateUtils.getCurrentSession();
// 开启事务
session.beginTransaction();
User findUser = userDao.findUser(user);
// 提交事务
session.getTransaction().commit();
if (findUser == null) {
throw new RuntimeException("账户名不存在");
}
if (!findUser.getUser_password().equals(user.getUser_password())) {
throw new RuntimeException("密码错误");
}
return findUser;
}
}
public class UserDaoImpl implements UserDao {
@Override
public User findUser(User user) {
Session session = HibernateUtils.getCurrentSession();
String hql = "from User where user_code = ?";
Query query = session.createQuery(hql);
query.setParameter(0, user.getUser_code());
User user1 = (User) query.uniqueResult();
return user1;
}
}
- 提供
登录过滤器LoginInterceptor
public class LoginInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
// 1. 获取session
Map session = ActionContext.getContext().getSession();
// 2.获取登录标识
User user = (User) session.get("user");
// 3.判断登录标识是否存在
if (user == null) {
return "toLogin";
} else {
actionInvocation.invoke();
}
return null;
}
}
- 配置文件中进行配置
注意点:
1.指定包中的默认拦截器栈,并且指定过滤哪些方法
2.定义全局结果集,用来给所有的Action进行统一的结果处理
3.定义全包的异常处理,error对应到相应的结果集
login
/login.jsp
/jsp/customer/list.jsp
CustomerAction_list
/
/index.htm
/login.jsp
jsp页面登录拦截