【SSH三大框架】Struts2基础第六篇:自定义拦截器功能

在做web项目的时候肯定需要做登陆验证等权限的管理,如果不经过登陆就要使用相应的权限是不可以的。所以需要用到拦截器,拦截器的功能在struts2中已经集成,当然也可以在Spring中使用,这就会在后来写Spring博客的时候再写了。

接下来,我们做一个登陆验证,未登陆不能够访问一些方法:

首先,我们创建一个web项目,并且配置一些Struts2的jar包和web.xml文件,这两个就不多说了。

我们首先写一个登陆获得session的界面:index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%
	request.getSession().setAttribute("user", "itcast");
%>
用户已经登陆

在这个界面,我们假设用户已经登陆,并且设置了一个session

我们还要写一个退出登陆的界面:remove.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%
	request.getSession().removeAttribute("user");
%>
用户已经退出

在这个界面,我们注销了session(也不能说是注销,因为我们只是把user这个属性移除了)

然后,我们需要配置下struts.xml文件了,这里是最重要的一步:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<!-- 指定Struts 2配置文件的根元素 -->
<struts>

	<package name="employee" namespace="/control/employee" extends="struts-default">
		<interceptors>
			<interceptor name="permission" class="cn.interceptor.PermissionInterceptor"></interceptor>
			<interceptor-stack name="permissionStack">
				<interceptor-ref name="defaultStack" />
				<interceptor-ref name="permission" />
			</interceptor-stack>
		</interceptors>

		<global-results>
			<result name="message">/WEB-INF/message.jsp</result>
		</global-results>
		<action name="list_*" class="cn.com.HelloWorldAction" method="{1}">
			<interceptor-ref name="permissionStack" />
		</action>
	</package>
</struts>

1、<interceptors></interceptors>标签,这是定义interceptors的

2、<interceptor name="permission" class="cn.interceptor.PermissionInterceptor"></interceptor>这里定义了一个interceptor,name是permission,拦截器类是PermissionInterceptor,这个类是我们自己定义的

3、<interceptor-stack name="psermissionStack"></interceptor-stack>这是定义了一个拦截器栈。如果我们为某个action设置了单个的自定义的interceptor,将会导致Struts2的一些核心拦截器失效,所以我们需要定义一个拦截器栈,把<interceptor-ref name="defaultStack">这个Struts2的默认拦截器栈添加进去,并且放在栈顶,然后再添加进去我们自定义的拦截器:<interceptor-ref name="permission
/>。这样子我们就可以在<action>中添加进去一个拦截器栈,而不是单一的一个拦截器。

4、<global-results>这是定义了一个全局的result视图

5、<action></action>可以看到我们在这个action插入了一个标签<interceptor-ref name="permissionStack" />这就是把我们上边定义的拦截器栈加入了进去。

在我们的struts.xml配置完成之后,我们需要写一个拦截器类了:PermissionInterceptor.java,该类扩展了com.opensymphony.xwork2.interceptor.Interceptor接口

package cn.interceptor;

import java.util.Map;

import javax.interceptor.InvocationContext;

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

public class PermissionInterceptor implements Interceptor {

	@Override
	public void destroy() {

	}

	@Override
	public void init() {

	}

	@Override
	public String intercept(ActionInvocation actionInvocation) throws Exception {
		Object user = ActionContext.getContext().getSession().get("user");
		if(user!=null){
			return actionInvocation.invoke();
		}
		ActionContext.getContext().put("message", "你没有权限执行该操作");
		return "message";
	}

}

在这个接口中,有三个方法,分别是销毁、初始化、还有具体的intercept的操作:

在intercept()方法中:我们首先通过ActionContext对象获得了user对象,如果user对象不为空(登陆),则我们return actionInvocation.invoke(),拦截器栈中后续的拦截器继续执行,等到拦截器执行完之后,action中调用的方法就开始执行了。如果对象为空,我们设置message,并且返回message视图。

接下来,我们要给action定义相应的逻辑处理类:

package cn.com;

public class HelloWorldAction {
	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	public String addUI(){
		this.message="addUI";
		return "message";
	}
	public String execute() throws Exception{
		this.message="execute";
		return "message";
	}
}

在上边调用拦截器之后,如果我们return actionInvocation.invoke(),则我们会执行这个逻辑类中相应的方法,如果我们调用了execute()方法,我们会执行这个方法中的逻辑处理,然后,返回message视图。

然后,我们来写一下message对应的视图:message.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
	String user = (String)request.getSession().getAttribute("user");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'message.jsp' starting page</title>

  </head>

  <body>
    ${message }
    <%=user %>
  </body>
