一、拦截器
过滤器作用于Web端,而拦截器作用于整个java,作用范围也就更加的广泛
二、下面就对拦截器在开发中的使用做一个例子举例说明
以用户登陆为例子,用户在登陆后,才能访问其他页面,如果没有登陆,就跳转到登陆页面,此时我们用拦截器来实现
三、拦截器的简单示例
1.web页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>自定义拦截器</title>
</head>
<body>
demo1.jsp
<%System.out.println("demo1.jsp执行了"); %>
</body>
</html>
2.后端aciton
public class Demo1Action extends ActionSupport {
public String save(){
System.out.println("Demo1Action的动作方法执行了");
return SUCCESS;
}
}
3.定义简单的拦截器
/**
* 自定义拦截器
* 第一步:创建一个普通类,继承AbstractInterceptor,实现抽象方法intercept
* 第二步:在struts.xml中配置拦截器
* 1.声明拦截器
* <interceptors>
<interceptor name="demo1Interceptor" class="com.itheima.web.interceptor.Demo1Interceptor" />
</interceptors>
2.使用拦截器
<!-- 使用自定义拦截器:当配置了任何一个拦截器,默认的拦截器栈就不会在工作了 -->
<interceptor-ref name="demo1Interceptor"></interceptor-ref>
*
*/
/**
* 此拦截器主要是对action进行拦截
* @author Administrator
*
*/
public class Demo1Interceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Demo1Interceptor拦截器:拦截了-执行动作方法之前");
//放行:如果有下一个拦截器,就前往下一个拦截器,如果没有了,就到达动作方法
String rtValue = invocation.invoke();//就是结果视图的名称
System.out.println("Demo1Interceptor拦截器:拦截了-执行动作方法之后");
return rtValue;
}
}
4、配置文件struts.xml中进行配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="p1" extends="struts-default">
<!-- 声明自定义拦截器 -->
<interceptors>
<interceptor name="demo1Interceptor" class="com.struts.web.interceptor.Demo1Interceptor"></interceptor>
<interceptor name="demo2Interceptor" class="com.struts.web.interceptor.Demo2Interceptor"></interceptor>
</interceptors>
<action name="action1" class="com.itheima.web.action.Demo1Action" method="save">
<!-- 使用自定义拦截器:当配置了任何一个拦截器,默认的拦截器栈就不会在工作了 .
当有多个拦截器的时候,是由引用配置决定执行的顺序 。 注意:执行顺序与声明无关-->
<interceptor-ref name="demo2Interceptor"></interceptor-ref>
<interceptor-ref name="demo1Interceptor"></interceptor-ref>
<result name="success">/demo1.jsp</result>
</action>
</package>
</struts>
此时,一个简单的拦截器就完成了
四、自定义复杂拦截器,具有自己的拦截功能示例,以session共享为例,跳到其他页面
1.web页面
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login.action" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
主页面main.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>主页:检查登录的拦截器</title>
</head>
<body>
<%--要想来到本页面(主页),必须得先登录 --%>
主页<hr/>
<a href="${pageContext.request.contextPath}/showOther.action">访问另一个页面</a>
</body>
</html>
其他页面otherPage.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>另一个页面</title>
</head>
<body>
另一个页面
</body>
</html>
2.拦截器
/**
* 检查登录的拦截器,最终版本
*
*/
// c
public class CheckLoginInterceptor1 extends MethodFilterInterceptor {
public String doIntercept(ActionInvocation invocation) throws Exception {
//1.获取HttpSession
HttpSession session = ServletActionContext.getRequest().getSession();
//2.获取session域中的登录标记
Object obj = session.getAttribute("user");
//3.判断是否有登录标记
if(obj == null){
//用户没有登录
return "input";
}
//4.用户登录了,放行
String rtValue = invocation.invoke();
return rtValue;
}
}
3.用户登陆action
public class Demo2Action extends ActionSupport {
/**
* 用户登录的方法
* @return
*/
public String login(){
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("user", "test");
return SUCCESS;
}
/**
* 无论是显示主页还是显示另一个页面都执行此方法,
* 返回成功
*/
public String execute(){
return SUCCESS;
}
}
4.struts.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="p2" extends="struts-default">
<interceptors>
<interceptor name="checkLoginInterceptor1" class="com.struts.web.interceptor.CheckLoginInterceptor1" />
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="checkLoginInterceptor1"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
<global-results>
<result name="input">/login.jsp</result>
</global-results>
<action name="login" class="com.struts.web.action.Demo2Action" method="login">
<interceptor-ref name="myDefaultStack">
<!-- 在引用自定义拦截器栈的时候,给指定的拦截器注入参数。方式就是:拦截器名称.属性名称
excludeMethods:哪些方法不需要拦截
includeMethods:哪些方法需要拦截
-->
<param name="checkLoginInterceptor1.excludeMethods">login</param>
</interceptor-ref>
<!-- redirectAction: 可以当前包中重定向,也可以是不同包中重定向
chain:可以当前包中转发,也可以是不同包中转发
-->
<result type="redirectAction">
<!-- 同一个包下,此处可以不写-->
<param name="namespace">/</param>
<param name="actionName" >showMain</param>
</result>
</action>
<action name="showMain" class="com.struts.web.action.Demo2Action" >
<result>/main.jsp</result>
</action>
<action name="showOther" class="com.struts.web.action.Demo2Action" >
<result>/otherpage.jsp</result>
</action>
</package>
</struts>
5.web.xml配置
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>