struts2 的自定义 拦截器
Struts2的 拦截器:
对于拦截器,Struts2官方给出的 定义是:
拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一段代码,在Action执行之前或者之后被调用执行,也可以在一个Action执行前阻止执行,同时也提供了一种可以提取Action中科重用部分的方式。
通俗一点来说,拦截器是一个实现了一定功能的类,它以一种课插拔的方式(所谓可插拔就是指增加和减少某个功能的时候,不会影响到其他功能的实现),被定义在某个Action执行之前或者之后,用来完成特定的功能。
添加了拦截器执后的执行流程图:

它的设计机制就是:当为Action添加功能的时候就配置拦截器,当为Action减少功能的时候就取消配置拦截器
通过这种方法,在Action所需要功能发生变化的时候,我们只要修改拦截器的配置就能轻松实现。
这里是一个自定义拦截登陆的小案例:
1.声明一个类实现Interceptor接口或者继承AbstractInterceptor类
public class LoginInter implements Interceptor{
public void destroy() {
System.out.println("拦截器销毁");
}
public void init() {
System.out.println("拦截器初始化");
}
public String intercept(ActionInvocation actionInvocation) throws Exception {
Map<String, Object> session = ActionContext.getContext().getSession();
String value = "";
StringBuilder stringBuilder = new StringBuilder("");
stringBuilder.append(actionInvocation.getProxy().getNamespace()); //拿到 请求的actionname
stringBuilder.append(actionInvocation.getProxy().getActionName()); //拿到请求的 namespace 路径
String usernmae = (String) session.get("username");
System.out.println(stringBuilder.toString()+"---------------------"+usernmae);
if(stringBuilder.toString().equals("/interlogin")){
value = actionInvocation.invoke(); //放行
}else if(usernmae!=null){
value=actionInvocation.invoke();
}else{
value="login";
}
System.out.println(value+"------------------");
return value;
}
}
这里的意思是:首先判断访问的 url是否是interlogin 就是验证登陆的路径,其次判断登陆成功后的session是否为空,不为空说明已经登陆过了 放行,最后一种情况没有符合前两种情况就让用户重新登陆
value 返回的是逻辑视图名 让value跟配置文件的action中的result去匹配,找到物理视图,返回给用户。
配置文件配置信息:
<!--自定义拦截器 模仿登陆拦截-->
<package name="inter" namespace="/inter" extends="struts-default"> <interceptors>
<interceptor name="logininter" class="inter.LoginInter"></interceptor> <!--指定自定义的拦截器-->
<interceptor-stack name="loginStack"> <!--定义拦截器栈-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="logininter"></interceptor-ref>
</interceptor-stack>
</interceptors> <global-results>
<result name="login">/jsp/login.jsp</result> <!--定义全局路径-->
</global-results> <action name="login" class="action.TestInterAction"> <!--登陆action-->
<result name="success">/jsp/welcome.jsp</result>
<interceptor-ref name="loginStack"></interceptor-ref>
</action> <action name="book" class="action.TestBookAction" > <!--内部访问action-->
<result name="success">/jsp/booksuccess.jsp</result>
<interceptor-ref name="loginStack"></interceptor-ref>
</action> </package>
画个页面:
<title>登陆页面</title>
</head>
<body> <s:form action="/inter/login" method="POST">
<s:textfield name="username"></s:textfield> <br/>
<s:textfield name="pwd"></s:textfield><br/>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
创建Action:
private String pwd;
private String username;
public String execute() throws Exception {
System.out.println(pwd+"-------------"+username);
Map<String, Object> session = ActionContext.getContext().getSession();
if(pwd!=null&&username!=null) {
if (pwd.equals("1") && username.equals("1")) {
session.put("username",username);
System.out.println("login successg");
return SUCCESS;
}else{
return LOGIN;
}
}else if(session.get("username")!=null){
System.out.println("check session");
return SUCCESS;
}else{
System.out.println("return login");
return LOGIN;
}
}
省略get 和set
首先测试在没有登陆的情况下试着访问内部action

后台 打印结果:
/interbook---------------------null
返回登陆
login------------------
返回登陆页面,说明这个简单的session验证登陆成功的拦截非登陆的情况 下访问内部action
测试登陆 ,action有个简单的逻辑判断

点击提交:进入欢迎界面,看后台打印数据,拿到name和pwd 走逻辑判断,返回给拦截器,然后拦截器去匹配配置文件中result
信息: Deploying web application directory D:\Tomcat\Tomcat2\Tomcat 7.0\webapps\manager
十月 25, 2017 2:22:58 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deployment of web application directory D:\Tomcat\Tomcat2\Tomcat 7.0\webapps\manager has finished in 110 ms
/interlogin---------------------null
1-------------1
login successg
判断登陆
success------------------
当再次访问登陆验证时候