</html>

这是我们项目的工程目录:

如果我们首先输入:http://localhost:8080/test/control/employee/list_execute.action,这是要访问execute()方法,在页面中会打印出:你没有权限执行该操作 null

如果我们输入:http://localhost:8080/test/index.jsp,页面上会打印出:用户已经登陆

然后,我们再输入:http://localhost:8080/test/control/employee/list_execute.action,页面上会打印出:execute itcast

可以看出来,我们的拦截器起作用了:在不登陆的情况下,我们不能够访问相应的方法

时间: 2024-10-06 11:40:56

【SSH三大框架】Struts2基础第六篇:自定义拦截器功能的相关文章

【SSH三大框架】Hibernate基础第十二篇:load()懒加载分析以及一对一、一对多、多对一、多对多懒加载的分析

一.懒加载的定义: 懒加载:在WEB应用程序中,经常会需要查询数据库,系统的响应速度在很大程度上是与数据库交互的响应.因此,如果能够优化与数据库的交互速度,则能够大大提高WEB应用的响应速度. 例如:当有一个Student类和一个Teacher类.当我们加载一个学生的所有信息,包括:学号,姓名等属性后,此时Student类中的Teacher类型的属性为null,当我们需要知道这个Student对应的Teacher属性的时候,我们才去加载这个Teacher对象. 如果,我们只需要知道学生信息,我们

SSH三大框架的整合

SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate核心配置文件 如果单纯使用Hibernate框架,核心配置文件名称hibernate.cfg.xml并且一定要放在src下面,而hibernate和spring整合的时候,hibernate核心配置文件名称和位置没有固定要求的(因为到时候会有一个参数指定其位置). 2. Hibernate映射配置文

eclipse中SSH三大框架环境搭建&lt;三&gt;

相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的搭建以及简单使用,但是在访问数据库层面使用的是传统的JDBC.在我们项目开发中使用JDBC确实是不太理想的,所以今天我给大家来讲解一下目前行业中比较流行的持久层框架——hibernate. 第1步:我们依旧需要引入hibernate的jar包 找到hibernate解压好的文件目录,在该目录下的lib目录下有

MVC模式下基于SSH三大框架的java web项目excel表格的导出(不依赖另外的jar包)

最近工作中碰到了需要将web页面的表格内容导出到excel表格并下载到本地的需求.以下是在利用网上资源.与同事探讨下,完成的代码. 首先我们需要有定义好的实体类.以下是截取了项目中用到的部分代码. 1 public class QyggDocuments implements java.io.Serializable { 2 3 private static final long serialVersionUID = -2543382529255041149L; 4 5 private Stri

SSH三大框架注解整合(一)

1.导入jar包,ssh的jar包一共是38个,此时还需要多加一个包,就是struts的注解插件jar. 2.在web.xml文件中配置struts filter 和spring 的listener.代码如下: <!-- spring 监听器 -->  <context-param>   <param-name>contextConfigLocation</param-name>   <param-value>classpath:applicat

java ssh三大框架搭建整合

今天开个坑java ssh三大框架搭建整合(注解+XML 用全注解不是很好,有点地方需要用模板的时候XML直接可以复制一段) 1 所用框架.技术 编号 工具 版本 说明 Struts 2 2.3.20 Hibernate 4.3.9 实现持久化操作 Spring 4.1.5 Junit 4 单元测试 2.  开发环境 操作系统 Windows 7 开发工具 Eclipse Java EE 数据库 Oracle 11g Web容器 Tomcat 7.0.63 JAVA JDK 1.7 建立proj

SSH三大框架整合使用的配置文件 注解实现

1 Struts.xml 使用拦截器 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"    "http://struts.apache.org/dtds/struts-2.1.7.dtd"&g

SSH三大框架注解整合(二)

5.使用spring注解注入service,DAO action: @ParentPackage(value = "struts-default") @Namespace("/") @Controller @Scope("prototype") public class BookAction extends ActionSupport implements ModelDriven<Book>{ //模型驱动 public Book b

NHibernate 组件基础 (第六篇)

NHibernate 组件基础 (第六篇) 一.组件简介 组件(Component)可以理解为被一个对象所包含的对象而持久化,而并非一个实体.简单说来,假如数据库有FirstName,LastName这两个字段,我们在C#中可以将这两个字段提取出来作为一个Name对象使用. 示例,首先建一张表,并添加数据如下: Person.hbm.xml <?xml version="1.0" encoding="utf-8" ?> <hibernate-map