拦截器栈:
从结构上看:拦截器栈相当于多个拦截器的组合;
从功能上看:拦截器栈也是拦截器。
默认拦截器栈:
在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!