`
一代宗师
  • 浏览: 15133 次
社区版块
存档分类
最新评论

Struts2自定义拦截器验证登录

阅读更多

 

【Struts2】☆★之Struts2自定义拦截器验证登录

 

 

       在实际项目中我们的方法都是需要验证登录状态的,所以在使用Struts2框架的项目中,自定义拦截器是一个不错的选择,本文就简单介绍如何使用拦截器,对全局方法进行验证登录状态!

 

第一步搭建Struts2开发环境

 

第二步:编写一个Action方法

package csg.struts2.action; 
/** 
 * 
 * @author 小夜的传说 
 * @2014-4-18 
 * @struts 
 * @csg.struts2.action 
 * @StrutsAction 
 * @2014-4-18上午1:03:37 
 */
public class StrutsAction { 
    private String message; 
    public String getMessage() { 
        return message; 
    } 
    public void setMessage(String message) { 
        this.message = message; 
    } 
    public String execute() { 
        message = "execute方法"; 
        return "success"; 
    } 
    public String addUI() { 
        message = "addUI方法"; 
        return "success"; 
    } 
}

 

  第三步写一个jsp视图模仿登录状态,只要访问这个jsp了,就把用户信息放在Session中代表已经登录,可以操作action方法,没有访问这个jsp代表没有登录,不可以操作任何方法

 

 

  

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>拦截器</title> 
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0"> 
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
  </head> 
  <body> 
    <% 
    request.getSession().setAttribute("user", "login"); 
    %> 
    用户已登录 
  </body> 
</html>

 

第四步:配置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> 
    <package name="struts2" namespace="/test" extends="struts-default"> 
        <!-- 通配符形式访问action -->
        <action name="list_*" class="csg.struts2.action.StrutsAction" method="{1}"> 
            <result name="success">/WEB-INF/page/success.jsp</result> 
        </action> 
    </package> 
</struts>

 

第五步:部署到服务器上直接访问:http://127.0.0.1:8080/struts/test/list_addUI.action

会打印出addUI方法!ok,下面就是写一个拦截器了!

 

第六步:编写登录拦截器

 

package csg.struts2.interceptor; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.Interceptor; 
/** 
 * 
 * @author 小夜的传说 
 * @2014-4-18 
 * @struts 
 * @csg.struts2.interceptor 
 * @LoginInterceptor 
 * @2014-4-18上午1:03:29 
 */
public class LoginInterceptor implements Interceptor { 
    // 方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源 
    public void destroy() { 
    } 
    // 方法在拦截器被创建之后,在对Action镜像拦截之前调用,使用这个方法主要是给拦截器做类似初始化的操作 
    public void init() { 
    } 
    public String intercept(ActionInvocation invocation) throws Exception { 
        Object user = ActionContext.getContext().getSession().get("user"); 
        if (user != null) { 
            // 如果user不为null,代表用户已经登录,允许执行action中的方法 这个结果就代表返回验证通过 
            return invocation.invoke(); 
        } else { 
            //提示用户登录,我这里直接提示,在实际项目中,肯定会返回到登录页面 
            ActionContext.getContext().put("message", "你没有登录"); 
            return "success"; 
        } 
    } 
}

  第七步:最重要的,我们要在写好的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> 
    <package name="struts2" namespace="/test" extends="struts-default"> 
        <interceptors> 
            <interceptor name="logininterceptor" class="csg.struts2.interceptor.LoginInterceptor"/> 
            <!-- 自定义一个拦截器栈,下面你拦截只需要用这个栈名字就行了 -->
            <interceptor-stack name="loginstack"> 
            <!-- 这个是系统拦截器栈,不这样写,就是当你单独一个action引用拦截器的时候就无法使用拦截器的中的核心功能 -->
            <interceptor-ref name="defaultStack"/> 
            <!-- 这个引用你自己写的拦截器 -->
            <interceptor-ref name="logininterceptor" /> 
            </interceptor-stack> 
        </interceptors> 
        <!-- 这样写的意思是 在这个package包下面的所有action方法都需要拦截器 -->
        <default-interceptor-ref name="loginstack"></default-interceptor-ref> 
        <!-- 全局视图,这个就是说拦截到你没登录的时候提示你登录 ,你做的话可以提示返回登录界面-->
        <global-results> 
            <result name="success">/WEB-INF/page/message.jsp</result> 
        </global-results> 
        <!-- 通配符形式访问action -->
        <action name="list_*" class="csg.struts2.action.StrutsAction" method="{1}"> 
            <result name="success">/WEB-INF/page/success.jsp</result> 
            <!-- 也可以这样写 ,但是这样写就比较麻烦了,假如你下面还有action,这样你就每个action都需要引用,所以我注掉了-->
            <!-- <interceptor-ref name="loginstack"></interceptor-ref> -->
        </action> 
    </package> 
</struts>

 

第八步:解析

 

1、为什么<interceptor-ref name="defaultStack"/>

因为Struts2拦截器是个很奇诡的东西,当你自定义拦截器之后,在某个方法引用自己编写的拦截器之后,那么Struts许多的核心拦截器将无法使用,所以我们我们一般将自己写的拦截器和这个系统拦截器栈一起组成一个栈,这样就可以继续使用Struts2的拦截器了

可以参照struts源代码,在struts2-core-2.3.16.1.jar下面有个struts-default.xml文件,搜索defaultStack

如图:

wKioL1NQlPyzngGjAAKpjquV0yo427.jpg

 

 

2、配置全局拦截器的优缺点<default-interceptor-ref name="loginstack"></default-interceptor-ref>

假如,你某一个action方法需要另一个拦截器,但是其他方法不需要,这样你就需要在这个action中单独引用,注意,当你引用了这个拦截器之后,你定义的这个全局拦截器对于这个方法就会失效,所以一定要再次引用一次这个全局拦截器.

 

3、为什么系统拦截器栈写在你定义的拦截器之前

 

<!-- 这个是系统拦截器栈,不这样写,就是当你单独一个action引用拦截器的时候就无法使用拦截器的中的核心功能 -->
 <interceptor-ref name="defaultStack"/> 
 <!-- 这个引用你自己写的拦截器 -->
 <interceptor-ref name="logininterceptor" />
 
 

因为Struts在实例化的过程中读取的xml是从上到下的这样方式,所以本着项目安全角度,我们先让系统执行Struts2核心拦截器,然后再执行自己写的拦截器。当然你反过来写也行,但是可能有些自己写的复杂的拦截器在系统拦截器没实例化之前,会失效。

 

4、本文详细对于Struts2拦截器的基本原理进行了简单解析,如果有哪位童鞋有意见,欢迎举手!Thank you!

 

 

 

 

分享到:
评论

相关推荐

    使用struts2拦截器对登陆权限验证

    综合使用servlet filter与struts2 interceptor对权限进行验证。

    基于ssh拦截器框架Struts2拦截器的登录验证实现

    基于SSH2框架Struts2拦截器的登录验证实现

    Struts2_自定义拦截器_用户权限验证

    1.eclipse环境下运行 2.源码 3.自定义拦截器,对用户权限认证 4.各个action之间的跳转

    SpringBoot 自定义拦截器 的 源代码

    SpringBoot 自定义拦截器 的 源代码 SpringBoot 自定义拦截器 一、自定义拦截器 二、编写控制器 三、添加拦截器对象,注入到容器的配置类中 另一种写法 四、最后application运行 我们对拦截器并不陌生,无论是 ...

    struts2拦截器

    struts2自定义的拦截器,实现用户非法登陆的验证

    拦截器的验证

    关于对用户的拦截验证。... 部署自定义拦截器!! --&gt; &lt;result&gt;/MyJsp.jsp &lt;!-- 应用自定义拦截器栈 --&gt; &lt;interceptor-ref name="myStack" /&gt; &lt;/struts&gt;

    SSH笔记-数据验证、上传下载、避免表单重复提交、自定义拦截器

    SSH笔记-数据验证、上传下载、避免表单重复提交、自定义拦截器

    Struts2 in action中文版

    4.5 构建自定义拦截器 78 4.5.1 实现Interceptor接口 78 4.5.2 构建AuthenticationInterceptor拦截器 79 4.6 小结 82 第5章 数据转移:OGNL和类型转换 84 5.1 数据转移和类型转换:Web应用程序领域的常见任务 85 ...

    struts2讲义_吴峻申

    4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的自定义拦截器配置 58 4.4 Struts2文件上传拦截器应用 61 4.4.1 Struts2文件上传功能开发 61 4.4.2 ...

    java过滤器、监听器拦截器原理个人总结.pdf

    Struts2 规定用户自定义拦截器必须实现 com.opensymphony.xwork2.interceptor.Interceptor 接口,该接口声明了三个方法: * void init(); * void destroy(); * String intercept(ActionInvocation invocation) ...

    Struts2入门教程(全新完整版)

    2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 32 4.使用默认的execAndWait...

    深入浅出struts2

    开发人员还可以通过拦截器(可以自定义拦截器或者使用Struts2提供的拦截器)来对请求进行预处理和后处理,这样一来,处理请求就变得更加模块化,从而进一步减小耦合度。模块化是一个通用的主题——可以通过插件机制...

    深入浅出Struts2(附源码)

    18.2 编写一个自定义的拦截器 268 18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 第19章定制结果类型 274 19.1 概述 274 19.2 编写一个自定义的结果类型 274 19.3 使用新的结果类型 277 ...

    Struts2大全

    struts2,文件上传,验证框架,手工验证,xml文件验证,自定义类型转换器,自定义拦截器,国际化,ognl

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 ...09 自定义拦截器 38 10 类型转换 38 Struts2总结 39

    Struts2帮助```````

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 ...09 自定义拦截器 38 10 类型转换 38 Struts2总结 39

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    18.2 编写一个自定义的拦截器 268 18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 第19章 定制结果类型 274 19.1 概述 274 19.2 编写一个自定义的结果类型 274 19.3 使用新的结果类型 277 19.4 ...

Global site tag (gtag.js) - Google Analytics