Struts拦截器

Struts拦截器和过滤器的区别:

过滤器:对所有的东西都过滤。包括css,.js,.jpg等。

拦截器:只对action拦截。是struts工具。

一、拦截器配置。

1.创建一个类,让其继承自AbstractInterceptor

2.配置struts.xml

1)添加<interceptors>配置节,添加拦截器配置。
2)在action中引用,<interceptors>中的配置。

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

<?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" />

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

        <interceptors>
            <interceptor name="lanjieqi" class="com.itnba.maya.util.Lanjieqi"></interceptor>
                <interceptor-stack name="newStack">
                <interceptor-ref name="lanjieqi"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
         </interceptors>
        <action name="*_*" class="com.itnba.maya.controller.{1}Action" method="{2}">
         <!-- 直接引用newStack -->
        <interceptor-ref name="newStack"></interceptor-ref>
            <result>
                {1}_{2}.jsp
            </result>
        </action>
    </package>

</struts>

二、在拦截器中使用内置对象。

获取Session

1.ActionContext 获取Map.
2.ServletActionContext
3.实现SessionAware接口

*****************************************************************

实例:使用拦截器实现登录身份验证。

有两个action是不能拦截。打回登录界面action,登录提交验证并写 session的action

在登录验证的auth方法中,分两种情况:
1.第一次登录验证。此时,session中没有信息,需要向session中添加登录信息
2.非第一次登录验证。此时,session中有信息,不需要再入session中添加信息

建一个User对象

package com.itnba.maya.model;

public class User {
    private String userName;
    private String password;
    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;
    }
}

struts.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" />

    <package name="default" namespace="/" extends="struts-default">
    <!--  -->
        <interceptors>
            <interceptor name="lanjieqi" class="com.itnba.maya.util.Lanjieqi"></interceptor>
            <interceptor name="Loginlanjieqi" class="com.itnba.maya.util.Loginlanjieqi"></interceptor>
                <interceptor-stack name="newStack">
                <interceptor-ref name="lanjieqi"></interceptor-ref>
                <interceptor-ref name="Loginlanjieqi"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
        </interceptors>
        <global-results>
            <result name="nologin">Login_login.jsp</result><!-- session里没有值再跳回Login_login.jsp -->
        </global-results>
        <!-- Login_login和Login_home不能拦截掉,写上面不受拦截器控制  -->
        <action name="Login_login" class="com.itnba.maya.controller.LoginAction" method="login">
            <result>Login_login.jsp</result>
        </action>
        <action name="Login_home" class="com.itnba.maya.controller.LoginAction" method="home">
            <result>Login_home.jsp</result>
        </action>
        <action name="*_*" class="com.itnba.maya.controller.{1}Action" method="{2}">
        <interceptor-ref name="newStack"></interceptor-ref>
            <result>
                {1}_{2}.jsp
            </result>
        </action>
    </package>

</struts>

ActionSupport类

package com.itnba.maya.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.itnba.maya.model.User;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    HttpSession session=ServletActionContext.getRequest().getSession();
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String login(){  //login页面直接跳走
        return SUCCESS;
    }

    public String home(){
        //模拟从数据库中查出来
        List<String> list=new ArrayList<String>();
        list.add("zhangsan");
        list.add("lisi");
        list.add("wangwu");
        list.add("zhaoliu");
        //第一次session肯定是null的
        Object obj=session.getAttribute("user");
        if(obj==null){
            if(user!=null){ //不判断下会空会报空指针错误
                if(list.contains(user.getUserName())){ //看看账号是否有,这里没验证密码
                    session.setAttribute("user", user.getUserName());//有就往session放值
                    return SUCCESS;
                }
                else{
                    return "nologin"; //不包含就走"nologin"
                }
            }else{
                return "nologin";
            }    

        }
        else{
            return SUCCESS;
        }
    }

}

拦截器的类,判断sessioni是否有值

package com.itnba.maya.util;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

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

public class Loginlanjieqi extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        //先获取session
        HttpSession session=ServletActionContext.getRequest().getSession();
        //session如果没值就转到nologin
        if(session.getAttribute("user") == null){
            return "nologin";
        }
        return arg0.invoke();
    }

}

jsp页面

登录

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>这是登录页面</h1>
<form action="Login_home">
账号:<input type="text" name="user.userName"><br>
密码:<input type="password" name="user.password"><br>
<input type="submit" value="登录">
</form>

</body>
</html>

home验证session之后的页面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
账号:<s:property value="user.userName"/>
</body>
</html>
时间: 2024-10-13 07:04:23

Struts拦截器的相关文章

struts拦截器的详解

1.拦截器:Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. WebWork中文文档解释:拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也提供了一种可以提取Action中可重用的代码的方式. 拦截器栈(Interceptor Stack):Struts2拦截器栈就是将拦截器按

(转)Struts 拦截器

一.拦截器是怎么实现: 实际上它是用Java中的动态代理来实现的 二.拦截器在Struts2中的应用 对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作.像params拦截器将http请求中参数解析出来赋值给Action中对 应的属性.Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递 给Action……struts2内置的拦截器有很多,在此我就不一一列举了. 那么怎么在struts2中定义自己的拦

struts拦截器实现原理

图1: 上1来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3 接着FilterDispatcher被调用,FilterDispatche

Struts拦截器Interceptor

Struts2 拦截器 [Interceptor] 拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部.拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作. 每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面. 如何自定义一个拦截器? 自定义一个拦截器需要三步: 1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类. 2 在strutx.xml中

Struts拦截器登录权限验证(自用)

LoginAction:  自定义拦截器代码:  struts.xml 配置拦截器: 原文地址:https://www.cnblogs.com/MonkeyJava/p/10807392.html

利用Struts拦截器完成文件上传功能

Struts2的图片上传以及页面展示图片 在上次的CRUD基础上加上图片上传功能 (https://www.cnblogs.com/liuwenwu9527/p/11108611.html) 文件上传:三种上传方案1.上传到tomcat服务器2.上传到指定文件目录,添加服务器与真实目录的映射关系,从而解耦上传文件与tomcat的关系文件服务器3.在数据库表中建立二进制字段,将图片存储到数据库(现在基本不用了) 我们使用第二种方法实现图片上传 实现效果如下: 首先是展示页面 clzList.jsp

struts拦截器心得

1 ai.invoke(); 调用action.不调用result 2 ai.invokeActionOnly(); 调用action.调用result 3 当我们需要使用自己的写的拦截器的时候并且调用是ai.invokeActionOnly();,应放在默认拦截器的后面 4 拦截器的调用过程相当于一个,越内越细致,入微

filter 和 struts 拦截器的区别

观点1: 比较一,filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别. 比较二,filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法.而interceptor与servlet容器无关. 比较三,Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,

struts(拦截器)

1. Struts2的拦截器只能拦截Action,拦截器是AOP的一种思路,可以使我们的系统架构更松散(耦合度低),可以插拔,容易互换,代码不改变的情况下很容易满足 客户需求其实体现了OCP 2. 如何实现拦截器?(整个拦截器体现了责任链模式,Filter也体现了责任链模式) * 继承AbstractInterceptor(体现了缺省适配器模式) * 实现Interceptor 范例: public class MyLogInterceptor extends AbstractIntercept