Struts2重新学习之自定义拦截器(判断用户是否是登录状态)
拦截器
一:1:概念:Interceptor拦截器类似于我们学习过的过滤器,是可以再action执行前后执行的代码。是web开发时,常用的技术。比如,权限控制,日志记录。
2:多个拦截器Interceptor连在一起组成了Interceptor栈。拦截器是AOP面向切面编程的一种实现,具有热插拔的效应。
3:Struts2拦截器,每个拦截器类只有一个对象实例,即采用了单利模式。所有引用这个拦截器的action都共享着一拦截器类的实例。
拦截器和过滤器的区别
1:拦截器和过滤器的概念非常类似
2:过滤器隶属于web容器,可以过滤一切请求(包括action,servlet,jsp,html)
3:拦截器隶属于Struts2框架,只能拦截action(无法拦截对jsp的直接请求)
4:过滤器内部采用函数回调来实现,拦截器采用动态代理+递归调用来实现
自定义一个拦截器。判断用户是否处于登录状态,如果处于登录状态则不拦截任何操作。如果非登录状态,或登录状态静止时间过长,导致session死亡,则拦截任何操作(除正在登录的操作)。跳转至登录页面,让其登录。
一:自定义登录状态判断拦截器
package com.bjsxt.shangxiaofei.interceptor; import java.util.Map; import com.bjsxt.shangxiaofei.po.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; public class LoginInterCeptor implements Interceptor{ @Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("LoginInterCeptor.destroy(销毁)");
} @Override
public void init() {
// TODO Auto-generated method stub
System.out.println("LoginInterCeptor.init(初始化)");
} @Override
public String intercept(ActionInvocation arg0) throws Exception {
//获取session作用域
Map<String,Object> sessionMap=ActionContext.getContext().getSession();
//从session作用域中拿出登录的用户信息
User user=(User) sessionMap.get("user"); //获取http请求地址中的请求方法名字
String methodName=arg0.getProxy().getMethod();
//获取http请求地址中action的名字
String actionName=arg0.getProxy().getActionName(); //判断user是否为空,如果不为空,说明登录,如果为空说明,没有登录,进行拦截。
if(user!=null){
//登录,不拦截
System.out.println("请求时执行");
arg0.invoke();
System.out.println("响应时执行"); return null;
}else{
//如果为空,但是正在做登录请求,则也不拦截
if(methodName.equals("loginCheck")){
System.out.println("请求时执行");
arg0.invoke();
System.out.println("响应时执行");
return null;
} sessionMap.put("backMsg", "很抱歉,请先登录,再做操作");
return "login";//返回到登录页面
}
} }
二:在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>
<!-- 如果请求地址=actionName!methodName ,则该配置需要进行设置,否则访问地址错误-->
<constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 开发模式 -->
<constant name="struts.devMode" value="true" /> <!-- 编码格式过滤 -->
<constant name="struts.i18n.encoding" value="utf-8"></constant> <package name="default" namespace="/" extends="struts-default"> <!-- 拦截器的配置 包括拦截器+拦截器栈 -->
<interceptors>
<interceptor name="LoginInterCeptor" class="com.bjsxt.shangxiaofei.interceptor.LoginInterCeptor"></interceptor>
<interceptor name="SecondInterCeptor" class="com.bjsxt.shangxiaofei.interceptor.SecondInterCeptor"></interceptor>
<!-- 如果想让自定义的拦截器起作用,就必须从新配置拦截器栈,并加上原先默认的拦截器栈 -->
<interceptor-stack name="MyInterCeptorStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="LoginInterCeptor"></interceptor-ref>
<interceptor-ref name="SecondInterCeptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 将自定义的拦截器栈应用到项目上,项目上所有的请求都会经过该拦截器栈 -->
<default-interceptor-ref name="MyInterCeptorStack"></default-interceptor-ref> <!-- actionName!methodName请求方式的配置 -->
<action name="userAction" class="com.bjsxt.shangxiaofei.action.UserAction" >
<result name="success">/page/success.jsp</result>
</action> </package>
</struts>
Struts2重新学习之自定义拦截器(判断用户是否是登录状态)的更多相关文章
- Struts学习之自定义拦截器
* 所有的拦截器都需要实现Interceptor接口或者继承Interceptor接口的扩展实现类 * 要重写init().intercept().destroy()方法 * in ...
- struts2学习(6)自定义拦截器-登录验证拦截器
需求:对登录进行验证,用户名cy 密码123456才能登录进去: 登录进去后,将用户存在session中: 其他链接要来访问(除了登录链接),首先验证是否登录,对这个进行拦截: com.cy.mod ...
- struts2基础---->自定义拦截器
这一章,我们开始struts2中拦截器的学习. 自定义拦截器
- [ SSH框架 ] Struts2框架学习之四(自定义拦截器)
一.Struts2的拦截器 1.1 拦截器概述 拦截器,在AOP( Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截 ...
- 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】
一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...
- [原创]java WEB学习笔记74:Struts2 学习之路--自定义拦截器,struts内建的拦截器
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Struts2学习笔记(十)——自定义拦截器
Struts2拦截器是基于AOP思想实现的,而AOP的实现是基于动态代理.Struts2拦截器会在访问某个Action之前或者之后进行拦截,并且Struts2拦截器是可插拔的:Struts2拦截器栈就 ...
- Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】
什么是拦截器 拦截器Interceptor-..拦截器是Struts的概念,它与过滤器是类似的-可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Struts为 ...
- Struts2学习笔记(拦截器配置添加)
一.拦截器工作原理: 根据Struts2的工作原理图,拦截器在action执行前进行顺序调用,之后执行Action并返回结果字符串,再逆序调用拦截器.(结构类似递归方式...)大部分时候,拦截器方法都 ...
随机推荐
- 读写生信流程必备的 Perl 语法
最早就是写Perl的,后来来到公司转Python,现在又要负责流程了,开始重拾Perl,当然是借鉴别人现有的语法,我再重新组合. 基本语法就不介绍了,参照我之前文章 Perl 模块 use str ...
- English trip -- VC(情景课)1 B Countries
Vocabulary focus 核心词汇 Vo ca bu la ry fo cus [və(ʊ)'kæbjʊlərɪ] ['fəʊkəs] Listen and repeat 听并 ...
- Confluence 6 使用 LDAP 授权连接一个内部目录 - 服务器设置
名字(Name) 名字的描述将会帮助你在目录中识别.例如: Internal directory with LDAP Authentication Corporate LDAP for Authent ...
- Educational Codeforces Round 47 (Rated for Div. 2)G. Allowed Letters 网络流
题意:给你一个字符串,和每个位置可能的字符(没有就可以放任意字符)要求一个排列使得每个位置的字符在可能的字符中,求字典序最小的那个 题解:很容易判断有没有解,建6个点表示从a-f,和源点连边,容量为原 ...
- dp练习(3)——棋盘问题
设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马. 规定: 1)马只能走日字 2)马只能向右跳 问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2, ...
- oracle12c新特点之可插拔数据库(Pluggable Database,PDB)
1. 12c PDB新特点的优势 1) 可以把多个PDB集成进一个平台. 2) 可以快速提供一个新的PDB或一个已有PDB的克隆. 3) 通过拔插技术,可以快速把存在的数据库重 ...
- 修改MAC地址的方法(未测试)
用ioctl控制,通过SIOCGIFHWADDR获取MAC地址,SIOCSIFHWADDR设置MAC地址,不过在设 置MAC地址之前,要先把网卡down掉,设置好了以后,再UP起来. #include ...
- 封装一个简单的原生js焦点轮播图插件
轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...
- 快速切题 poj3026
感受到出题人深深的~恶意 这提醒人们以后...数字后面要用gets~不要getchar 此外..不要相信那个100? Borg Maze Time Limit: 1000MS Memory Lim ...
- Vue面试题整理
1:什么是MVVM MVVM是是Model-View-ViewModel的缩写,Model代表数据模型,定义数据操作的业务逻辑,View代表视图层,负责将数据模型渲染到页面上,ViewModel通过双 ...