struts2拦截器: struts2拦截器实现验证登陆

在我们使用servlet的时候,有一个叫过滤器的技术, 通过配置文件匹配,去拦截我们的每一个请求,过滤器就可以对该请求进行一定的操作,然后在放行到对应的请求,
struts2 由于本身是filter(过滤器)实现, 为了为我们struts2增加一个拦截请求的功能,就开发了一个拦截器,简单来说就是struts2里面的过滤器。

自定义拦截器:

package com.xingxue.filter;

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

public class LoginInterceptor implements Interceptor{

    public void destroy() {
        // TODO Auto-generated method stub

    }

    public void init() {
        // TODO Auto-generated method stub

    }

    public String intercept(ActionInvocation arg0) throws Exception {

        System.out.println("interceptor......");
        //放行
        return arg0.invoke();

    }

}

注册拦截器:

<package name="admin" namespace="/admin" extends="struts-default" >

        <interceptors>
            <interceptor name="loginInterceptor" class="com.xingxue.filter.LoginInterceptor"></interceptor>
        </interceptors>
<package>       

为action添加拦截器:

<action name="adminLogin" class="com.xingxue.action.admin.AdminAction" method="adminLogin">
            <interceptor-ref name="loginInterceptor"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
             <result name="OK" type="chain">findMenuByAdmin</result>
             <result name="NO">/view/user/login.jsp</result>
        </action>
        <action name="findMenuByAdmin" class="com.xingxue.action.admin.AdminAction" method="findMenuByAdmin">
             <result name="OK">/view/index.jsp</result>
            <result name="NO">/view/user/login.jsp</result>
            <interceptor-ref name="loginInterceptor"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>

注意:action想要使用拦截器,必须独立配置,

同时记住 <interceptor-ref name="defaultStack"></interceptor-ref>
必须加上,拦截器默认会拦截住参数,加上此配置,就会对参数放行

但是上述写法会导致程序有大量的配置,这就增加了开发难度,所以实际使用时可以采用全局拦截器进行配置:

1、创建拦截登陆拦截器

package com.xingxue.filter;

import java.util.Map;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

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

public class LoginInterceptor implements Interceptor{

    public void destroy() {
        // TODO Auto-generated method stub

    }

    public void init() {
        // TODO Auto-generated method stub

    }

    public String intercept(ActionInvocation arg0) throws Exception {

        System.out.println("interceptor......");
        //放行

        String url = ""+ServletActionContext.getRequest().getRequestURL();

        //验证是否是登陆
        if(url.contains("adminLogin") || url.contains("userLogin")) {
            return arg0.invoke();
        }else {
            HttpSession session = ServletActionContext.getRequest().getSession();
            Map<String, Object> admin = (Map<String, Object>) session.getAttribute("userBean");
            if(admin == null) {
                return "login";
            }else {
                return arg0.invoke();
            }
        }
    }

}

2、配置全局拦截器:

<!--  拦截器包  -->
    <package name="interceptor" extends="struts-default">
        <!--  定义拦截器集合  -->
        <interceptors>
            <!--  注册自定义拦截  -->
            <interceptor name="login" class="com.xingxue.filter.LoginInterceptor"></interceptor>

            <!-- 注册拦截器栈 吧多个拦截器按照一定顺序组合在一起,叫一个名字 -->
            <interceptor-stack name="allInterceptor">
                <interceptor-ref name="login"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>

        </interceptors>

        <!-- 注册拦截器到struts2 -->
        <default-interceptor-ref name="allInterceptor"></default-interceptor-ref>

        <!-- 定义返回结果 -->
        <global-results>
            <result name="login">/view/user/login.jsp</result>
        </global-results>

    </package>

拦截器栈: 拦截器就是将多个拦截器合并为一个

3、在需要使用拦截器的package继承自我们的全局拦截器:

扫描二维码关注公众号,回复: 2496127 查看本文章
<package name="admin" namespace="/admin" extends="interceptor" >
        <action name="adminLogin" class="com.xingxue.action.admin.AdminAction" method="adminLogin">
             <result name="OK" type="chain">findMenuByAdmin</result>
             <result name="NO">/view/user/login.jsp</result>
        </action>
        <action name="findMenuByAdmin" class="com.xingxue.action.admin.AdminAction" method="findMenuByAdmin">
             <result name="OK">/view/index.jsp</result>
            <result name="NO">/view/user/login.jsp</result>
        </action>
    </package>

猜你喜欢

转载自blog.csdn.net/sky274548769/article/details/81185039