登陆拦截器总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了登陆拦截器总结相关的知识,希望对你有一定的参考价值。

这是struts2中的登陆拦截器的实现流程

首先,启动服务器后,用户在地址栏输入地址,如果地址是以action结尾的,服务器中的前端控制器会对该action进行拦截,然后交给ActionProxy代理进行处理,主要目的是进行

增强,因为,最开始是用户进行登录,所以我们的目标类是StaffAction,将该action实例压入ValueStack栈中,下一步我们将进入到拦截器模块,我们使用的是自定义大的拦截器栈loginStack,该拦截器栈中包含默认的拦截器栈defaultStack和我们自定义小的拦截器栈loginInterceptor.由于我们将默认拦截器栈defaultStack放在拦截器栈loginInterceptor之前,我们需要先执行默认拦截器栈defaultStack,打开拦截器栈defaultStack源码,里面的拦截器从上向下执行,第一个拦截器是modelDriven,我们在写staffAction类的时候需要实现ModelDriven接口重写接口中的getModel方法,获得javaBean实例对象,即crmStaff,如果该对象不为null,我们将其压入ValueStack栈顶。接下来从值栈栈顶开始封装数据(即将属性进行设置值),这里用到的是params,如果loginName和loginPwd均为空,我们对其进行封装数据.下一步是conversionError拦截器,出现异常,进行拦截并提示信息,最后是校验和workflow拦截器,如果workflow拦截器判断有错误信息,则默认返回input,没有错误就放行,在我们自定义的loginInterceptor拦截器中进行判断,不拦截login,其他均拦截,采用doInteceptor方法进行拦截,判断session中是否有数据,如果有数据,则放行,没有数据,则进行拦截,返回到登陆页面。

 

技术分享

StaffAction类

package com.itheima.crm.staff.web.action;

import com.itheima.crm.staff.domain.CrmStaff;
import com.itheima.crm.staff.service.StaffService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class StaffAction extends ActionSupport implements ModelDriven<CrmStaff> {

    private CrmStaff staff = new CrmStaff();
    @Override
    public CrmStaff getModel() {
        // TODO Auto-generated method stub
        return staff;
    }
    //默认按照名称注入进来
    private StaffService staffService;
    public void setStaffService(StaffService staffService){
        this.staffService = staffService;
    }
    /**
     * 员工登陆
     * @return
     */
   public String Login(){
       //查询员工
       CrmStaff findStaff = staffService.login(staff);
       //是否成功
       if(findStaff !=null){
           //成功
           //3.1 session作用域保存数据
           ActionContext.getContext().getSession().put("loginStaff", findStaff);
          //3.2重定向到首页--xml中配置
           return "success";
       }
       //不成功
       this.addFieldError("", "用户名或密码错误");
       //返回,请求转发
       return "login";  
   }
   
   public String home(){
       return "home";
   }
}

 

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>
    <!-- 1 常量 -->
    <!-- 1.1开发模式 -->
    <constant name="struts.devMode" value="true"></constant>
    <!-- 1.2标签主题,简单风格 -->
    <constant name="struts.ui.theme" value="simple"></constant>
    
    <!-- 2 公共项 -->
    <package name="common" namespace="/" extends="struts-default">
       <!--2.2 配置登陆拦截器 -->
       <interceptors>
          <!-- 1,注册  -->
          <interceptor name="loginInterceptor" class="com.itheima.crm.web.interceptor.LoginInterceptor"></interceptor>
           <!-- 2,自定义拦截器栈 -->
           <interceptor-stack name="loginStack">
              <interceptor-ref name="defaultstack"></interceptor-ref>
              <!-- 自定义拦截器必须进行login不进行拦截,因此,我们需要进行注入 -->
               <interceptor-ref name="loginInterceptor">
                  <param name="excludeMethod">login</param>
               </interceptor-ref>
           </interceptor-stack> 
       </interceptors>
        <!-- 3,申明默认 -->
        <default-interceptor-ref name="loginStack"></default-interceptor-ref>
        <!-- 全局结果集 -->
        <global-results>
           <result name="login">/WEB-INF/pages/login.jsp</result>
        </global-results>
       <!-- 2.1 配置公共访问action 
            总结:action.class 默认值:ActionSupport
            action.method 默认值:execute
            result默认值为:success
            -->
        <action name="UIAction_*_*">
          <result>/WEB-INF/pages/{1}/{2}.jsp</result>
          <!--1, <interceptor-ref name="defaultstack"></interceptor-ref>
                 <interceptor-ref name="loginInterceptor"></interceptor-ref> 
               2,<interceptor-ref name="loginStack"></interceptor-ref> 
          -->
          <interceptor-ref name="loginStack"></interceptor-ref>  
        </action>
    </package>
    
    <!-- 3 加载其他配置文件 -->
    <include file="struts/struts-staff.xml"></include>
    
</struts>

登陆拦截器类LoginInterceptor如下:

package com.itheima.crm.web.interceptor;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;


public class LoginInterceptor extends MethodFilterInterceptor {

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub
        //判断session作用域是否有用户信息,如果有放行,如果没有拦截
        Object obj = ActionContext.getContext().getSession().get("loginstaff");
        if(obj==null){ 
            //获得当前运行的action, 没有此处也行,只是为了得到友好提示
             Object action = invocation.getAction();
             if(action instanceof ActionSupport){
                 ActionSupport actionSupport = (ActionSupport) action;
                 actionSupport.addFieldError("", "用户名与密码不匹配");
             }
            //没有登陆,需要登陆
            return "login";
        }
        //登陆,放行
        return invocation.invoke();
    }

}

注:由于目前struts2差不多已经被淘汰了,我们大多会使用spring MVC spring boot,所以这里只做简单介绍

以上是关于登陆拦截器总结的主要内容,如果未能解决你的问题,请参考以下文章

Struts2拦截器浅解

webserive学习记录5-拦截器完成登陆校验

SpringBoot实现登陆拦截

spring security 单一账户多地方登陆提醒, ajax 拦截器 Interceptor

Spring MVC 框架学习---- 后端接口小练习(计算器与登陆拦截)

OkHttpInterceptor 从 kotlin 拦截器导航到登录片段