【struts2】自定义登录检查拦截器

news/2023/6/8 7:15:57

  在实际开发中,一个常见的功能要求是:有很多操作都需要登录后才能操作,如果操作的时候还没有登录,那么通常情况下会要求跳转回到登录页面。

  1)如何实现这样的功能呢?

  在具体实现之前,先来考虑几个问题:

  (1)这个功能应该在哪里实现?

  要实现登录检查的功能,很明显是在Action运行之前,就要判断用户是否登陆了,判断方式是看session里面是否有相关信息,如果有,则继续操作;如果没有,则要跳转到预先制定好的登录页面。简单点说,登录检查应该写在“invocation.invoke();”语句之前。

  (2)是否需要参数?

  要判断是否需要参数,其实就是判断这个拦截器有没有什么可变的量,可以把这些可变量从程序中分离出来,通过struts.xml来配置。经过分析,可以抽出两个参数:

  • 代表登陆页面的Result
  • 判断session中哪个attribute,也就是attribute的名称

  (3)如何引用呢?

  现在的情况是只有部分Action需要登陆录检查,另外一些Action不需要,这就需要权衡了。对于大多数Action都要进行登录检查的包,可以在包的默认拦截器引用上设置登录检查,而对于少数不需要登陆检查的Action,可以让它们直接引用默认的defaultStack拦截器栈。

  2)实现满足要求的拦截器,示例代码如下:

package cn.javass.hello.struts2impl.action;import java.util.Map;   
import com.opensymphony.xwork2.ActionInvocation;  
import com.opensymphony.xwork2.interceptor.Interceptor;  public class SessionCheckInterceptor implements Interceptor{  //设置参数  private String sessionAttribute;  private String reloginResult;  public void setSessionAttribute(String sessionAttribute) {  this.sessionAttribute = sessionAttribute;  }  public void setReloginResult(String reloginResult) {  this.reloginResult = reloginResult;  }  public void destroy() { }  public void init() {    }  public String intercept(ActionInvocation invocation) throws Exception {  //读取Session  Map<String, Object> session = invocation.getInvocationContext().getSession();  //判断Session中是否有相应的attribute  if (session.containsKey(sessionAttribute)){  String resultCode = invocation.invoke();  return resultCode;  }else{  return reloginResult;  }         }  
}  

  在intercept方法中,先读取session中指定的attribute,具体读取哪个attribute由参数从外界传进来,然后判断Session中是否存在这个attribute,如果有则继续执行后续的拦截器、Action和Result,如果没有则跳转到指定的Result所对应的页面,具体跳转到哪个Result也是由参数从外界传进来的。

  3)拦截器配置,配置示例如下:

<package name="helloworld"  extends="struts-default">  <interceptors>  <interceptor name="testInteceptor" class="cn.javass.hello.struts2impl.action.MyInterceptor"/> <interceptor name="myLogger" class="cn.javass.hello.struts2impl.action.LoggerInterceptor"/><interceptor name="loginChecker" class="cn.javass.hello.struts2impl.action.SessionCheckInterceptor"/>    <interceptor-stack name="myStack">  <interceptor-ref name="timer"/>  <interceptor-ref name="testInteceptor"/><interceptor-ref name="myLogger"/>  <interceptor-ref name="loginChecker">  <param name="sessionAttribute">login_user</param>  <param name="reloginResult">login</param>  </interceptor-ref>  <interceptor-ref name="defaultStack"/>  </interceptor-stack>  </interceptors>  <default-interceptor-ref name="myStack"/>  <global-results>  <result name="math-exception">/${folder}/error.jsp</result> <result name="login">/s2impl/login.jsp</result> </global-results>  <global-exception-mappings>  <exception-mapping result="math-exception" exception="java.lang.ArithmeticException"/>  <exception-mapping result="math-exception" exception="java.lang.Exception"/>  </global-exception-mappings>  <action name="helloworldAction" class="cn.javass.hello.struts2impl.action.HelloWorldAction"> <result name="toWelcome">/${folder}/welcome.jsp</result>   </action>  </package>  

  参考资料:http://www.iteye.com/topic/1124526

转载于:https://www.cnblogs.com/ningvsban/p/3735754.html


