Struts2自定义拦截器

介绍
Struts2的拦截器(Intercaptor)在Action前后执行,完成了横切、预处理和后加工的任务,隔离了Web应用程序的关注点,使得一些特殊处理任务封装了拦截器中,极大的提高了分离程度,并且提高了代码的重用性。Struts2在其默认包struts-default中提供的默认拦截器栈-defaultStack,提供了从数据转移和验证到一场处理,完成了框架的大部分处理工作,虽然满足了开发人员的大部分需求,但是有些时候也需要自定义拦截器,比如实现用户是否登录验证。

自定义拦截器步骤:
1. 编写自定义拦截器类,实现interceptor接口,或者继承AbstractIntercaptor抽象类。
2. 在struts.xml文件中配置拦截器。

情景设计
当用户登录成功可以查看相关详细信息页面,没登录时不能查看详细信息页面,并且自动跳转到登录页面,逻辑很简单,下面看一下具体实现代码。

实现细节
代码总体结构,如下图
这里写图片描述

1.创建拦截器类AuthenticationInterceptor.java
首先看一下如何自定义拦截器类,创建java类:AuthenticationInterceptor,实现interceptor接口,或者继承AbstractIntercaptor抽象类,如果实现interceptor接口,需要实现三个抽象方法,destroy,init,intercept。AbstractIntercaptor抽象类需要实现intercept抽象方法。两个抽象方法都传入一个ActionInvocation对象,返回字符串对象。
AuthenticationInterceptor.java

package cn.sanishan.common.interceptor;

import java.util.Map;

import cn.sanishan.common.bean.User;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

/**
 * 自定义拦截器,判断session中用户名是否存在如果不存在则进入登录界面
 * 实现Interceptor接口,实现三个方法(destroy、init、intercept)
 * @author ShanQiang
 * @date 2015年8月7日
 */
public class AuthenticationInterceptor implements Interceptor{

    public void destroy() {
    }

    public void init() {
    }

    public String intercept(ActionInvocation actinInvocation) throws Exception {
        // 通过ActionInvocation对象获取session,为了解耦,不推荐使用servelet api获取session
        Map session = actinInvocation.getInvocationContext().getSession();
        User user = (User) session.get("user");
        if(user==null){ // 如果用户为空,跳转到登录界面
            return Action.LOGIN;
        }else{
            return actinInvocation.invoke();
        }
    }


}

2.处理登录的Action
UserLogin.java

package cn.sanishan.common.action;

import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import cn.sanishan.common.bean.User;
import cn.sanishan.common.service.UserService;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 用户登录验证
 * 继承ActionSupport类,重写execute()
 * @author ShanQiang
 * @date 2015年8月7日
 */
public class UserLogin extends ActionSupport implements SessionAware{

    private User user;
    // 由于SessionAware接口中的注册session的方法-setSession(Map session)需要一个Map类型
    private Map session;
    @Override
    public String execute() throws Exception {

        UserService service = new UserService();

        String result = service.validateUser(user);

        System.out.println(result);

        if("success".equals(result)){
            session.put("user",user);
        }

        return result;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    /**
     * 通过SessionAware的setSession方法注册session
     */
    public void setSession(Map session) {
        this.session = session;
    }
}

3.UserService.java

package cn.sanishan.common.service;

import java.util.HashMap;
import java.util.Map;

import cn.sanishan.common.bean.User;

/**
 * 
 * @author ShanQiang
 * @date 2015年8月7日
 */
public class UserService {

    private static Map users = new HashMap();
    /**
     * 通过静态块,创建一个对象
     */
    static{

        User user1 = new User();
        user1.setUsername("zhangsan");
        user1.setPassword("123");
        users.put(user1.getUsername(),user1);
    }
    /**
     * 获取user对象
     * @param user
     * @return
     */
    public User getUser(String username){
        return (User) users.get(username);
    }
    /**
     * 验证用户是否存在,如果存在返回true,
     * @param user
     * @return
     */
    public String validateUser(User user){
        // 通过用户名去查询用户
        User _user = this.getUser(user.getUsername());
        // 判断用户是否为空,如果为空的话返回"input",如果不为空的话,进一步判断密码是否正确。
        if(_user!=null){
            if( user.getPassword().equals( _user.getPassword() ) ){
                return "success";
            }else{
                return "input";
            }
        }else{
            return "input";
        }
    }
}

4.User.java

package cn.sanishan.common.bean;
/**
 * 用户实体类
 * @author ShanQiang
 * @date:2015年8月7日
 */
public class User {
    // 用户名
    private String username;
    // 密码
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

5.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>
    <!-- 设置编码 -->
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    <!-- 开发者模式 -->
    <constant name="struts.devMode" value="true"/>

    <package name="common" extends="struts-default" namespace="/common">
        <!-- 自定义拦截器 -->
        <interceptors>
            <interceptor name="authenticationIntercepttor" 
                class="cn.sanishan.common.interceptor.AuthenticationInterceptor"/>
        </interceptors>

        <!-- 配置全局返回结果 -->
        <global-results>
            <!-- 用户判断session的结果 -->
            <result name="login">/Login.jsp</result>
            <result name="input">/Login.jsp</result>
            <result name="error">/WEB-INF/common/Error.jsp</result>
        </global-results>

        <!-- 全局异常处理 -->
        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error" />
        </global-exception-mappings>

        <action name="Login" class="cn.sanishan.common.action.UserLogin">
            <result name="success">/WEB-INF/common/LoginSuccess.jsp</result>
        </action>

        <action name="show" class="cn.sanishan.common.action.ShowAction">
            <interceptor-ref name="authenticationIntercepttor"></interceptor-ref>
            <result>/WEB-INF/common/ShowDetail.jsp</result>
        </action>
    </package>
</struts>

6.前端页面
(1) index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title>HelloWorld</title>
  </head>

  <body>
    <script>
        // 项目一加载就进入到登录界面
        window.location = " Login.jsp";
    </script>
  </body>
</html>

(2) Login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix='s' uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Login</title>
  </head>
  <body>
    <s:form action="common/Login">
        <s:textarea name="user.username" label="用户名"></s:textarea>
        <s:password name="user.password" label="密码"></s:password>
        <s:submit value="登录"></s:submit>
    </s:form>
  </body>
</html>

(3) LoginSuccess.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!-- 引入struts2的标签库s -->
<%@ taglib prefix='s' uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>LoginSuccess</title>

  </head>

  <body>
    <s:set name="username" value="user.username"></s:set>
     欢迎<s:property value="#username"/>登录成功!<br>
    <a href="common/show.action">显示</a>      
  </body>
</html>

(4) ShowDetail.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
  </head>

  <body>
        显示详细信息页面<br>
  </body>
</html>

(5) Error.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>Error</title>
  </head>
  <body>
    Error!!!
  </body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值