【SSH三框架】Struts2第六章的基础:他们拦截函数的定义

时间:2022-12-22 12:19:33

干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>

这是我们项目的project文件夹:

【SSH三框架】Struts2第六章的基础:他们拦截函数的定义

假设我们首先输入: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

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

版权声明:本文博主原创文章。博客,未经同意不得转载。

【SSH三框架】Struts2第六章的基础:他们拦截函数的定义的更多相关文章

  1. 【windows核心编程】 第六章 线程基础

    Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ①    一个是线程的内核 ...

  2. 【SSH三框架】Struts2第一章的基础:第一次写Struts2规划

    今年八月,当已经SSH三架完成学业.然后,他感动Android开展.三个框架已经很长的时间做无用的东西.所以,如果你想花三四天的时间来复习一下,写在博客. 附带SSH整个jar包网盘下载:http:/ ...

  3. 旧书重温:0day2【9】第六章 攻击c&plus;&plus;的虚函数

    不知不觉,我们学到了0day2的第六章形形色色的内存攻击技术!其中,这张很多东西都是理论的东西,不过!我们还是要想办法还原下发生的现场! 其中部分文章截图 http://user.qzone.qq.c ...

  4. Windows核心编程 第六章 线程基础知识 (上)

    第6章 线程的基础知识 理解线程是非常关键的,因为每个进程至少需要一个线程.本章将更加详细地介绍线程的知识.尤其是要讲述进程与线程之间存在多大的差别,它们各自具有什么作用.还要介绍系统如何使用线程内核 ...

  5. Windows核心编程 第六章 线程基础知识 (下)

    6.6 线程的一些性质 到现在为止,讲述了如何实现线程函数和如何让系统创建线程以便执行该函数.本节将要介绍系统如何使这些操作获得成功. 图6 - 1显示了系统在创建线程和对线程进行初始化时必须做些什么 ...

  6. 【WPF学习】第三十六章 样式基础

    前面三章介绍了WPF资源系统,使用资源可在一个地方定义对象而在整个标记中重用他们.尽管可使用资源存储各种对象,但使用资源最常见的原因之一是通过他们的保存样式. 样式是可应用于元素的属性值集合.WPF样 ...

  7. 用最简单话概括SSH三框架

    Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句. Struts是用来做应用层的,他它负责调用业务逻辑serivce层,所以S ...

  8. Artech的MVC4框架学习——第六章Model的验证

    第一Model验证旨在为通过Model绑定生成参数进行检验以确保用户输入数据的有效性(p318) 第二Model验证分两种:服务器端(三种解决方案 p256)和客户端(ajax\jQuery) 第三服 ...

  9. 【SSH三框架】Hibernate基金会七:许多附属业务

    相对于上述一关系,在这里,下一个一对多关系说明. 另外,在上述.我们描述了许多人描述的一一对应关系.在关系数据库是多对一的关系.但也有许多关系. 但,只知道它是不够的,Hibernate它是一种面向对 ...

随机推荐

  1. js将html5日期格式转为long型

    var moveInArray = $("#move_in").val().split('-'); var d = new Date(); d.setYear(moveInArra ...

  2. java基础练习 3

    import java.util.Scanner; public class Third { /*计算字符串中子串出现的次数 (5 分数)*/ public static void main(Stri ...

  3. JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 一.缘由 在很多的面向对象编程语言中,我们可以使用命名空间(namespace)来组织代码,避免全局变量污染.命名冲突.遗憾的是,JavaScript中并不提供对命名空间的原生支 ...

  4. 用sklearn封装的kmeans库

    由于需要海量的进行聚类,所以将 k-means 算法自我封装成一个方便利用的库,可以直接调用得到最优的 k值 和 中心点: #!/usr/bin/python3.4 # -*- coding: utf ...

  5. Android24以上拍照代码

    public void takePic(){ //创建File对象,用于存储拍照后的照片 File outputImage = new File(getExternalCacheDir(),&quot ...

  6. vmware中扩充磁盘

    刚开始装虚拟机中的系统时,只分了20G的空间大小,随着不断的使用,结果在安装一个软件的时候提示我磁盘空间不足 用"df -h "查看"/"目录使用率已达到90% ...

  7. 20155224 聂小益 《基于Arm实验箱的接口测试和应用》 课程设计报告

    一.设计方案及可行性分析 熟悉 Linux 开发环境 多线程应用程序设计 串行端口程序设计 中断实验 二.详细设计思路 1. 熟悉 Linux 开发环境 建立工作目录: 在终端输入代码建立工作目录 [ ...

  8. &lbrack;hihoCoder&rsqb; 第五十二周&colon; 连通性&&num;183&semi;一

    题目1 : 连通性·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢失.为了避免再 ...

  9. FFMPEG结构体分析:AVCodecContext(转)

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  10. Codeforces Beta Round &num;75 &lpar;Div&period; 1 Only&rpar; B&period; Queue 二分

    B. Queue Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 codeforces.com/problemset/problem/91/B Descrip ...