Jimmy小站

小明也有大梦想 — 蒋明/铭
当前位置:网站首页 / 未分类 / 正文

struts2 的拦截器 (interceptor)

2016-05-08 / 未分类 / 2466 次围观 / 0 次吐槽

首先是在struts.xml中配置好拦截器(interceptors->interceptor),然后将一组完成组合任务的拦截器配置成拦截器栈(interceptor-stack)。

最后在需要这个拦截器栈的Action中加入 interceptor-ref。同时我们还能设置全局默认的拦截器(default-interceptor-ref),在设置了全局默认拦截器之后,若是某些特殊的Action不需要任何拦截器,可在该Action下定义一个(<interceptor-ref name="defaultStack"/>),在Action中定义了拦截器将会覆盖全局默认拦截器。而该拦截器是最基础的拦截器,不做任何处理。最终相关配置如下。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	
	<package name="struts-global" extends="struts-default">
		<interceptors>
			<!-- 自定义一个拦截器,检查session中是否有登录信息 -->
			<interceptor name="authorLogin" class="authorLogin"/>
			<!-- 加入必须的default拦截器组 组成完整自定义拦截器(如果不这样,会无法获取参数) -->
			<interceptor-stack name="loginInterceptorStack">
				<interceptor-ref name="defaultStack"/>
				<interceptor-ref name="authorLogin"/>
			</interceptor-stack>
		</interceptors>
		
		<!-- 默认全部都需要经过的拦截器,用于验证用户是否登录,尚未登录的不能访问相关信息 -->
		<default-interceptor-ref name="loginInterceptorStack"/>
		
		<!-- 全局 result, 要是在自己的action中找不到result时,会在这个全局result中寻找 -->
		<global-results>
			<result name="errHandler" type="redirect">/error.jsp</result>
			<result name="noSession" type="redirect">/loginPage.jsp</result>
		</global-results>
		<!-- 关联异常类,如发生异常则返回一个 errHandler字串,然后寻找全局result获得error.jsp页面返回 -->
		<global-exception-mappings>
			<exception-mapping result="errHandler" exception="java.lang.Exception" />
		</global-exception-mappings>
	</package>
	
	<package name="default" namespace="/" extends="struts-default,struts-global">
		<!-- 登录相关Action -->
		<action name="login_*" class="login" method="{1}">
			<result name="success">/index.jsp</result>
			<result name="error">/loginPage.jsp</result>
			<result name="loginPage">/loginPage.jsp</result>
			<!-- 加入defalutStack后,覆盖全局默认拦截器,
				即不需要session也能执行,因为登录操作完成之前肯定是没有session的 -->
			<interceptor-ref name="defaultStack"/>
		</action>
		
		<!-- 文件上传相关Action -->
		<action name="upload_*" class="upload" method="{1}">
			<result name="page">/uploadPage.jsp</result>
			<result name="success">/uploadPage.jsp</result>
		</action>
	</package>
</struts>

该项目使用了Spring,所以所有类都交由Spring管理了,下面贴出applicationContext.xml与相关类的实现

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" xmlns:tx="http://www.springframework.org/schema/tx">
	
	<bean id="login" class="net.share.action.LoginAction" />
	<bean id="upload" class="net.share.action.UploadAction" />
	<bean id="authorLogin" class="net.share.action.AuthorizationInterceptor" />
	
</beans>

LoginAction.java

package net.share.action;

import net.share.model.ComUser;
import net.share.service.UserService;
import net.share.service.UserServiceImpl;

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

public class LoginAction extends ActionSupport implements ModelDriven<ComUser> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	ComUser user = new ComUser();
	String loginInfo;
	
	@Override
	public ComUser getModel() {
		
		return user;
	}

	public String getLoginInfo() {
		return loginInfo;
	}

	public void setLoginInfo(String loginInfo) {
		this.loginInfo = loginInfo;
	}

	@Override
	public String execute() throws Exception {
		
		System.out.println("LoginAction-execute...");
		return "loginPage";
	}
	
	public String loginPage(){
		System.out.println("LoginAction-loginPage...");
		return "loginPage";
	}
	
	public String doLogin() throws Exception{

		System.out.println("LoginAction-doLogin...");
		System.out.println(user.getUserName()+"==="+user.getPassword());
		UserService uService = new UserServiceImpl();
		ComUser user2 = uService.getUserByName(user.getUserName());
		//System.out.println(user2.getPassword());
		if (user2 != null && user.getPassword().equals(user2.getPassword())) {
			//System.out.println("success");
			ActionContext.getContext().getSession().put("user", user);
			loginInfo = SUCCESS;
			return SUCCESS;
		} else if (user2 == null) {
			loginInfo = "用户不存在!";
		} else {
			loginInfo = "用户密码错误!";
		}
			
		System.out.println("error");
		loginInfo = ERROR;
		return ERROR;
	}

	
}

AuthorizationInterceptor.java

package net.share.action;

import net.share.model.ComUser;

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

public class AuthorizationInterceptor implements Interceptor{

	private static final long serialVersionUID = 1L;

	@Override
	public void destroy() {
		
		System.out.println("AuthorizationInterceptor destroy...");
	}

	@Override
	public void init() {
		
		System.out.println("AuthorizationInterceptor init...");
	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("AuthorizationInterceptor intercept...");
		ComUser user = (ComUser) ActionContext.getContext().getSession().get("user");
		if (user != null) {
			return invocation.invoke();
		}
		return "error";
	}
}


推荐您阅读更多有关于“struts2interceptor,”的文章

[一个Java程序猿的转型之路,读研深造,专注机器学习推荐算法]
本站所有文章如无特别注明均为原创。作者:吉米酱 ,复制或转载请以超链接形式注明转自 Jimmy小站
原文地址《struts2 的拦截器 (interceptor)
额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © Jimmy小站 Allrights Reserved.备案号:桂ICP备 15005996