登陆拦截器总结

这是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,所以这里只做简单介绍

时间: 09-02

登陆拦截器总结的相关文章

JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现

一.自定义拦截器 1.架构 2.拦截器创建 //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implements Interceptor{} //创建方式2: 继承AbstractInterceptor -> struts2的体贴 //帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法 public class MyInterceptor2

【Java EE 学习第70天】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】

一.数据加密处理 这里使用MD5加密处理,使用java中自带加密工具类MessageDigest. 该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组.最关键的是需要将这个16位的字节数组转换成为32位的字符串,转换方法是使用位移+与运算.将高四位移到低四位&0X0F得到一个字符,直接使用该值&0X0F得到一个字符,这样一个8bit的字节就能够拆成2个字符.最终16Byte就能够转换成为32个字符. 1 package com.kdyzm.utils;

SpringMVC 登陆拦截器实现登陆控制

思路,先登陆后,将登陆信息存储在session中,然后通过拦截器,对系统中的页面和资源进行访问拦截,同时对于登陆本身相关的页面和资源不拦截. 实现方法: /**  * 登陆拦截器.  *  * @author leizhimin 2014/6/26 16:08  */ public class LoginInterceptor extends HandlerInterceptorAdapter {     private static final String[] IGNORE_URI = {"

bos项目第二天(msyql操作、ssh配置集成、PowerDesinger、自定义登陆拦截器)

项目第二天(完整流程) 1.  第二天 重点内容 搭建SSH 完成框架 以用户管理为例 用户登录 用户退出 修改密码 2.  开发流程 2.1.  业务分析 2.2.  数据库设计 MySQL : 新建 DataBase . 新建用户 User .进行授权 Oracle : 新建用户 User . 创建表空间 . 在表空间进行操作 MySQL 操作步骤 : 步骤: 新建数据库 查看字符集 show variables like '%char%'; client.connection.result

struts2登陆拦截器 (FIX)

struts2.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>

Java登陆拦截器

package com.beidou.warehouseerp.interceptor; import com.alibaba.fastjson.JSON; import com.beidou.warehouseerp.dto.BaseResult; import com.beidou.warehouseerp.util.Const; import org.springframework.stereotype.Component; import org.springframework.web.s

JAVAEE——BOS物流项目03:学习计划、messager、menubutton、登陆拦截器、信息校验和取派员添加功能

1 学习计划 1.jQuery easyUI messager使用方式 n alert方法 n confirm方法 n show方法 2.jQuery easyUI menubutton使用方式 3.自定义拦截器实现用户未登录自动跳转到登录页面 n 创建拦截器 n 注册拦截器 4.基于ajax实现用户修改密码功能 n easyUI中validatebox校验功能 n 发送ajax请求 n 服务端修改数据库 5.基础设置部分需求分析 6.创建基础设置部分数据表 n 取派员表 n 区域表 n 分区表

SSH实现登陆拦截器

/** * 登录验证拦截器 * */ @SuppressWarnings("serial") public class LoginInteceptor implements Interceptor { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void init() { // TODO Auto-generated method stub } /**每次

springmvc 登陆拦截器 配合shiro框架使用

public class LoginHandlerInterceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub String path = r