java自定义拦截器

xiaoxiao2021-03-01  25

一、拦截器

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

 

转载请注明原文地址: https://www.6miu.com/read-4049998.html

最新回复(0)