/interlogin---------------------1
null-------------null
check session
判断登陆
success------------------
由于登陆成功之后将用户放入session中了,所以再次访问登陆路径的时候,判断的 是session,session不为空说明已经登陆了,返回success
这个时候 就可以访问内部的action

这就是一个简单的sturts2 自定义拦截器小案例!
struts2 的自定义 拦截器的更多相关文章
- struts2基础——自定义拦截器
一.自定义拦截器 默认的拦截器能实现的功能是有限的,Struts2 支持自定义拦截器. 二.拦截器类 1.实现 Interceptor 接口 2.继承 AbstractInterceptor 抽象类, ...
- Struts2透过自定义拦截器实现登录之后跳转到原页面
Struts2通过自定义拦截器实现登录之后跳转到原页面 这个功能对用户体验来说是非常重要的.实现起来其实很简单. 拦截器的代码如下: package go.derek.advice; import g ...
- 【struts2】自定义拦截器
1)什么是自定义的拦截器 所谓自定义的拦截器,就是由我们自己定义并实现的拦截器,而不是由Struts2定义好的拦截器.虽然Struts2的预定义拦截器已经满足了大多数情况的需要.但在有些时候,我们可能 ...
- struts2基础---->自定义拦截器
这一章,我们开始struts2中拦截器的学习. 自定义拦截器
- Struts2笔记——自定义拦截器
需要两个步骤,自定义类实现拦截器接口和在struts.xml注册拦截器 =============================== 1.自定义类实现com.opensymphony.xwork2. ...
- Struts2使用自定义拦截器导致Action注入参数丢失、url参数
写struts2项目时发现前台超链接中的参数无法传到action, 所有带有传递参数的均无法正常使用了,在Action中所有的参数无法被注入. 后来经过debug发现其中的页面都要先经过拦截器,而后再 ...
- 【Struts2】自定义拦截器interceptors
下面给一张图片表示Struts2拦截器的处理流程. 通过这个流程图,我们可以看出一个完整的请求大概的过程为: 请求 -->filter 控制器 --> 拦截器 1/ 拦截器 2--> ...
- struts2自定义拦截器与cookie整合实现用户免重复登入
目的:测试开发时,为了减少用户登入这个繁琐的登入验证,就用struts2做了个简单的struts2拦截器,涉及到了与cookie整合,具体的看代码 结构(两部份)=struts2.xml+自定义拦截器 ...
- 12.Struts2自定义拦截器
12.自定义拦截器 拦截器是Struts2的一个重要特性.因为Struts2的大多数核心功能都是通过拦截器实现的. 拦截器之所以称之为“拦截器”,是因为它可以拦截Action方法的执行, ...
随机推荐
- mysql 从 frm 文件恢复 table 表结构的3种方法
mysql 正常运行的时候,查看 table 的结构并不是困难的事. 但是有时 mysql 发生故障,这种方法便不再可行. 当遇到故障,通常使用新的 mysql 实例来恢复当前的数据. 建表是非常重要 ...
- 为什么HashMap桶(链表)的长度超过8会转换成红黑树?
百度了一下,感觉能说清楚的并不多,所以在此记录一下. 首先说一说转换为红黑树的必要性: 红黑树的插入.删除和遍历的最坏时间复杂度都是log(n), 因此,意外的情况或者恶意使用下导致hashCode( ...
- C++STL 中的容器整体/逐元素操作方法 少写80%for循环
本文中示例代码默认已引用 std 命名空间 累加 (std::accumulate) accumulate(begin, end, init, op) 返回给定区间内元素的累加值与给定初值的和,初值不 ...
- maven摘除jar包中配置文件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-p ...
- lspci命令详解
基础命令学习目录首页 最近经常用到 lspci -nn | grep Eth 命令,需要学习下PCI总线,找到一篇文章,虽然也是转载,但写的较清晰,再次转载下. http://blog.csdn.ne ...
- python数据分析画图体验
对于numpy的函数,pands等,不是很熟,我来copy一下code,敲击一下,找找感觉. 默认的导入包import numpy as npimport matplotlib.pyplot as p ...
- Notes of Daily Scrum Meeting(11.13)
Notes of Daily Scrum Meeting(11.13) 今天邹欣老师给我们讲课大家还是很有收获的,大家课堂的参与度确实有了很大的提升,而且邹欣老师关于项目Scrum Meeting报告 ...
- H-ui框架制作选项卡
本案例运用H-ui框架,写了一个选项卡案例 1. html代码(固定这样写,用一个div包裹控制条tabBar和内容条tabCon) <div id="tab-index-carteg ...
- CentOS7服务器上搭建Gitlab
Gitlab如何搭建? 安装gitlab所需要的依赖 sudo yum install curl policycoreutils openssh-server openssh-clients 使ssh ...
- 增加ubuntu的内存——设置Swap增加内存
1.查看一下当前Swap分区的状态: $cat /proc/meminfo SwapTotal: 0 kB SwapFree: 0 kB 如果上面二项目都为0,说明没有Swap分区:如果不为0,则说明 ...