Struts2重新学习之自定义拦截器(判断用户是否是登录状态)
拦截器
一:1:概念:Interceptor拦截器类似于我们学习过的过滤器,是可以再action执行前后执行的代码。是web开发时,常用的技术。比如,权限控制,日志记录。
2:多个拦截器Interceptor连在一起组成了Interceptor栈。拦截器是AOP面向切面编程的一种实现,具有热插拔的效应。
3:Struts2拦截器,每个拦截器类只有一个对象实例,即采用了单利模式。所有引用这个拦截器的action都共享着一拦截器类的实例。
拦截器和过滤器的区别
1:拦截器和过滤器的概念非常类似
2:过滤器隶属于web容器,可以过滤一切请求(包括action,servlet,jsp,html)
3:拦截器隶属于Struts2框架,只能拦截action(无法拦截对jsp的直接请求)
4:过滤器内部采用函数回调来实现,拦截器采用动态代理+递归调用来实现
自定义一个拦截器。判断用户是否处于登录状态,如果处于登录状态则不拦截任何操作。如果非登录状态,或登录状态静止时间过长,导致session死亡,则拦截任何操作(除正在登录的操作)。跳转至登录页面,让其登录。
一:自定义登录状态判断拦截器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.bjsxt.shangxiaofei.interceptor; 2 3 import java.util.Map; 4 5 import com.bjsxt.shangxiaofei.po.User; 6 import com.opensymphony.xwork2.ActionContext; 7 import com.opensymphony.xwork2.ActionInvocation; 8 import com.opensymphony.xwork2.interceptor.Interceptor; 9 10 public class LoginInterCeptor implements Interceptor{ 11 12 @Override 13 public void destroy() { 14 // TODO Auto-generated method stub 15 System.out.println("LoginInterCeptor.destroy(销毁)"); 16 } 17 18 @Override 19 public void init() { 20 // TODO Auto-generated method stub 21 System.out.println("LoginInterCeptor.init(初始化)"); 22 } 23 24 @Override 25 public String intercept(ActionInvocation arg0) throws Exception { 26 //获取session作用域 27 Map<String,Object> sessionMap=ActionContext.getContext().getSession(); 28 //从session作用域中拿出登录的用户信息 29 User user=(User) sessionMap.get("user"); 30 31 //获取http请求地址中的请求方法名字 32 String methodName=arg0.getProxy().getMethod(); 33 //获取http请求地址中action的名字 34 String actionName=arg0.getProxy().getActionName(); 35 36 //判断user是否为空,如果不为空,说明登录,如果为空说明,没有登录,进行拦截。 37 if(user!=null){ 38 //登录,不拦截 39 System.out.println("请求时执行"); 40 arg0.invoke(); 41 System.out.println("响应时执行"); 42 43 return null; 44 }else{ 45 //如果为空,但是正在做登录请求,则也不拦截 46 if(methodName.equals("loginCheck")){ 47 System.out.println("请求时执行"); 48 arg0.invoke(); 49 System.out.println("响应时执行"); 50 return null; 51 } 52 53 sessionMap.put("backMsg", "很抱歉,请先登录,再做操作"); 54 return "login";//返回到登录页面 55 } 56 } 57 58 59 }
二:在struts.xml中配置拦截器,让其实现作用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <!-- 如果请求地址=actionName!methodName ,则该配置需要进行设置,否则访问地址错误--> 8 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> 9 10 <!-- 开发模式 --> 11 <constant name="struts.devMode" value="true" /> 12 13 <!-- 编码格式过滤 --> 14 <constant name="struts.i18n.encoding" value="utf-8"></constant> 15 16 17 18 <package name="default" namespace="/" extends="struts-default"> 19 20 <!-- 拦截器的配置 包括拦截器+拦截器栈 --> 21 <interceptors> 22 <interceptor name="LoginInterCeptor" class="com.bjsxt.shangxiaofei.interceptor.LoginInterCeptor"></interceptor> 23 <interceptor name="SecondInterCeptor" class="com.bjsxt.shangxiaofei.interceptor.SecondInterCeptor"></interceptor> 24 <!-- 如果想让自定义的拦截器起作用,就必须从新配置拦截器栈,并加上原先默认的拦截器栈 --> 25 <interceptor-stack name="MyInterCeptorStack"> 26 <interceptor-ref name="defaultStack"></interceptor-ref> 27 <interceptor-ref name="LoginInterCeptor"></interceptor-ref> 28 <interceptor-ref name="SecondInterCeptor"></interceptor-ref> 29 </interceptor-stack> 30 </interceptors> 31 <!-- 将自定义的拦截器栈应用到项目上,项目上所有的请求都会经过该拦截器栈 --> 32 <default-interceptor-ref name="MyInterCeptorStack"></default-interceptor-ref> 33 34 35 <!-- actionName!methodName请求方式的配置 --> 36 <action name="userAction" class="com.bjsxt.shangxiaofei.action.UserAction" > 37 <result name="success">/page/success.jsp</result> 38 </action> 39 40 41 </package> 42 </struts>