Struts2自定义拦截器详解编程语言

自定义拦截器实现对用户登陆的拦截,当用户没有登陆时跳转到登陆页面提示用户登陆,如果用户输入登陆信息错误提示用户登陆信息不匹配,如果成功跳转到首页。

代码实现:
jsp文件:
login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%> 
<%@ taglib uri="/struts-tags"  prefix="s"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>用户登录</title> 
</head> 
<body> 
    <s:fielderror></s:fielderror> 
    <form action="${pageContext.request.contextPath}/userAction_login" method="post"> 
        用户名: <input type="text" name="username" /> <br/> 
        密码: <input type="password" name="password" /> <br/> 
        <input type="submit" value="登录" /> 
    </form> 
</body> 
</html>

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
</head> 
<body> 
    ${loginUser.username},欢迎登录 
</body> 
</html>

action类

package com.my.action; 
 
import com.my.bean.User; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionSupport; 
import com.opensymphony.xwork2.ModelDriven; 
 
public class UserAction extends ActionSupport implements ModelDriven<User> {  
 
    private User user = new User(); 
 
    public String login(){ 
        return "login"; 
    } 
 
    public String index(){ 
        return SUCCESS; 
    } 
 
    public User getModel() { 
        return this.user; 
    } 
 
    public void validateLogin() { 
 
        if("jack".equals(user.getUsername()) && "1234".equals(user.getPassword())){ 
            //登录--session 
            ActionContext.getContext().getSession().put("loginUser", user); 
        } else { 
            //信息有误 
            this.addFieldError("username", "用户名与密码不匹配"); 
        } 
    } 
 
} 

拦截器类,实现Interceptor接口,覆写intercept方法。

public class LoginInterceptor implements Interceptor { 
 
    @Override 
    public void init() { 
    } 
 
    @Override 
    public String intercept(ActionInvocation invocation) throws Exception { 
        //如果session有数据则放行,没有数需要登录 
        Object userLogin = ActionContext.getContext().getSession().get("loginUser"); 
        if(userLogin == null){ 
            //需要登录 
            Object action = invocation.getAction(); 
            if(action instanceof ActionSupport){ 
                ActionSupport actionSupport = (ActionSupport) action; 
                actionSupport.addFieldError("username", "请登录"); 
            } 
            return "input"; 
        } 
        // 放行 
        return invocation.invoke(); 
    } 
 
    @Override 
    public void destroy() { 
    } 
 
} 

在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> 
    <package name="login" namespace="/" extends="struts-default"> 
        <interceptors> 
            <!-- 注册拦截器 --> 
            <interceptor name="loginInterceptor" class="com.my.interceptor.LoginInterceptor"></interceptor> 
            <!--  编写自定义拦截器栈 --> 
            <interceptor-stack name="loginStack"> 
                <!-- 先引用 父类的默认拦截器栈 --> 
                <interceptor-ref name="defaultStack"></interceptor-ref> 
                <!-- 将自己添加到 默认拦截器栈之后 --> 
                <interceptor-ref name="loginInterceptor"></interceptor-ref> 
            </interceptor-stack> 
        </interceptors> 
 
        <action name="userAction_*" class="com.my.action.UserAction" method="{1}"> 
            <result name="login" type="redirectAction"> 
                <param name="namespace">/</param> 
                <param name="actionName">userAction_index</param> 
            </result> 
            <result name="success">/success.jsp</result> 
            <result name="input">/login.jsp</result> 
            <interceptor-ref name="loginStack"></interceptor-ref> 
        </action> 
    </package> 
 
</struts> 
 

因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
如果希望包下的所有action都使用自定义的拦截器,可以通过<default-interceptor-ref name=“permissionStack”/>把拦截器定义为默认拦截器。每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。

运行结果:
这里写图片描述

这里写图片描述

这里写图片描述

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/12073.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论