一:拦截器与过滤器类似,但是它们的区别也很大:

01):过滤器理论上可以过滤任意内容,比如HTML,servlet,jsp,图片路径

02):拦截器只可以拦截action。

二:拦截器的原理 

action对象创建之后,在执行action的方法之前会执行拦截器,这里的思想就是aop(面向切面编程):简单来说就是在不修改代码的情况下来扩展功能用的,比如要做一个带权限的登录,在登录成功之前就可以加上权限的判断,但是不需要去修改源代码,而又扩展了功能。还有责任链模式:多个拦截器的执行过程采用的就是责任链模式,当一个拦截器执行完并放行才能执行下一个拦截器,如果第一个拦截器不放行,后面的拦截器都不会执行,且要所有的拦截器都执行完才会去自信心action方法,但是在配置拦截器的时候可以配置某个方法过滤不拦截,这点我下面贴出来的代码中会有,注意看注释就知道那个是了。

三:token令牌 

01):令牌的生成原理

浏览器发出请求到服务器,服务器检查是否有token标签,如果没有,则会在session里面保存token id,如果已经有了token id,则会覆盖,如果服务器有token标签,就将jsp页面的token标签转化成token id再回到浏览器。

02):令牌的拦截原理

向某个action发出请求,根据struts的配置文件判断是否拦截改方法,需要拦截,判断提交的token id和session中的id是否相等,相等,清空session中的token id,不相等则根据配置跳转到指定页面。

四:用令牌做一个防止数据重复提交的实例 

01):jsp页面

<%@ 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:form action="login.action" method="post">
<!-- 注意一定要加上token标签,否则不会生成token id -->
<s:token></s:token>
<s:textfield name="uname"></s:textfield><br>
<s:password name="upwd" ></s:password><br>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>

02):web.xml 里面加上一段

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

03):TokenAction

public String execute() throws Exception {
HttpServletRequest request=ServletActionContext.getRequest();
String name=request.getParameter("uname");
String pwd=request.getParameter("upwd");
System.out.println(name+"---"+pwd);
return SUCCESS;
}

04):struts.xml

    <package name="mypackage" extends="struts-default">
<action name="token*" class="com.action.TokenAction" method="{1}">
<!-- 配置令牌 -->
<interceptor-ref name="token"></interceptor-ref>
<!-- 引入默认的拦截器 action转换到action类中 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/success.jsp</result>
<!-- 挡在session中已经找到相同值进行跳转 -->
<result name="invalid.token">/error.jsp</result>
</action>
</package>

注:在执行方法之前永远都会先执行拦截器,默认的拦截器在action类实例化以后执行

五:自定义拦截器 (登录的实例,判断是否登录)

01):jsp页面,给上name的值以便获取,怎么获取表单的值我上篇博客有写

<%@ 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>登录</title>
</head>
<body>
<form action="adminlogin.action" method="post">
<input name="uname"><br>
<input name="upwd" type="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>

02):action类,这里我就没过数据库了,直接自己判断了下

public class InterceptorAction extends ActionSupport {

    public String login() {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
if ("admin".equals(name) && "123".equals(pwd)) {
session.setAttribute("name", name);
return SUCCESS;
} else {
return LOGIN;
} } }

03):下面就开始写自定义拦截器了,首先创建类继承MethodFilterInterceptor类,重写MethodFilterInterceptor类里面拦截器的方法

public class MyInterceptor extends MethodFilterInterceptor {

    @Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
String name = (String) request.getSession().getAttribute("name");
// 判断是否有session
if (name != null) {
// 取到继续执行(放行)
actionInvocation.invoke();
return Action.SUCCESS;
} else {
// 没有获取到返回一个界面
return Action.LOGIN;
}
} }

04): struts.xml 配置action和自定义拦截器直接的关系(注册拦截器)

    <package name="mylogin" extends="struts-default">
<!-- 创建拦截器 -->
<interceptors>
<interceptor name="MyInterceptor" class="com.interceptor.MyInterceptor"></interceptor>
</interceptors>
<action name="admin*" class="com.action.InterceptorAction"
method="{1}">
<!-- 引用拦截器 -->
<interceptor-ref name="MyInterceptor">
<!-- 排除方法 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<result name="success">/success.jsp</result>
<result name="login">/interceptorlogin.jsp</result>
</action>
</package>

