Struts2拦截器实例——登录校验

登录校验拦截器

除了登录请求不被拦截,对用户的所有其他请求进行拦截。对没有登录的用户如果访问其他需要用户的页面进行页面跳转,从新跳转回登录页面。进行登录操作

实现过程
  • 前端页面实现
<body>
    <form action="${pageContext.request.contextPath }/UserAction_login" method="post">
        用户名:<input type="text" name="user_code"></br>
        密码:<input type="text" name="user_password"></br>
        <input type="submit" value="提交">
    </form> 
  </body>
  • 编写User实体类
package cn.itheima.domain;

public class User {
    private String user_code;
    private String user_password;
    public String getUser_code() {
        return user_code;
    }
    public void setUser_code(String user_code) {
        this.user_code = user_code;
    }
    public String getUser_password() {
        return user_password;
    }
    public void setUser_password(String user_password) {
        this.user_password = user_password;
    }
}
  • Dao数据处理和Service层数据交互省略
    Dao层通过用户名查询到该用户的的信息,并封装到User对象中
    Service层对用户数据进行处理,对Dao层传递过来的User对象进行判断,如果用户为null,则说明——账户不存在,并抛出异常提示用户不存在;如果用户不为null,则再取出Dao层返回的对象的password,和前端页面传递过来的password进行判断,如果相等,就登录成功,如果不相等,则说明——密码错误,并抛出异常提示账户密码错误。

  • Action类的编写

package cn.itheima.web.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import cn.itheima.domain.User;
import cn.itheima.service.UserService;
import cn.itheima.service.impl.UserServiceImpl;

public class UserAction extends ActionSupport implements ModelDriven<User> {
    private User user = new User();
    private UserService us  = new UserServiceImpl();

    public String login() throws Exception {
        //1 调用Service 执行登陆操作
        User u = us.login(user);
        //2 将返回的User对象放入session域作为登陆标识
        ActionContext.getContext().getSession().put("user", u);
        //3 重定向到项目的首页
        return "toHome";
    }

    @Override
    public User getModel() {
        return user;
    }
}
  • 编写自定义拦截器
package cn.itheima.web.interceptor;

import java.util.Map;

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

public class LoginInterceptor extends MethodFilterInterceptor {
    //指定不拦截登陆方法. 其他方法都拦截

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {

        //1.获得session
        Map<String, Object> session = ActionContext.getContext().getSession();
        //2.如果用户登录成功,会向session域中存放user对象,所以这个就是判断用户是否登录的标识
        Object object = session.get("user");
        //3.判断登陆标识是否存在
        if(object == null){
            //不存在=>没登录=>重定向到登录页面,这里需要配置全局的结果集,用于全局的页面跳转
            return "toLogin";
        }else{
            //存在=>已经登陆=>放行
            return invocation.invoke();
        }
    }
}
  • 配置拦截器信息
<?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>
    <!-- 指定struts2是否以开发模式运行
            1.热加载主配置.(不需要重启即可生效)
            2.提供更多错误信息输出,方便开发时的调试
     -->
    <constant name="struts.devMode" value="true"></constant>
    <package name="crm" namespace="/" extends="struts-default" >
        <interceptors>
            <!-- 注册拦截器 -->
            <interceptor name="loginInterceptor" class="cn.itheima.web.interceptor.LoginInterceptor"></interceptor>
            <!-- 注册拦截器栈 -->
            <interceptor-stack name="myStack">
                <interceptor-ref name="loginInterceptor">
                    <param name="excludeMethods">login</param>
                </interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 指定包中的默认拦截器栈 -->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>
        <!-- 定义全局结果集 -->
        <global-results>
            <result name="toLogin" type="redirect" >/login.jsp</result>
        </global-results>
        <global-exception-mappings>
            <!-- 如果出现java.lang.RuntimeException异常,就将跳转到名为error的结果 -->
            <exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
        </global-exception-mappings>

        <action name="UserAction_*" class="cn.itheima.web.action.UserAction" method="{1}" >
            <result name="toHome" type="redirect" >/index.htm</result>
            <result name="error"  >/login.jsp</result>
        </action>
    </package>
</struts>
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值