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