Struts2自定义拦截器案例:验证用户是否登录拦截器

Struts拦截器是struts最强大的功能之一,也是他的核心

它可以在Action前后做一些事情,比如用户登录验证,这里主要针对用户登录配置详细说明

一 首先自定义一个用户拦截类,必须实现Interceptor接口或者继承他的实现类

因为我们是要拦截用户登录的,这里继承MethodFilterInterceptor类,此类可以针对方法进行拦截或方向

struts2拦截器原理就是AOP(面向切面)编程


package com.raylu.intercepter;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.raylu.domain.User;

/**
 * 自定义用户拦截器
 * 如果没有登录,自动跳转至登录页面
 * 如果已经登录,则放行
 * 自定义拦截器必须实现Intercepter接口或继承他的实现类
 * @author RayLu
 *
 */
public class UserInterceptor extends MethodFilterInterceptor{
	private static final long serialVersionUID = 1L;

	@Override
	protected String doIntercept(ActionInvocation arg0) throws Exception {
		User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
			if(user==null){
				return "login";
			}
			//如果用户存在,则放行
		return arg0.invoke();
	}
}

二,进行struts.xml配置拦截器,原则上哪个模块需要被拦截则在哪个模块进行配置

另外拦截器可以设定针对特定方法 放行,也就是不拦截,这里设定针对login方法不进行拦截

自定义拦截器配置需要注意: 如果配置了自定义拦截器栈,则Struts2原有的拦截器栈会失效,此时需引入struts2原有的拦截器栈defaultStack;

<?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="crm" namespace="/" extends="struts-default">
		<!-- 配置自定义拦截器 -->
		<interceptors>
			<interceptor name="UserInterceptor" class="com.raylu.intercepter.UserInterceptor"></interceptor>
			<!-- 配置自定义拦截器栈  -->
			<interceptor-stack name="myStack">
				<!-- 引入自定义拦截器 -->
				<interceptor-ref name="UserInterceptor">
					<!--表示对login这个方法不拦截,重要。。  -->
					<param name="excludeMethods">login</param>
				</interceptor-ref>
				<!-- 使用自定义拦截器必须引入defaultStack,否则只有自己的拦截器生效 -->
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
	
		<!-- 配置全局返回值 -->
		<global-results>
			<result name="success">/jsp/success.jsp</result>
			<result name="login">/login.htm</result>
			<result name="customerList">/jsp/customer/list.jsp</result>
		</global-results>


		<!-- User模块 -->
		<action name="user_*" class="com.raylu.web.UserAction" method="{1}">
			<!-- User模块中加入myStack拦截器 -->
			<interceptor-ref name="myStack"></interceptor-ref>
		</action>

		<!-- Customer模块 -->
		<action name="customer_*" class="com.raylu.web.CustomerAction"
			method="{1}">
			<!-- Customer模块中加入拦截器 -->
			<interceptor-ref name="myStack"></interceptor-ref>
		</action>
	</package>

</struts>


猜你喜欢

转载自blog.csdn.net/java_raylu/article/details/74157415