Strust2拦截器

Posted 云破月丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Strust2拦截器相关的知识,希望对你有一定的参考价值。

Struts拦截器

filter:对所有的东西都过滤。.css,.js,.jpg。
interceptor:对action拦截。struts工具。

一、拦截器配置。
第一步:创建一个类,让其继承自AbstractInterceptor
第二步:配置struts.xml
1.添加<interceptors>配置节,添加拦截器配置。
2.在action中引用,<interceptors>中的配置。

注意:
1.在action中需要添加defaultStack引用
2.在建<interceptors>可以建立stack,把defaultStack也添加在里面,在引用的时候引用此stack即可。

二、在拦截器中使用内置对象。
1.ActionContext 获取Map.
2.ServletActionContext 获取HttpSession
3.实现SessionAware接口


三、使用拦截器实现登录身份验证。

有两个action是不能拦截。打回登录界面action,登录提交验证并写 session的action
在登录验证的auth方法中,分两种情况:
1.第一次登录验证。此时,session中没有信息,需要向session中添加登录信息
2.非第一次登录验证。此时,session中有信息,不需要再入session中添加信息

验证 autentication

授权 authorization

首先做个action:

package com.itnba.maya.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.itnba.maya.DAO.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class LoginAction extends ActionSupport implements ModelDriven<User>,SessionAware{
	private Map<String, Object> session = new HashMap<String, Object>();
	public Map<String, Object> getSession() {
		return session;
	}
	private User user = new User();
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public String login(){
		return SUCCESS;
	}
	public String auth(){
		List<String> uid = new ArrayList<String>();    //模拟从数据库接收数据
		uid.add("zhangsan");
		uid.add("lisi");
		uid.add("wangwu");
		uid.add("zhaoliu");
		Object obj = session.get("user");                    
		if(obj == null){           //判断是不是第一次进login
			if(uid.contains(user.getUsername())){  //判断输入的账号是不是已注册的账号
				session.put("user", user.getUsername());
				return SUCCESS;
			}
			else{
				return "login_error";
			}
		}
		else{
			return SUCCESS;
		}
	}
	
	@Override
	public User getModel() {
		
		return user;
	}
	@Override
	public void setSession(Map<String, Object> arg0) {
		this.session = arg0;
		
	}
}

然后在做一个拦截器:

package com.itnba.maya.util;

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

import org.apache.struts2.interceptor.SessionAware;

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

public class MyIntreceptor extends AbstractInterceptor{
	private Map<String, Object> session;
	@Override
	public String intercept(ActionInvocation arg0) throws Exception  {
		
		System.out.println("intercept is running");
		session = ActionContext.getContext().getSession();
		if(session.get("user") == null){
			return "login_error";
		}
		return arg0.invoke(); //继续往下走
	}

}

配置strust2.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.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
	<constant name="struts.ui.theme" value="simple"></constant>
    <package name="default" namespace="/" extends="struts-default">
		<interceptors>
			<interceptor name="myinterceptor" class="com.itnba.maya.util.MyIntreceptor"></interceptor>
			<interceptor-stack name="myStack">
				<interceptor-ref name="myinterceptor"></interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		
	<action name="Login_login" class="com.itnba.maya.controller.LoginAction" method="login">     //这是给登录界面
            <result>
                /Login/login.jsp
            </result>
        </action>
        <action name="Login_auth" class="com.itnba.maya.controller.LoginAction" method="auth">        //这是登录之后的结果界面
            <result>
                /Login/auth.jsp
            </result>
            <result name="login_error">
            	/Login/login.jsp
            </result>
        </action>
        <action name="*_*" class="com.itnba.maya.controller.{1}Action" method="{2}">          //这是拦截其他的页面
            <interceptor-ref name="myStack"></interceptor-ref>
            <result>
                /{1}/{2}.jsp
            </result>
            <result name="login_error">
            	/Login/login.jsp
            </result>
        </action>
        
    </package>
</struts>

这样就实现了对登录的拦截

以上是关于Strust2拦截器的主要内容,如果未能解决你的问题,请参考以下文章

Strust2中,加入监听器来判断用户是否在session中存在。

strust2自定义interceptor的基本方法及操作

JAVA框架Struts2 数据封装

Struts2框架的执行流程

Struts2入门

OkHttpInterceptor 从 kotlin 拦截器导航到登录片段