Struts2自定义拦截器

来源:互联网 发布:淘宝刀具 编辑:程序博客网 时间:2024/06/15 14:16

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

代码实现:
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显式指定了某个拦截器,则默认拦截器不会起作用。

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

这里写图片描述

这里写图片描述

0 0
原创粉丝点击