拦截器概念:在AOP中用于在某个方法或字段被访问之前,进行拦截然后在之前或者之后加入某些操作。拦截是AOP的一种策略。拦截器的执行过程:
(1)拦截器在action对象创建之后,action里面的方法执行之前执行
(2)在struts2里面执行默认的拦截器,在action不需要调用拦截器的方法,使用配置方式执行--- aop思想
(3)执行很多的拦截器,比如有三个拦截器,首先执行拦截器1,做放行,执行拦截器2,之后放行,执行拦截器3,放行之后,之后action里面的方法
下面通过案例的形式来进行讲解:
登陆成功的页面loginSucess.jsp代码:<form action="${pageContext.request.contextPath }/user_login.action" method="post"> 用户名:<input name="username" type="text" > 密码:<input name="password" type="password" > <br/> <input type="submit" value="登陆"> </form>
action中的UserAction代码:<h1>恭喜您登陆成功!!</h1> <h3>用户名为:${sessionScope.username }</h3> <form action="${pageContext.request.contextPath }/user_look.action" method="post"> <!-- 在此页面上点击“跳转”测试在没有登陆时是否可以执行look方法。 --> <input type="submit" value="跳转"> </form>
public class UserAction extends ActionSupport{ private String username; private String password; 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; } //默认执行的execute方法 @Override public String execute() throws Exception { System.out.println("我爱你中国"); return NONE; } //登陆方法 public String login(){ //这里就不调用数据库了,直接以此来代替查询数据库。 if (username.equals("小明")) { //将用户名的信息存入到session中。 ServletActionContext.getRequest().getSession().setAttribute("username", username); //返回到某个字符串,从而跳转到action对应的页面上。 return "loginSucess"; } else { return "login"; } } //测试不登陆时,是否调用look方法。 public String look(){ System.out.println("您已登录!!"); return NONE; } }
拦截器UserInterceptor的代码:
我们创建完拦截器之后还要给拦截器进行配置,从而建立和action的联系,而这个关联实在struts.xml配置文件中实现的。/* *拦截器一般是通过继承AbstractInterceptor或者MethodFilterInterceptor *这两个类来实现的。 */ public class LoginInterceptor extends MethodFilterInterceptor{ @Override protected String doIntercept(ActionInvocation invocation) throws Exception { //利用ServletActionContext的静态方法得到session对象 HttpSession session = ServletActionContext.getRequest().getSession(); //从session中获取到username的值。 Object object = session.getAttribute("username"); //判断获取到的username的值是否为空,这也是拦截器实现登陆拦截的逻辑。 if (object!=null) { //执行action中的方法,类似于放行 return invocation.invoke(); } else { return "login"; } } }
配置文件struts.xml文件的代码:
<span style="font-family:KaiTi_GB2312;"><?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> <package name="demo4" extends="struts-default" namespace="/"> <!-- 声明拦截器 --> <interceptors> <interceptor name="loginInterceptor" class="cn.itcast.interceptor.LoginInterceptor"></interceptor> </interceptors> <action name="user_*" class="cn.itcast.action.UserAction" method="{1}"> <result name="login">/login.jsp</result> <result name="loginSucess">/loginSucess.jsp</result> <!-- 使用自定义拦截器 --> <interceptor-ref name="loginInterceptor"> <!-- 配置让action中的哪个方法不进行拦截 param标签的name属性值固定:excludeMethods 在param标签里面,写上不被拦截的方法名 --> <param name="excludeMethods">login</param> </interceptor-ref> <!-- 执行默认拦截器 使用自定义拦截器的特点:struts2里面的默认拦截器就不会再执行了, 需要我们手动的使用一次。 --> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts></span>
代码中都有注释,作为程序员我们对代码都有自己的理解,在这里我就不一一讲解了,当然也希望此篇博客对各位能有所帮助。
拦截器的案例讲解
最新推荐文章于 2022-08-11 14:26:52 发布