struts2拦截器(四)
struts2拦截器原理:
当请求action时,struts2会查找配置文件,并根据配置实例化相对的 拦截器对象,然后串成一个列表,然后一个一个的调用列表中的拦截器。
比如:某些页面必须登录才可以访问,可以在每个action执行处理逻辑之前先判断是否已登录,但这种做法不利于代码复用,所以将这些检查是否登录的代码放到拦截器中进行。
自定义拦截器:
自定义拦截器首先要实现com.opensymphony.xwork2.interceptor.Interceptor接口,该接口有三个方法,init、destroy、intercept方法。
init():在服务器启动时加载一次,并且只加载一次。
destroy():当拦截器销毁时执行的方法。
Interceptor():拦截器核心方法,其中有一个参数actionInvocation。
actionInvocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器再返回给视图,也就是调用后面的action继续执行。
创建拦截器:
package com.struts2.web; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; //第一种创建方式 实现com.opensymphony.xwork2.interceptor.Interceptor接口
//拦截器生命周期:随着项目启动而创建,项目关闭而销毁
public class MyInterceptor implements Interceptor {
@Override
//初始化
public void init() { } @Override
//核心拦截方法
public String intercept(ActionInvocation actionInvocation) throws Exception {
return actionInvocation.invoke();
} @Override
//销毁
public void destroy() { }
}
package com.struts2.web; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; //第二种方式:继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类
public class MyInterceptor2 extends AbstractInterceptor {
@Override
//直接实现拦截方法
public String intercept(ActionInvocation actionInvocation) throws Exception {
return actionInvocation.invoke();
}
}
package com.struts2.web; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
//第三种方式:继承com.opensymphony.xwork2.interceptor.MethodFilterInterceptor类
public class MyInterceptor3 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
//前处理
actionInvocation.invoke(); //放行
//后处理
return null;
}
}
第三种方式 MethodFilterInterceptor是继承了第二种方式的AbstractInterceptor类 第二种方式实现了第一种方式的Interceptor接口。
拦截器API
放行:actionInvocation.invoke();
前处理:放行前代码
后处理:放行后代码
不放行直接跳转到结果页面:return "success" 返回一个字符串,不执行后续的拦截器以及action。直接跳转到一个页面
拦截器配置
<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<!--注册拦截器-->
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<!--注册拦截器栈 -->
<interceptor-stack name="myStack">
<!--加入自定义的拦截器 -->
<interceptor-ref name="MyInterceptor3"></interceptor-ref>
<!--引用默认的拦截器栈(20个)-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!--指定包中的默认拦截器栈 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="Demo1Action" class="com.struts2.web.Demo1Action" method="execute">
<result name="success">/demo1.jsp</result>
</action>
</package>
此时执行包中的action就会走拦截器的前处理 放行到action处理 最后后处理
指定方法调用拦截器
修改demo1 为多个方法的
public class Demo1Action extends ActionSupport {
public String execute(){
System.out.println("Demo1 Action execute");
return SUCCESS;
}
public String register(){
System.out.println("Demo1 Action register");
return SUCCESS;
}
public String login(){
System.out.println("Demo1 Action login");
return SUCCESS;
}
}
修改配置文件支持动态方法
<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="MyInterceptor3"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<global-allowed-methods>execute,login,register</global-allowed-methods>
<action name="Demo1Action_*" class="com.struts2.web.Demo1Action" method="{1}">
<result name="success">/demo1.jsp</result>
</action>
</package>
此时访问三个方法都是走拦截器的,修改配置文件如下
<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="MyInterceptor3">
<!--指定哪些方法不拦截-->
<param name="excludeMethods">login,register</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<global-allowed-methods>execute,login,register</global-allowed-methods>
<action name="Demo1Action_*" class="com.struts2.web.Demo1Action" method="{1}">
<result name="success">/demo1.jsp</result>
</action>
</package>
然后访问 login、register都不走自定义的拦截器了 includeMethods 哪些拦截 excludeMethods哪些方法不拦截 只可设置一种
实现登陆拦截器
public class MyInterceptor3 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception { Map<String, Object> session = ActionContext.getContext().getSession();
Object user = session.get("user");
//已登陆 放行
if(user != null){
return actionInvocation.invoke();
}else{
//没登陆 去登陆页面
return "toLogin";
}
}
}
全局配置结果集
<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="MyInterceptor3">
<param name="excludeMethods">login,register</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!--定义全局结果集 -->
<global-results>
<result name="toLogin" type="redirect">login.jsp</result>
</global-results>
<global-allowed-methods>execute,login,register</global-allowed-methods>
<action name="Demo1Action_*" class="com.struts2.web.Demo1Action" method="{1}">
<result name="success">/demo1.jsp</result>
</action>
</package>
登陆代码
ActionContext.getContext().getSession().put("user","name");
前台 访问execute 自动跳转到登陆页面 登陆后 在访问execute 正常
struts2拦截器(四)的更多相关文章
- Struts2 拦截器配置以及实现
@(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...
- 浅谈Struts2拦截器的原理与实现
拦截器与过滤器 拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...
- (三)Struts2 拦截器
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:拦截器简介 (百度百科Struts2) Struts2 拦截器是在访问某 ...
- Struts2拦截器总结<转>
由于项目中在登录跳转到其他应用程序模块的时候有用到拦截器,因此查看了一下相关资料. 原文地址:http://blog.csdn.net/sendfeng/article/details/4248120 ...
- Struts2拦截器配置实例
拦截器介绍 拦截器 的使用 ,源自Spring AOP(面向切面编程)思想 拦截器 采用 责任链 模式 * 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链. * 责任链每一个节 ...
- struts2(五)之struts2拦截器与自定义拦截器
前言 前面介绍了struts2的输入验证,如果让我自己选的话,肯定是选择xml配置校验的方法,因为,能使用struts2中的一些校验规则,就无需自己编写了, 不过到后面应该都有其他更方便的校验方法,而 ...
- struts2拦截器interceptor的配置方法及使用
转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2 NormalText Code ...
- struts2 拦截器
拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...
- Struts2拦截器的使用 (详解)
Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...
随机推荐
- zabbix实现163邮件报警
Zabbix 邮件报警 电脑登录网易邮箱配置,把自己的授权码看一下,并写入配置文件 server端安装配置邮件服务器 [root@server ~]# yum -y install mailx dos ...
- windows上关闭Nagle算法
下面的设置可以调整或禁用 nagel 算法.禁用 nagel 算法以后, 允许很小的包没有延迟立即发送.建议对某些游戏关闭 nagel 算法, 这样做对文件传输/吞吐量有负面影响.默认状态( 开启na ...
- vue和iview中native点击事件修饰
在父组件中给子组件绑定一个原生的事件,就将子组件变成了普通的HTML标签,不加'. native'事件是无法触 在vue中使用iview的dropdownMenu 上单纯的@click也不生效,要写成 ...
- c++ list双向链表管理对象
#cat list.cc #include <cstdlib> #include <iostream> #include <stdio.h> using names ...
- js-2018-11-01 关于break和continue语句
1.label语句 语法:label: statement 加标签语句一般都要与for语句等循环语句配合使用. 2.break语句 立即退出循环,强制执行循环后面的语句. 3.continue语句 立 ...
- PHP学习方向-进阶2(三)
实践篇 给定二维数组,根据某个字段排序 如何判断上传文件类型,如:仅允许 jpg 上传 不使用临时变量交换两个变量的值 $a=1; $b=2; => $a=2; $b=1; strtoupper ...
- python 易忘操作整理
>>> l=[1,2,3,4,5] >>> s='$'.join(str(i) for i in l) >>> print(s,end=" ...
- 关于PyQt5,在pycharm上的安装步骤及使用技巧
前序 之前学习了一款GUI图形界面设计的Tkinter库,但是经大佬的介绍,PyQT5全宇宙最强,一脸的苦笑 毫不犹豫的选择转战PyQT5,在学习之前需要先安装一些必须程序,在一番查阅后,发现PyQt ...
- 【ACM】hdu_1808_Halloween treats_201308132022
Halloween treats Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- MVC.Net:添加第三方类库的bundles引用
以jQuery Mobile为例.当我们用nuget添加jQuery Mobile的package后,需要在项目中引用jQuery Mobile.传统的做法是在html页面上添加 <link h ...