【SSH网上商城】拦截器实现后台权限校验

45 阅读3分钟

叙述

==

什么是拦截器


java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

拦截器原理


大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。Struts2拦截器是可插拔的,拦截器是AOP的一种实现。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

与过滤器的区别


过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为“拒你所想拒”,关心 你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。

1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。

2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。

3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。

4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能。

5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。

定义一个拦截器步骤


自定义一个拦截器需要三步:

1 .自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。

2 .在struts.xml中注册上一步中定义的拦截器。

3 .在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。

代码实现拦截器


1、编写一个PrivilegeInterceptor.java类实现Interceptor接口

package cn.itcast.shop.interceptor;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

import cn.itcast.shop.adminuser.vo.AdminUser;

/*

  • 后台权限校验的拦截器

*/

public class PrivilegeInterceptor extends MethodFilterInterceptor {

@Override

// 执行拦截器方法

protected String doIntercept(ActionInvocation actionInvocation) throws Exception {

// 判断session中是否保存了后台的用户的信息

// 判断是否登录,如果登录,放行,没有登录,跳转到登录页面.

AdminUser adminUser = (AdminUser) ServletActionContext.getRequest().getSession().getAttribute("existAdminUser");

if (adminUser != null) {

// 已经登录过

return actionInvocation.invoke();

} else {

// 跳转到登录页面:

ActionSupport support = (ActionSupport) actionInvocation.getAction();

support.addActionError("您还没有登录!没有权限访问!");

return ActionSupport.LOGIN;

}

}

}

2、在Struts.xml中配置拦截器

3、使用拦截器

在配置用户、配置后台一级分类管理的Action、配置后台二级分类管理的Action、配置商品管理的Action、配置后台订单管理的Action中使用拦截器。

/admin/category/list.jsp