java 自定義攔截器
阿新 • • 發佈:2018-12-11
一、攔截器
過濾器作用於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>