https://dhexx.cn/news/show-17469.html

相关文章

EF(EntityFramework) Migrations 迁移

1、开启程序包管理器控制台 2.安装EntityFrameworkPM> Install-Package EntityFramework3.启用迁移PM> Enable-Migrations –EnableAutomaticMigrations遇到的问题&#xff1a;4.创建迁移点PM> Add-Migration InitialCreate5.执行迁移点更新PM> Update-Database –…

springboot整合rabbitmq 消费者Consumer 手动进行ack确认

ack指Acknowledge&#xff0c;确认。 表示消费端收到消息后的确认方式。 有三种确认方式&#xff1a; 自动确认&#xff1a;acknowledge"none" 手动确认&#xff1a;acknowledge"manual" 根据异常情况确认&#xff1a;acknowledge"auto"&#xf…

LRU缓存实现(Java)

LRU Cache的LinkedHashMap实现LRU Cache的链表HashMap实现LinkedHashMap的FIFO实现调用示例LRU是Least Recently Used 的缩写&#xff0c;翻译过来就是“最近最少使用”&#xff0c;LRU缓存就是使用这种原理实现&#xff0c;简单的说就是缓存一定量的数据&#xff0c;当超过设定…

springboot整合rabbitmq 消费者Consumer限流

场景&#xff1a;请求瞬间增多&#xff0c;每秒5000个请求&#xff0c;防止A系统挂掉 注意&#xff1a;一定要开启手动ack确认 1 application.yml配置文件 server:port: 8021 spring:#给项目来个名字application:name: rabbitmq-test#配置rabbitMq 服务器rabbitmq:host: 127.0…

Android 图标右上角添加数字提醒

方法一&#xff1a;使用开源项目ViewBadger&#xff0c;github上的地址&#xff1a;https://github.com/jgilfelt/android-viewbadger 效果如图所示&#xff1a;[java] view plaincopy<TextView android:id"id/tv1" android:layout_width"wr…

springboot整合rabbitmq 设置消息过期时间TTL

主要有2种方式&#xff0c;如果同时指定了Message TTL和Queue TTL&#xff0c;则优先较小的那一个&#xff1a; 指定一条消息的过期时间。 给队列设置消息过期时间&#xff0c;队列中的所有消息都有同样的过期时间。 队列设置的方式 import org.springframework.amqp.core.B…

.net 实现 URL重写,伪静态(方法一)

一&#xff0c;获得Mircosoft URLRewriter.dll(注意&#xff1a;此dll文件大小约为20KB&#xff0c;网上有8Kb的是不完整的文件&#xff0c;会报错) 二&#xff0c;在项目中该dll文件&#xff1a;添加引用&#xff08;可以直接拷贝放入Bin文件夹即可&#xff09; 三&#xff0c…

rabbitmq死信队列 用rabbitmq web控制台创建交换机,队列,绑定关系,发送TTL超时消息 来做演示

死信队列&#xff1a;没有被及时消费的消息存放的队列&#xff0c;消息没有被及时消费有以下几点原因&#xff1a; a.消息被拒绝&#xff08;basic.reject/ basic.nack&#xff09;并且不再重新投递 requeuefalse &#xff08;演示链接&#xff09;https://blog.csdn.net/qq_41…

rabbitmq死信队列 用rabbitmq web控制台创建交换机,队列,绑定关系,演示 消息被拒绝(basic.reject/ basic.nack)并且不再重新投递 requeue=false

先用rabbitmq控制台创建正常的交换机&#xff0c;队列&#xff0c;死信的交换机&#xff0c;队列&#xff0c;绑定关系等&#xff0c;查看以下博文&#xff0c; 只要 以下文章的1-3步&#xff0c;因为这里演示另种情况&#xff0c;消息到死信队列https://blog.csdn.net/qq_4171…

深入理解JVM--JVM垃圾回收机制

Java语言出来之前&#xff0c;大家都在拼命的写C或者C的程序&#xff0c;而此时存在一个很大的矛盾&#xff0c;C等语言创建对象要不断的去开辟空间&#xff0c;不用的时候有需要不断的去释放控件&#xff0c;既要写构造函数&#xff0c;又要写析构函数&#xff0c;很多时候都在…