Struts2从新学习之自定义拦截器(判断用户是不是登陆状态)

拦截器html

  一:1:概念:Interceptor拦截器相似于咱们学习过的过滤器,是能够再action执行先后执行的代码。是web开发时,经常使用的技术。好比,权限控制,日志记录。java

    2:多个拦截器Interceptor连在一块儿组成了Interceptor栈。拦截器是AOP面向切面编程的一种实现,具备热插拔的效应。web

    3:Struts2拦截器,每一个拦截器类只有一个对象实例,即采用了单利模式。全部引用这个拦截器的action都共享着一拦截器类的实例。apache

 

拦截器和过滤器的区别编程

  1:拦截器和过滤器的概念很是相似session

  2:过滤器隶属于web容器,能够过滤一切请求(包括action,servlet,jsp,html)框架

  3:拦截器隶属于Struts2框架,只能拦截action(没法拦截对jsp的直接请求)jsp

  4:过滤器内部采用函数回调来实现,拦截器采用动态代理+递归调用来实现ide

 

自定义一个拦截器。判断用户是否处于登陆状态,若是处于登陆状态则不拦截任何操做。若是非登陆状态,或登陆状态静止时间过长,致使session死亡,则拦截任何操做(除正在登陆的操做)。跳转至登陆页面,让其登陆。函数

一:自定义登陆状态判断拦截器

 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 }
View Code

二:在struts.xml中配置拦截器,让其实现做用。

 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>
View Code
相关文章
相关标签/搜索