Struts2自定义拦截器验证登录


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


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


第一步搭建Struts2开发环境


第二步:编写一个Action方法


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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代表没有登录,不可以操作任何方法


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ 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文件,先测试方法


1
2
3
4
5
6
7
8
9
10
11
12
<? 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,下面就是写一个拦截器了!


第六步:编写登录拦截器


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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文件中,配置我们写好的这个拦截器,这一步,我会写的很详细,看懂的童鞋,拦截器基本上可以很好掌握


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<? 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、为什么系统拦截器栈写在你定义的拦截器之前

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


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


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



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Struts2 中,可以使用拦截器来实现权限控制。具体来说,可以编写一个自定义拦截器,然后在 struts.xml 配置文件中将其配置为需要进行权限控制的 Action 的拦截器。以下是一个简单的权限拦截器示例: ```java public class AuthInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // 获取当前用户 User user = (User) ActionContext.getContext().getSession().get("user"); // 判断用户是否拥有权限 if (user != null && user.hasPermission(invocation.getInvocationContext().getName())) { // 如果有权限,则继续执行 Action return invocation.invoke(); } else { // 如果没有权限,则跳转到错误页面 return "error"; } } } ``` 在上述代码中,我们首先获取了当前用户,然后判断用户是否拥有执行当前 Action 的权限。如果有权限,则继续执行 Action;否则,跳转到错误页面。 接下来,在 struts.xml 配置文件中,我们可以将该拦截器配置为需要进行权限控制的 Action 的拦截器,如下所示: ```xml <action name="myAction" class="com.example.MyAction"> <interceptor-ref name="authInterceptor"/> <result name="success">/myAction.jsp</result> <result name="error">/error.jsp</result> </action> <interceptor-stack name="authStack"> <interceptor-ref name="authInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> <interceptors> <interceptor name="authInterceptor" class="com.example.AuthInterceptor"/> </interceptors> ``` 在上述代码中,我们首先定义了一个名为 authStack 的拦截器栈,该拦截器栈包含了 authInterceptor 和 defaultStack 两个拦截器。然后,我们将 myAction Action 配置为使用 authStack 拦截器栈。最后,我们定义了一个名为 authInterceptor 的拦截器,并将其添加到了 interceptors 中。 这样一来,当用户访问 myAction Action 时,就会先执行 authInterceptor 拦截器,进行权限控制,然后再执行 defaultStack 拦截器栈中的其它拦截器。如果 authInterceptor 拦截器返回了 error,则会跳转到 error.jsp 页面;否则,会跳转到 myAction.jsp 页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值