【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
如图:
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自定义拦截器的配置是Struts2框架中一个非常重要的功能,它允许开发者在Action执行前后插入自定义的逻辑,以实现如权限验证、日志记录、性能监控等多种需求。以下是对标题和描述中涉及的知识点的详细说明: ...
在深入探讨自定义拦截器之前,我们先理解一下Struts2拦截器的基本概念。 拦截器(Interceptor)是基于Java的动态代理机制实现的,它可以拦截用户的请求,对请求进行预处理,并且在Action执行后进行后处理。通过在...
在Struts2中,自定义拦截器是实现业务逻辑控制、数据验证、权限管理等功能的重要手段。下面将详细探讨如何在Struts2中实现自定义拦截器来完成权限拦截。 首先,我们需要了解Struts2拦截器的工作原理。拦截器是在...
在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...
本文将深入探讨Struts2的内建自定义拦截器及其配置。 首先,让我们理解什么是拦截器。拦截器是基于AOP(面向切面编程)思想的,它们在Action调用前后执行,形成一个拦截器链。每个拦截器都可以执行特定的任务,并且...
自定义拦截器是Struts2框架中扩展功能的重要手段,让我们深入探讨如何在Struts2中实现自定义拦截器。 首先,创建一个Web项目是基础步骤,这可以通过IDE如Eclipse或IntelliJ IDEA来完成。确保你的项目包含了Struts2...
本示例将聚焦于如何在Struts2中实现一个自定义拦截器。 首先,我们需要了解拦截器在Struts2中的作用。拦截器是AOP(面向切面编程)的一个核心概念,它允许开发者在动作执行前后插入额外的逻辑,如日志记录、权限...
总结来说,防止重复提交的自定义拦截器在Struts2中起到了关键作用,通过生成和验证令牌,能够在不依赖Struts2标签的情况下,有效地避免了用户意外或恶意的重复提交,保证了应用的稳定性和数据的一致性。
本项目“Struts2_自定义拦截器_用户权限验证”将深入探讨如何在Eclipse开发环境中,利用Struts2框架自定义拦截器进行用户权限的验证,并处理各个Action之间的跳转。 首先,我们来看自定义拦截器的创建。在Struts2中...
在添加自定义拦截器时,可以将其插入到默认拦截器栈中,也可以创建自定义的拦截器栈。 ### 五、测试与优化 完成上述步骤后,你可以通过访问受保护的URL来测试拦截器的效果。如果用户未登录,系统应重定向到登录页面...
2. 注册拦截器:在Struts2的配置文件(如struts.xml)中,将这个拦截器添加到默认栈或者自定义拦截器栈中。 3. 检查登录状态:在`intercept()`方法中,可以通过Session或者其他方式检查用户是否已登录,未登录则返回...
本篇将深入讲解如何在Struts2中自定义拦截器,并通过提供的源代码进行分析。 拦截器是Struts2框架的核心组件之一,它允许我们在请求到达Action之前或离开Action之后执行一些额外的操作,如日志记录、权限验证、性能...
自定义拦截器是扩展Struts2功能的重要手段,允许开发者根据项目需求实现特定的行为。 在Struts2中,拦截器是基于责任链模式实现的,它们按照注册的顺序依次执行。拦截器栈是Struts2中拦截器的集合,每个拦截器都...
SSH2 框架中的 Struts2 拦截器功能允许开发者在特定操作执行前或执行后进行自定义处理,例如登录验证、权限检查等。在本文中,我们将探讨如何使用 Struts2 的拦截器来实现登录验证功能。 首先,我们需要了解 Struts...
"struts2自定义拦截器的示例...Struts2 自定义拦截器的示例代码提供了一个简单的身份验证示例,演示了如何在Struts2框架中实现自定义拦截器。通过自定义拦截器,可以实现各种功能,如身份验证、日志记录、缓存处理等。
通过以上详细介绍,我们了解了Struts2中的拦截器和验证框架的基本概念、如何创建自定义拦截器以及如何配置拦截器和使用验证功能。这些知识点对于初学者来说非常重要,能够帮助他们更好地理解和使用Struts2框架。
自定义拦截器是Struts2中的一个重要特性,允许我们扩展框架的功能,以实现诸如日志记录、权限检查、性能监控等通用任务。在本文中,我们将深入探讨如何创建和使用自定义拦截器。 首先,了解拦截器的基本概念。在...
本篇文章将深入探讨如何实现自定义拦截器及其在Struts2中的详细配置。 首先,我们来了解自定义拦截器的基本步骤: 1. **创建拦截器类**:自定义拦截器需要继承Struts2提供的`Interceptor`接口或实现`intercept()`...
自定义拦截器是Struts2提供的一种功能强大且灵活的机制,通过自定义拦截器可以实现各种复杂的业务逻辑,例如身份验证、权限管理、日志记录等。自定义拦截器只需继承Struts2提供的抽象拦截器类,并override其中的方法...