zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    微众银行面试小总结
    关于撑开父容器高度的小探讨
    2015年9月阿里校招前端工程师笔试题
    高性能JavaScript 重排与重绘
    高性能JavaScript DOM编程
    纯CSS3动画实现小黄人
    JS+css3实现图片画廊效果总结
    新游戏《机械险境》
    Twitter "fave"动画
    fragment 与 activity
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/3851320.html
Copyright © 2011-2022 走看看