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 自定义拦截器小案例!

最新文章

  1. linux下软件安装与升级
  2. js数组方法push pop shift unshift的返回值
  3. ES6函数剩余参数(Rest Parameters)
  4. Node.js高级编程读书笔记Outline
  5. Gradle 修改 Maven 仓库地址
  6. Android LayoutInflater原理分析
  7. 安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案(原创) (2016-10-29 下午01:56)
  8. Yslow&amp;PageSpeed– 诊断各种缓慢症状
  9. CentOS搭建Httpd Pyhton3 Django环境
  10. 自己写的Dapper通用数据访问层
  11. Spring 使用介绍(七)—— Spring事务
  12. 好久没考虑过的 sql 注入
  13. 使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句
  14. hdu 2923 map+Floyd 拉破车
  15. 测试RemObjects Pascal Script
  16. Android build.gradle
  17. shell条件判断
  18. Java 学习笔记(1)——java基础语法
  19. Docker CPU Usage
  20. Python学习笔记(2.1)函数参数练习

热门文章

  1. TensorFlow --- 01初识
  2. printf命令详解
  3. pkill命令详解
  4. Scrum Meeting 11.1
  5. Go Going软件需求规格说明书
  6. HDU 4418 Time travel 期望dp+dfs+高斯消元
  7. POJ 1112 Team Them Up! 二分图判定+01背包
  8. 第一次spring冲刺第6天
  9. DPDK网卡绑定
  10. OpenGL三维与光照