直接进入主题吧!
一,配置Struts2的拦截器分两步走
1配置对应的拦截器类:
2在配置文件Struts.xml中进行配置拦截器
同时在Strust2中配置拦截器类有三种方法
1实现Interceptor接口
2继承AbstractInterceptor
3通过继承MethodFilterInterceptor类
区别:
是否支持方法过滤性:
使用第1,2 种其实都差不多,都会拦截Action中所有的方法,但是第3种就不一样了,因为第3种支持方法过滤性,可以指定我们想要拦截的方法,(使用includeMethods指明需要拦截的方法-,使用excludeMethods指明拦截器不需要拦截的方法,所以我们通常采用第3种来配置struts2的拦截器。
3通过继承MethodFilterInterceptor类,重写doIntercept方法
-------该例子的主要作用: 校验用户是否登录,(通过判断该session中用户名是否为空)若用户登录则跳转到管理界面,若未登录则跳转到登录界面。

public class RockStar extends MethodFilterInterceptor{
//重写doInterceptor来实现我们的拦截配置-----Action Invocation是Action的调用者, 该实例代表一个action的执行状态,持有拦截器和将要执行的action的实例。
protected String doIntercept(ActionInvocation invocation) throws Exception {
//获得ActionCotext实例(ActionContext中包含了Session)
ActionContext actionContext=ActionContext.getContext();
//获得对应的Session,ActionContext其实就是一个很大的map映射结构,使用key来映射value
Map<String,Object> session=actionContext.getSession();
//获得session中对应的属性(该属性置为类对象,进行强制转换)
String username=(String)session.get("username");
//判断该session中是否存在对应的数据,来知道该用户是否登录
if(username!=null&&sername.equals("cchh")
{
//存在则放行
System.out.println("该用户合法...."+username);
//接下来的这个方法的作用是通知Struts2接着去干该干的事情,比如调用下一个拦截器或者执行下一个Action,相当于退出了当前这个interceptor了
return invocation.invoke();
}
else {
System.out.println("该用户未登录...");
//若校验失败,则返回一个login字符串,进入登录界面
return "login";
}
}
}
有很多人,可能对与ActionContext很疑惑,对Map也很疑惑,接着来看,你就会明白了,一切都有它的道理!
重点讲解一下,ActionContext----action的上下文,
简化版:
Struts----根据request---->创建ActionContext{Session,parameter等},以map形式,key/value存放数据对象------通过getContext---->获得当前ActionContext
详细版:
1Strusts2会根据Request给每个执行对应Http请求的线程来创建对应的ActionContext
------->即一个Request线程有一个唯一的ActionContext
------->我们可以使用静态方法getContext()
------->来获得当前线程的ActionContext(Sturts只会给request请求创建的线程创建一个ActionContext)

2同时该ActionContext中保存了一些在Action执行过程中所需要的对象和数据,比如Session,parameters等,并使用Map集合的形式,这也就是为什么我们可以通过Action Context来获得对应的session,原来是因为其被存储在了Action上下文中

二在配置文件Struts.xml中进行配置拦截器
步骤:
1注册我们所敲的拦截器类
2定义一个拦截器栈,并在该栈中配置对应的拦截器,同时可以在对应的拦截器中配置拦截哪些方法,不拦截哪些方法
3通常我们会配置<default-interceptor-ref name="拦截器栈名"/>来自动拦截所的action
4也可以通过<interceptor-ref name="拦截器栈名"/>

<package name=default" extends="struts-default" namespace"/">
<interceptors>
<!--1注册拦截器-->
<interceptor name="rockStar" class="com.ali.demo.Rockstar”>
</intertceptor>
<!--配置拦截器栈-->
<interceptor-stack name="myStack">
<!--Struts默认执行的拦截器-->
<interceptor-ref name="defaultStack"></interception-ref>
<!--注意这个地方,要将默认的拦截器放置在最前面,这样struts2才会默认加载必须要加载的拦截器-->
<interceptor-ref name="rockstar">
<!--指定哪些方法不拦截,exclude,排除的意思-->
<param name="excludeMethods">login</param>
</intercepor-ref>
</interceptor-stack>
</interceptors>
//为所有的Action自动调用拦截器栈
//<default-interceptor-ref name="myStack"></default-interceptor-ref>

------------------------以上完成了拦截器的注册和配置
1若方法被拦截,则会直接从拦截器处返回,不会接着继续执行。
2若该方法未被拦截,那么会接着往下进行执行,
同时可以使用标签<interceptor-ref name="myStack" />来给对应的类指定拦截器栈

<!--通过Action访问后台管理页面-->
<action name="auth">
<result>/WEB-INF/jsp/manage.jsp</result>
<!--校验失败的返回路径,对应拦截器中的字符串login-->
<result name="login">/login.jsp</result>
<!--在该action中引用对应的拦截器栈-->
<interceptor-ref name="myStack" ></interceptor-ref>
</action>

<action name="manager" class="userAction" method={1}>
<result name="name">/WEB-INF/jsp/manage.jsp</result>
<result name="error">/login.jsp</result>
</action>
</package>

以上就是对于Struts2中拦截器的解答了!

SpringMVC拦截器配置
接下来再看看SpringMVC的拦截器配置,比起Struts2会简单很多
首先了解SpringMVC的拦截器中,主要通过实现HandlerInterceptor接口类,并重写其三个方法,分别是前preHandler(在请求到达Controller之前,进行拦截) 中postHandler(在请求达到了Controller中,且ModelandView参数未返回之前)后afterHandler(在执行完该方法之后)
同样是两步:
1编写拦截器类:

public class SpMvc implements HandlerInterceptor{
**//请求到达Controller之前**
public boolean preHandle (HttpServletRequest request,HttpServletResponse reponse,Object obj) throws Exception{
**//获得Session,**
HttpSession session=request.getSession();
**//从session中取得对应的值**
String name=(String) session.getAttribute("name");
**//判断该值是否存在**
if(name!=null&&name.equals("cchh"){
System.out.println("用户合法,通过拦截");
return true;//**这里true代表通过拦截器**
}
else
response.sendRedirect("index");//将页面跳转到index页面
return false;//**这里 false代表被拦截**
}
//**在请求达到了Controller中,且ModelandView参数未返回之前**
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView mav)
throws Exception{
System.out.println("此时正在执行方法中....");
}
**//在请求方法执行完毕之后,对象中就没有对应的ModelAndView参数了**
public class afterHandle(HttpServletRequest request,httpServletResponse response,Object obj) throws exception{
System.out.println("执行方法之后....");
}
}
2在SpringMVC中配置对应的拦截器
SpringMVC拦截器的配置相对于Struts2来说,相对简单很多
主要有
1配置拦截器类的拦截器
2设置要拦截的请求<mvc:mapping/>struts2中是<param name="includeMethods"/>
3设置不拦截的请求<mvc:exclude-mapping/>struts2中是<param name="excludeMethods">

<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截器所在的类路径-->
<bean class="com.ali.demo.SpMvc"/></bean>
<!--拦截的请求,拦截的请求-->
<mvc:mapping path="/**"/>
<!--不拦截的请求-->
<mvc:exclude-mapping path="/loginController/login.do"/>
<./mvc:interceptor>
</mvc:interceptors>

通俗易懂之SpringMVC&Struts2前端拦截器详解的更多相关文章

  1. struts2 18拦截器详解(七)

    ChainingInterceptor 该拦截器处于defaultStack第六的位置,其主要功能是复制值栈(ValueStack)中的所有对象的所有属性到当前正在执行的Action中,如果说Valu ...

  2. struts2 18拦截器详解(十)

    ModelDrivenInterceptor 该拦截器处于defaultStack中的第九的位置,在ScopedModelDrivenInterceptor拦截器之后,要使该拦截器有效的话,Actio ...

  3. struts2 18拦截器详解(九)

    ScopedModelDrivenInterceptor 该拦截器处于defaultStack第八的位置,其主要功能是从指定的作用域内检索相应的model设置到Action中,该类中有三个相关的属性: ...

  4. struts2 18拦截器详解(五)

    I18nInterceptor 该拦截器处理defaultStack第四的位置,是用来方便国际化的,如果说我们的一个Web项目要支持国际化的话,通常的做法是给定一个下拉框列出所支持的语言,当用户选择了 ...

  5. struts2内置拦截器和自定义拦截器详解(附源码)

    一.Struts2内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截 ...

  6. Struts2 之 modelDriven & prepare 拦截器详解

    struts2 ModelDriven & Prepareable 拦截器 前面对于 Struts2 的开发环境的搭建.配置文件以及 Struts2 的值栈都已经进行过叙述了!这次博文我们讲解 ...

  7. SpringMVC拦截器详解[附带源码分析]

    目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...

  8. SpringMVC拦截器详解

    拦截器是每个Web框架必备的功能,也是个老生常谈的主题了. 本文将分析SpringMVC的拦截器功能是如何设计的,让读者了解该功能设计的原理. 重要接口及类介绍 1. HandlerExecution ...

  9. Struts2拦截器详解

    一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列 ...

随机推荐

  1. CODEVS3147 矩阵乘法2

    ...怎么优化都是90分,最后一个点一直T掉,有谁过了请告诉我. Program CODEVS3147; ; ..maxn,-..maxn] of longint; n,q,i,j,k,k1,k2,k ...

  2. nyoj_19_擅长排列的小明_201403011600

    擅长排列的小明时间限制:1000 ms  |  内存限制:65535 KB 难度:4描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他, ...

  3. PDF在线预览-pdfjs使用

    请参考我的开源: https://github.com/wuyechun2018/itools/blob/master/src/main/webapp/WEB-INF/views/pdf/index. ...

  4. SAP 金税接口增强 BADI

      SAP与金税连接有两种方式:组件接口及文本接口. 文本接口为例: 1.SAP取发票数据.主要来自合同,销售订单,交货单.发票,客户供应商主数据等 2.SAP处理:合并.拆分,折扣等 3.导出TXT ...

  5. QPS计算

    案例:公司xiaoyb性能测试评估 我们预估支持500家学校,每所学校300人,每天有10%的活跃率,每天有500*300*10%=15000人,每人每天平均请求20次,每天大概请求时间共8小时,80 ...

  6. URAL 1601. AntiCAPS (strings)

    1601. AntiCAPS Time limit: 0.5 second Memory limit: 64 MB The blonde Angela has a new whim: internet ...

  7. extjs的formpanel横向滚动条的解决办法

    关于formpanel设置autoscroll:true同时出现横向和纵向滚动条的解决办法: 不要设置autoscroll属性,或者autoscroll:false,然后设置bodyStyle : ' ...

  8. android.os.Process.killProcess(android.os.Process.myPid())与Activity生命周期的影响

    如果通过finish方法结束了一个Activity,那么根据Activity的生命周期,则会自动调用Activity的销毁方法onDestory(),但是在项目中遇到这样的一个问题,就是​Activi ...

  9. mysql数据库操作(1)

    1.mysql 数据库备份: 语法: MYSQLDUMP -uUSER -pPASS DataBase > Path 其中:USER 是用户名,PASS 是密码,DataBase 是数据库名, ...

  10. 【概念的辨异】—— ISO C 与 POSIX C(C standard library 与 C POSIX library)

    ISO C 表示 C Standard Library,也就是 C 标准库. 二者的主要区别在于: POSIX 是 C 标准库的超集(也即是从内容上,C 标准库是 POSIX 库的一部分,POSIX ...