java 自定义拦截器

一、拦截器

   过滤器作用于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>

猜你喜欢

转载自blog.csdn.net/m0_38068812/article/details/82827241