Struts2拦截器配置(简单的登陆后的权限验证)

 

简单登陆后的权限验证

1.UserAction

public String login(){
        //为防止用户重复提交同一请求(当直接在地址栏输入请求时,)
        session=context.getSession();//首先获取session
        User userSession=(User)session.get("user");        
        if(userSession==null){//如果没有获取到session,return SUCCESS;
            
            if(user!=null){//继续判断,用户是否传递了参数
                
                if(new UserDao().login(user)){//继续判断,如果用户名密码正确                    
                    session.put("user", user);//将用户信息放到session中
                    return SUCCESS;
                }else{
                    error="用户名或密码错误";//如果用户名不正确,显示一下错误信息,
                    return "error";
                }
                
            }else{
                error="用户名或密码错误";//没有传递参数,在界面显示一下错误信息,
                return "error";
            }
            
        }else{
            return SUCCESS;//如果获取到session,return SUCCESS;
        }        
    }

2.Struts.xml中拦截器的配置信息

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    
    <constant name="struts.enable.DynamicMethodInvocation" value="false" /><!-- 动态方法激发,默认是false -->
    <constant name="struts.devMode" value="true" /><!-- 跟踪,生成很多调试信息,开发时写为true -->
    
    <package name="default" extends="struts-default">
    
        <!-- 用户登录拦截器配置 -->
        <!-- 定义一个拦截器 -->
        <interceptors>
            <!-- 拦截器位置(自定义的拦截器类) -->
            <interceptor name="userInterceptor" class="com.maya.interceptor.UserInterceptor"></interceptor>
            
            <!-- 为方便自定义的拦截器栈(我们可以把自定义的多个拦截器,放到这里面,然后直接调用该拦截器栈即可) -->
            <interceptor-stack name="myStack">
                <interceptor-ref name="userInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!--
             使当前包的所有请求,都会被拦截器拦截,当然有些公共页面是不需要拦截的,所以就在其中加上 
             <interceptor-ref name="defaultStack"></interceptor-ref>
        -->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>
        
        <!-- result全局配置错误页面,一般每个action都是需要一个错误界面的  -->
        <global-results>
            <result name="error">error.jsp</result>
        </global-results><!-- 用户的登陆请求 -->
        <action name="User_login" class="com.maya.interceptor.UserAction" method="login">
            <result name="success" type="redirectAction">
                <param name="actionName">Info_findall</param>
            </result>
            <result name="error">User_login.jsp</result>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <!-- 排除当前请求受到拦截器的影响 -->
        </action>
    </package>   
</struts>

3.拦截器

package com.maya.interceptor;

import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class UserInterceptor implements Interceptor {除了实现Iterceptor接口外,我们还可以继承AbstractInterceptor这个类,实现其中的intercept(ActionInvocation invocation)方法即可 

    @Override
    public void destroy() {
        //销毁方法
    }

    @Override
    public void init() {
        //初始化方法
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext context=invocation.getInvocationContext();//获取Context上下文
        Map<String, Object> session=context.getSession();//获取session
        User user=(User)session.get("user");//判断是否登陆
        String result=null;
        if(user==null){
            result="error";
        }else{
            result=invocation.invoke();//如果登陆了,就继续往下执行
        }
        return result;
    }
}
原文地址:https://www.cnblogs.com/AnswerTheQuestion/p/6549334.html