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死亡,则拦截任何操作(除正在登录的操作)。跳转至登录页面,让其登录。

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

 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

时间: 2024-10-04 17:24:31

Struts2重新学习之自定义拦截器(判断用户是否是登录状态)的相关文章

关于Struts2文件上传与自定义拦截器_java

一.访问或添加request/session/application属性 public String scope() throws Exception{   ActionContext ctx = ActionContext.getContext();   ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app   ctx.getSession().put("ses", &q

struts2自定义拦截器怎么进不去

问题描述 一个破拦截器搞了半天没发现哪里出问题了就是进不去自定义的拦截器里,下面贴代码:struts.xml<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dt

SSH-Struts2简单的自定义拦截器MethodFilterInterceptor

SSH-Struts2简单的自定义拦截器MethodFilterInterceptor      最近业余时间工作之余也在学习SSH相关的知识,今天刚刚尝试写了一个基础的Struts2拦截器通过继承MethodFilterInterceptor方法.    一.什么是拦截器 拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式. 二.本文

java自定义拦截器用法实例_java

本文实例讲述了java自定义拦截器及其用法.分享给大家供大家参考.具体如下: LoginInterceptor.java文件如下: package com.tq365.util; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwo

WebServices中使用cxf开发日志拦截器以及自定义拦截器

首先下载一个cxf实例,里面包含cxf的jar包.我下的是apache-cxf-2.5.9 1.为什么要设置拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. 2.拦截器分类 1. 按所处的位置分:服务器端拦截器,客户端拦截器 2. 按消息的方向分:入拦截器,出拦截器 3. 按定义者分:系统拦截器,自定义拦截器 3.拦截器API Interceptor(拦截器接口) AbstractPhaseInterceptor(自定义拦截器从此继承) Loggi

struts2中文件上传拦截器 是不是不能在多个action中引用???

问题描述 <global-results> <result name="input">/message.jsp</result></global-results><!--定义全局的返回视图--><action name="updateHead" class="updateHead"> <interceptor-ref name="fileUpload"

cxf自定义拦截器怎么获取到传入参数值

问题描述 cxf自定义拦截器怎么获取到传入参数值 cxf自定义拦截器怎么获取传入参数值 或者怎么 把 Object obj = message.getContent(List.class).get(0); // 的值取出来 解决方案 http://www.tuicool.com/articles/fAZ3QnJ

struts-关于Struts自定义拦截器的问题

问题描述 关于Struts自定义拦截器的问题 Struts自定义拦截器里只能设置不拦截指定的方法或者只拦截指定的方法.如果我有两个Action(Action1,Action2)而里面的方法有相同方法名的方法(foo()),而我想拦截Action1的foo()方法,不想拦截Action2的foo()方法,该怎么做呢,能不能指定拦截器不拦截指定的Action呢?*_* 解决方案 运行逻辑是先运行拦截器再运行action,拦截器配置可作用于一个action下,两个action完全可以分开配置 解决方案

stauts 2 自定义拦截器

问题描述 我想定义一个拦截action中指定方法的拦截器,比如我只拦截add方法.我看到网上有人说extendsMethodFilterInterceptor可是我不知道怎么在stauts.xml中配置,请各位大牛帮帮忙啊 解决方案 解决方案二:去我BLOG看下有个自定义拦截器的例子http://blog.csdn.net/java_cxrs/archive/2010/04/23/5519743.aspx解决方案三:嗯继承自MethodFilterInterceptor抽象基类就可以对方法进行拦