Struts2拦截器浅析(二)

Struts2内建拦截器

params拦截器
    负责将请求参数设置为Action属性。
staticParams拦截器
    将配置文件中的action元素的子元素param参数设置为Action属性
servletConfig拦截器
    将源于Servlet API的各种对象注入到Action,必须实现对应接口
fileUpload拦截器
    对文件上传提供支持,将文件和元数据设置到对应的Action属性(内部封装了Commons-FileUpload)
exception拦截器
    捕获异常,并且将异常映射到用户自定义的错误页面。
validation拦截器
    调用验证框架进行数据验证

默认拦截器栈

  • 在struts-default.xml中定义一个defaultStack拦截器栈,并将其指定为默认拦截器。
  • 只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器
  • 当为包中的某个action显示指定了某个拦截器,则默认拦截器不会起作用
  • 为action显示引用拦截器后,默认的拦截器defaultStack不再生效,需要手工引用
  • 拦截器栈中的各个拦截器的顺序很重要

开发权限验证拦截器

    已登录用户可以访问页面,未登录用户不可以访问页面。
    在WEB-INF下新建文件夹page,即WEB-INF/page/manage.jsp。我们知道WEB-INF下的资源不允许外部直接访问,可以创建Action,通过Action转发到此页面。
    在WEB-INF下创建login.jsp
    <h2>登录页面</h2>
    ${loginError }
    <form action="login" method="post">
                用户名:<input type="text" name="username" /><br/>
                 密码:<input type="password" name="password" /><br/>
            <input type="submit" value="登录"/>
    </form>
       能获取session的action
package com.lijy.action;

import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport implements SessionAware {
	private String username;
	private String password;
	private Map<String, Object> session;
	@Override
	public void setSession(Map<String, Object> session) {
		this.session = session;
	}

	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;
	}

	public Map<String, Object> getSession() {
		return session;
	}
	
	//处理登录请求
	public String login() {
		if ("admin".equals(username) && "123".equals(password)) {
			session.put("loginInfo", username);
			return SUCCESS;
		} else {
			session.put("loginError", "用户名或密码不正确!");
			return ERROR;
		}
	}

}
    给登录aciton添加过滤器
            <!-- 注册拦截器 -->
	    <interceptors>
	        <interceptor name="auth" class="com.lijy.interceptor.AuthInterceptor"></interceptor>
	        <!-- 自定义拦截器栈,组合了defaultStack和auth -->
	        <interceptor-stack name="myStack">
	           <interceptor-ref name="defaultStack"></interceptor-ref>
	           <interceptor-ref name="auth"></interceptor-ref>
	        </interceptor-stack>
	    </interceptors>
		<!-- 通过此Action访问后台管理页面,需要判断用户是否已登录,如果未登录则跳到登录页面 -->
	    <action name="auth">
	        <result>/WEB-INF/page/manage.jsp</result>
	        <result name="login">/login.jsp</result>
	        <!-- 引用自定义拦截器栈 -->
	        <interceptor-ref name="myStack"></interceptor-ref>
	    </action>
             <action name="login" class="com.lijy.action.LoginAction" method="login">
	         <result>/WEB-INF/page/manage.jsp</result>
	         <result name="error">/login.jsp</result>
	    </action>
    拦截器
package com.lijy.interceptor;

import java.util.Map;

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

public class AuthInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		ActionContext context = ActionContext.getContext();
		Map<String, Object> session = context.getSession();
		if (session.get("loginInfo") != null) {
			String result = invocation.invoke();
			return result;
		} else {
			return "login";
		}
	}

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值