SSH进阶(2)——用Struts拦截器实现登陆限制
拦截器从字面意思来看就是限制。限制用户訪问某些网页。在Action提出请求之前用拦截器来做权限设置,让符合的用户跳入对应的界面中。近期做的一个商城项目中就用到了自己定义的拦截器,实现了一个简单的session推断。成功就登陆,不成功就跳转到门户。
【拦截器工作原理】
Struts2拦截器是在訪问某个Action或Action的某个方法。字段之前或之后实施拦截,而且Struts2拦截器是可插拔的。拦截器是AOP的一种实现。AOP为Aspect Oriented Programming的缩写。意为:面向切面编程。通过预编译方式和执行期动态代理实现程序功能的统一维护的一种技术。
利用AOP能够对业务逻辑的各个部分进行隔离。从而使得业务逻辑各部分之间的耦合度减少,提高程序的可重用性,同一时候提高了开发的效率。
我的理解是每个action请求都会在拦截器的内部,当发生请求的时候,Struts会找相应的配置文件。实例化相应的拦截器对象,如设置拦截器属性excludeMethods。
非常类似于过滤器的。可是过滤器的范围要大于拦截器。
【创建拦截器】
第一种方法就是直接实现Interceptor接口。这种话,有个弊端。这里面的init() destroy() intercept() 方法都须要实现了。
另外一种方法是继承自AbstractInterceptor抽象类。实现了Interceptor接口,而且对里面的init()和destroy()方法进行空实现,而把intercept()方法设置为抽象方法,让继承它的子类去实现,这种话。子类仅仅要实现这个intercept()方法就能够了。比上面的简单。
第三种方法是继承自MethodFilterInterceptor(我以下就是用这种方法实现的),这个类叫做方法过滤拦截器,MethodFilterInterceptor继承自AbstractInterceptor,而且提供了一种机制,即能够指定对Action中某些方法进行拦截或者是不拦截,所谓拦截不拦截。指的就是拦截器中的intercept()方法是否被运行了,若没有运行,就是没有拦截,若运行了,就是拦截了。
总的来说,相比之前的接口和抽象类,最后一个仅仅须要指定对Action中某些方法进行拦截是最简单的。
是通过includeMethods和excludeMethods这两个參数来设置那个方法须要拦截的,在Struts.xml中进行配置。
【拦截器实现登陆】
1>首先我们要自己定义一个拦截器类:
package cn.itcast.shop.interceptor;
import org.apache.struts2.ServletActionContext;
import cn.itcast.shop.adminuser.vo.AdminUser;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
/**
* interceptor
* @author Zhouzhou
* @date 2016-1-25
* @time 下午09:48:21
*/
/**
* that class want to judge the session is null。it extends the class named : MethodFilterInterceptor,
*/
public class PrivilegeInterceptor extends MethodFilterInterceptor{ /**
* the method doIntercept is the main method of the MethodFilterInterceptor
*/
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
//judge login
//
AdminUser adminUser = (AdminUser) ServletActionContext.getRequest()
.getSession().getAttribute("existAdminUser");
if(adminUser != null){
// is logined ,have the userinfo in the session
return actionInvocation.invoke();
}else{
// is not login
ActionSupport support = (ActionSupport) actionInvocation.getAction();
support.addActionError("You are not logged in!No permission to access!");
return ActionSupport.LOGIN;
}
}
}
2>然后在配置文件里去注冊这个拦截器,并在后台登陆的action中利用excludeMethods这个成员变量来绑定login这种方法被拦截。
struts.xml
<!-- Configure: registered place interceptor -->
<interceptors>
<interceptor name="privilegeInterceptor" class="cn.itcast.shop.interceptor.PrivilegeInterceptor"/>
</interceptors>
<!-- 后台登录Action -->
<action name="adminUser_*" class="adminUserAction" method="{1}">
<result name="loginFail">/admin/index.jsp</result>
<result name="loginSuccess" type="redirect">/admin/home.jsp</result>
<interceptor-ref name="privilegeInterceptor">
<param name="excludeMethods">login</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</action>
3>然后是在login 这种方法被调用的时候,就去验证session是不是空的,来推断是否有这个username和password的匹配,然后放入了session中。
/**
* login method--azz
*/
public String login() {
User existUser = userService.login(user);
// use the username and pwd check the user is exist
if (existUser == null) {
//login fail
this.addActionError("error。your user or pwd is error, please login again...");
return LOGIN;
} else {
// login success
// set the user information into the session
ServletActionContext.getRequest().getSession()
.setAttribute("existUser", existUser);
// goto the struts.xml ↓
//<result name="loginSuccess" type="redirect">/admin/home.jsp</result>
return "loginSuccess";
} }
这样一来就轻松实现了用户登陆时候,session是否为空的推断了。
【总结】
1.拦截器定义了一种机制,能够让开发定义一些代码在action运行之前&后运行。
2.提高了代码的复用。想想我们开发asp.net的时候总是写上if(session["username"]==null)之类的话在if(!Page。
ispostback)里面。
每一个页面都有去推断session。
在我们有了这个拦截器之后呢,我们仅仅须要在每一个action配置里面写上:
<interceptor-ref name="拦截器名称"/>
<interceptor-ref name="defaultStack"/>
这样就攻克了全部页面的权限验证问题了。
3.当中includeMethods和excludeMethods是来决定这个action里面的方法是否须要被拦截。
SSH进阶(2)——用Struts拦截器实现登陆限制的更多相关文章
- [置顶] 使用struts拦截器+注解实现网络安全要求中的日志审计功能
J2EE项目中出于安全的角度考虑,用户行为审计日志功能必不可少,通过本demo可以实现如下功能: 1.项目中记录审计日志的方法. 2.struts拦截器的基本配置和使用方法. 3.struts拦截器中 ...
- 利用Struts拦截器限制上传图片的格式和大小
在这之前 Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小.那么既然是使用Struts已经写好的拦 ...
- Struts拦截器设置完的值为什么在页面取不到
Struts拦截器设置完的值为什么在页面取不到. ActionContext ac = (ActionContext) invocation.getInvocationContext(); ac.pu ...
- struts 拦截器 Interceptor
拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用.正如上面 Struts2的Reference中讲述的,Stru ...
- struts拦截器实现原理
图1: 上1来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请 ...
- struts拦截器
struts中的拦截器相当于过滤器的作用 一在struts.xml中配置拦截器或拦截器栈 <interceptors>!--全部的拦截器 <interceptor name=&quo ...
- (转)Struts 拦截器
一.拦截器是怎么实现: 实际上它是用Java中的动态代理来实现的 二.拦截器在Struts2中的应用 对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作.像params拦截器将http请 ...
- struts——拦截器
什么是拦截器 拦截器(Interceptor)是Struts 2的一个强有力的工具,有许多功能都是构建于它之上,如国际化(前两篇博客介绍过).转换器,校验等. 拦截器是动态拦截Action调用的对象. ...
- Struts拦截器使用
创建拦截器java程序 package cn.itcast.oa.util; import com.opensymphony.xwork2.ActionInvocation; import com.o ...
随机推荐
- Swift学习笔记(9)--闭包
1.闭包表达式: { (parameters) -> returnType in statements } 注1.闭包表达式语法可以使用常量.变量和inout类型作为参数,不提供默认值. 也可以 ...
- HttpComponents入门解析
1 简介 超文本传输协议(http)是目前互联网上极其普遍的传输协议,它为构建功能丰富,绚丽多彩的网页提供了强大的支持.构建一个网站,通常无需直接操作http协议,目前流行的WEB框架已经透明的将这些 ...
- js---03属性操作
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- Docs-->.NET-->API reference-->System.Web.UI-->Control-->Methods-->FindControl
https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.control.findcontrol?view=netframework-4.7 ...
- java接口理解(转载)
今天和同事好好的讨论了java接口的原理和作用,发现原来自己的对接口的理解仅仅是局限在概念的高度抽象上,觉得好像理解了但是不会变化应用其实和没有理解差不多.以前看一个帖子说学习一个东西不管什么时候都要 ...
- java(数组及常用简单算法 )
数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[] 变量名 = new 数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...
- 【Henu ACM Round #12 A】 Grandma Laura and Apples
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 知道题意之后就是一个模拟的过程了. 用int now记录当前苹果的个数.bool flag记录是否有小数(即半个苹果) (这样处理为 ...
- Matlab piecelin
function v = piecelin(x,y,u) %PIECELIN Piecewise linear interpolation. % v = piecelin(x,y,u) finds t ...
- 码农的救赎:使用Github Pages搭建博客
人生若仅仅如初见,都恨太晚 据说有博客的人比没博客人的薪水要高非常多,相传写博客也是一个高手的标配,尽管之前一直有在写(在这里).可是孤既不是高手.薪水还比别人少.之前一直在CSDN上面写博客,那是一 ...
- npm install (让别人下载自己的包)
好几天没更新了,再这里跟大家说声抱歉,今天来点干货. 发布一个包在npm上,可以供世界所有人使用,想一下,以前我们做项目,都是在npm install 别人的包,什么时候才能install我们自己的包 ...