第十篇——Struts2的拦截器栈
拦截器栈:
从结构上看:拦截器栈相当于多个拦截器的组合;
从功能上看:拦截器栈也是拦截器。
默认拦截器栈:
在struts-core.jar包中的struts-default.xml中自定义了一个default拦截器栈,并且将其指定为默认拦截器栈;
只要定义包的过程中继承了struts-default包,那么默认defaultStack将是默认的拦截器
当包中的某个action显示指定某个拦截器,那么默认的拦截器将不会生效
拦截器栈中的各个拦截器的顺序很重要(一般将默认拦截器器栈放在前面)
项目实例:
1、项目结构
2、pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ray</groupId> <artifactId>struts2Test</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>struts2Test Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.16</version> </dependency> </dependencies> <build> <finalName>struts2Test</finalName> </build> </project>
3、web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <display-name>Archetype Created Web Application</display-name> <!-- 过滤所有请求交给Struts2处理 --> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter </filter-class> <!--action后缀(方法二)--> <!--<init-param>--> <!--<param-name>struts.action.extension</param-name>--> <!--<param-value>ray</param-value>--> <!--</init-param>--> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
4、login4.jsp
<%@ taglib prefix="s" uri="/struts-tags" %> <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>用户登录</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <s:form action="login4" method="POST"> <font color="red">${loginError}</font><br> 用户名:<input type="text" name="username"><br> 密 码:<input type="password" name="password"><br> <input type="submit" value="登录"> <input type="reset" value="重置"> </s:form> </body> </html>
5、manager.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>管理界面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 欢迎进入管理页面,该页面只有登录用户才能访问! </body> </html>
6、LoginAction4.java
package com.ray.action; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.interceptor.SessionAware; import java.util.Map; /** * Created by Ray on 2018/3/26 0026. **/ public class LoginAction4 extends ActionSupport implements SessionAware { private String username; private String password; private Map<String,Object> session; @Override public String execute() throws Exception { if("admin".equals(username) && "123".equals(password)){ session.put("userInfo",username); session.remove("loginError"); return SUCCESS; }else{ session.put("loginError","用户名或密码错误"); session.remove("userInfo"); return "login"; } } public void setSession(Map<String, Object> session) { this.session = session; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Map<String, Object> getSession() { return session; } }
7、AuthInterceptor.java
package com.ray.interceptor; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import java.util.Map; /** * Created by Ray on 2018/3/26 0026. **/ public class AuthInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation) throws Exception { //获取session ActionContext context = ActionContext.getContext(); Map<String,Object> session = context.getSession(); if(session.get("userInfo") != null){ //已登录 String result = invocation.invoke(); return result; }else{ //未登录 session.put("loginError","请先登录"); return "login"; } } }
8、tenth-struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="default" extends="struts-default" namespace="/"> <!-- 注册拦截器 --> <interceptors> <interceptor name="auth" class="com.ray.interceptor.AuthInterceptor"/> <interceptor-stack name="authStack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="auth"/> </interceptor-stack> </interceptors> <!-- 通过此Action访问后台管理页面 --> <action name="auth"> <result>/manager.jsp</result> <result name="login">/login4.jsp</result> <interceptor-ref name="authStack"/> </action> <action name="login4" class="com.ray.action.LoginAction4"> <result>/manager.jsp</result> <result name="login">/login4.jsp</result> </action> </package> </struts>
9、struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- action后缀(方法一) --> <!--<constant name="struts.action.extension" value="ra"/>--> <package name="default" namespace="/" extends="struts-default"> <!-- 默认action --> <default-action-ref name="404"/> <action name="404"> <result>/404.jsp</result> </action> <action name="helloWorld" class="com.ray.action.HelloWorldAction"> <result name="success">/success.jsp</result> </action> </package> <!--<include file="second-struts.xml"/>--> <!--<include file="third-struts.xml"/>--> <!--<include file="fourth-struts.xml"/>--> <!--<include file="seventh-struts.xml"/>--> <!--<include file="eighth-struts.xml"/>--> <!--<include file="ninth-struts.xml"/>--> <include file="tenth-struts.xml"/> </struts>
10、页面效果
10.1 未登录直接访问
10.2 登录成功
10.3 登录成功后访问
ok!
第十篇——Struts2的拦截器栈的更多相关文章
- Struts2默认拦截器栈及内建拦截器使用具体解释
Struts2内建拦截器介绍: alias (别名拦截器):同意參数在跨越多个请求时使用不同别名,该拦截器可将多个Action採用不同名字链接起来,然后用于处理同一信息. autowiring ...
- 第九篇——Struts2的拦截器
拦截器: Struts2大多数核心功能都是通过拦截器实现的,每个拦截器完成某项功能: 拦截器方法在Action执行之前或之后执行. 工作原理: 拦截器的执行过程是一个递归的过程 action请求--& ...
- Struts(十七):通过CURD来学习paramsPrepareParams拦截器栈
背景: 通过上一章节<Struts(十六):通过CURD来学习Struts流程及ModelDriven的用法>学习了ModelDriven拦截器的用法,上章节中讲到了edit功能. 要修改 ...
- struts2之拦截器
1. 为什么需要拦截器 早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足.可扩展性降低, Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于 ...
- 【跟我一步一步学Struts2】——拦截器
前言 前面提到过拦截器.而且说拦截器仅仅能拦截Action.这里拦截器的调用体现了责任链模式.为什么说体现了责任链模式呢? 以下的一段话说的非常明确: Struts2将整个运行划分成若干同样类型的元素 ...
- struts2 paramsPrepareParamsStack拦截器简化代码(源码分析)
目录 一.在讲 paramsPrepareParamsStack 之前,先看一个增删改查的例子. 1. Dao.java准备数据和提供增删改查 2. Employee.java 为model 3. E ...
- 【Java EE 学习 69 上】【struts2】【paramsPrepareParamsStack拦截器栈解决model对象和属性赋值冲突问题】
昨天有同学问我问题,他告诉我他的Action中的一个属性明明提供了get/set方法,但是在方法中却获取不到表单中传递过来的值.代码如下(简化后的代码) public class UserAction ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 从源代码分析modelDriven拦截器和params拦截器和拦截器prepare 和paramsPrepareParamsStack拦截器栈(让你的Struts2代码更简洁——如何培养框架设计能力
源代码文件:Web App Libraries/struts2-core-2.3.15.3.jar/struts-default.xml 拦截器modelDriven: <interceptor ...
随机推荐
- netty 的 Google protobuf 开发
根据上一篇博文 Google Protobuf 使用 Java 版 netty 集成 protobuf 的方法非常简单.代码如下: server package protobuf.server.imp ...
- Java Spring MVC 错误 及 常见问题 总结
[参考]spring入门常见的问题及解决办法 错误: 从Git新获取项目 运行出现 1.org.springframework.beans.factory.BeanDefinitionStoreExc ...
- centos7 nginx Failed to read PID from file /run/nginx.pid: Invalid argument 解决方法
笔者在centos7上,配置nginx代理服务后, systemctl status nginx.service 提示错误 Failed to read PID from file /run/ngin ...
- FastJSON 设置默认参数,全局配置方式 和 一些使用方式、坑
如果要被序列化的对象含有一个date属性或者多个date属性按照相同的格式序列化日期的话,那我们可以使用下面的语句实现: 在应用的的Main方法体里配置全局参数: JSONObject.DEFFAUL ...
- linux shell的here document用法(cat << EOF)
什么是Here Document?Here Document 是在Linux Shell 中的一种特殊的重定向方式,它的基本的形式如下cmd << delimiter Here Docu ...
- cs231n笔记(二) 最优化方法
回顾上一节中,介绍了图像分类任务中的两个要点: 假设函数.该函数将原始图像像素映射为分类评分值. 损失函数.该函数根据分类评分和训练集图像数据实际分类的一致性,衡量某个具体参数集的质量好坏. 现在介绍 ...
- python简述
python男神:龟叔 三,python基础初识. 1,运行python代码. 在d盘下创建一个t1.py文件内容是: print('hello world') 打开windows命令行输入cmd,确 ...
- java学习之路--继承(多态的动态绑定)
动态绑定过程中,对象调用对象方的执行过程 1:编译器查看对象的声明类型和方法名.有可能有多个方法名相同,但参数类型不一样的重载方法. 2:编译器查看调用方法时提供的参数类型.该过程叫重载解析,在相同的 ...
- 关于微信里wx.getUserInfo获取用户信息都是拼音的转成中文方法
加一个参数:lang:"zh_CN" 就可以了 1. 加在js里面 wx.getUserInfo({ lang:"zh_CN", success: func ...
- layer loading层 的设置
/* shadeClose 类型:Boolean 默认:true,是否点击遮罩时关闭层 */ var tishi = layer.open({ shadeClose: false ,type: 2 , ...