注:这里必须要先过滤登录的方法,不然获取不要session拦截器无法判断,这样的话永远都是跳到登录页面

【基于初学者的SSH】struts2 的拦截器、令牌的简单应用及理解的更多相关文章

  1. (转)Struts2的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/68648101 Struts2的拦截器 拦截器的概述 拦截器,在AOP(Aspect-Orien ...

  2. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  3. Struts2【拦截器】就是这么简单

    什么是拦截器 拦截器Interceptor.....拦截器是Struts的概念,它与过滤器是类似的...可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Str ...

  4. Struts2的拦截器是如何使用AOP工作的

    拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...

  5. 谈谈 Struts2 的拦截器

    套话 相信非常多人都用过 Struts2 了,当然,对 Struts2 的原理也都比較了解.之前在一个项目中就已经用到了,当初的理解也不过局限在应用的层面上,对于更深层次的原理.机制,了解的并非非常多 ...

  6. JavaWeb_(Struts2框架)拦截器interceptor

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  7. 【经典转载】关于Struts2的拦截器

    拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...

  8. (六)Struts2的拦截器

    一.简介 拦截器体系是struts2重要的组成部分.正是大量的内建拦截器完成了该框架的大部分操作. 比如params拦截器将请求参数解析出来,设置Action的属性.servletConfig拦截器负 ...

  9. 基于注解风格的Spring-MVC的拦截器

    基于注解风格的Spring-MVC的拦截器 Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是Defa ...

  10. struts2总结六: Struts2的拦截器

    一.Struts2的系统结构图

随机推荐

  1. pageadmin CMS网站建设教程: 附属表数据列表调用语法

    列表调用语法 Html.SubDataList(参数1,参数2,参数3,参数4)参数说明: 注:第一个参数对象中必须定义Table或ParentTable/ParentField属性.参数1常用属性: ...

  2. 对于equals和==的理解

    很多时候equals和==大家都分不太清楚怎么样来使用,今天小编就来教大家怎么使用 equals比较的是两个变量的值是否相等 而==则比较的是这个变量的内存地址是否相同 打个比方来说 String a ...

  3. Android 为库(library)创建不同编译环境

    项目中需要导入库,一般有两种情况,一种是直接路径导入,一种是导入库的 aar 文件. 1. 设置库项目 1. 在库项目的 src 目录下设置 debug 目录,里面可以添加代码或者 res 文件夹. ...

  4. git code 初次上传

    http://blog.csdn.net/hanhailong726188/article/details/46738929 1 cd到当前项目的跟目录 执行 git init 2 将当前项目的所有文 ...

  5. TOMCAT开启APR模式

    Tomcat支持三种接收请求的处理方式:BIO.NIO.ARP. BIO模式:阻塞式I/O操作,表示Tomcat使用传统Java I/O操作.默认情况下,Tomcat7以下版本使用BIO模式运行,由于 ...

  6. spring3.2+mybatis3.2+maven整合

    用maven管理spring+mybatis的项目: 这里主要讲述的是maven中的pom.xml文件的配置,以及在maven构建过程中会碰到的几个问题(我用的是maven4.4的版本): 首先一步一 ...

  7. js面试题-数组去重

    今天,在聊天群里看到数组去重的话题,面试者的答案如下: 参考答案如下: 程序员思维,做出如下测试: 未考虑到:1,‘1’是不同的,应该不去重 未考虑到对象 所以,参考答案只能去重基础类型 根据以往看过 ...

  8. 剑指offer四十六之孩子们的游戏(圆圈中最后剩下的数,约瑟夫环问题)

    一.题目 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...

  9. 解决ajax跨域问题的一种方法

    解决ajax跨域问题的一种方法 前后端分离经常用json来传输数据,比较常见的问题就有ajax跨域请求的错误问题,这里是我的一种解决方法: 在java中加入如下的注解类: import org.spr ...

  10. Android 开发工具类 13_ SaxService

    网络 xml 解析方式 package com.example.dashu_saxxml; import java.io.IOException; import java.io.InputStream ...