原文地址:http://blog.csdn.net/zhutulang/article/details/38351629 尊重原创,请访问原地址

一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项。我还记得很久以前我的做法:在某个jsp页面中查看session中是否有值(当然,在用户登录逻辑中会将用户名或者用户对象存入session中),如果session中用户信息为空,那么redirect 到登录页面。然后在除了登录页面外的其它所有需要验证用户已登录的页面引入这个jsp 。

比如,我们将检查用户是否登录的代码放入一个jsp页面中,如 checkUser.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. Object username = session.getAttribute("username");
  4. if(null == username){
  5. response.sendRedirect("login.jsp");
  6. }
  7. %>

登录页面为 login.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4. <head>
  5. <title>登录页面</title>
  6. </head>
  7. <body>
  8. <h1>用户登录</h1>
  9. 用户名:<input type="text" name="username" /><br />
  10. 密码:<input type="text" name="pwd" />
  11. </body>
  12. </html>

假设登录成功后跳转到菜单页面 menu.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4. <head>
  5. <%@ include file="checkUser.jsp" %>
  6. <title>菜单页</title>
  7. </head>
  8. <body>
  9. <h1>菜单1</h1> <br />
  10. <h1>菜单2</h1> <br />
  11. <h1>菜单3</h1> <br />
  12. <h1>菜单4</h1> <br />
  13. </body>
  14. </html>

在其中引入了 checkUser.jsp ,这样当用户没有经过登录而试图访问menu.jsp 页面时就会被强制转到 login.jsp 页面。

以上这种方法当然是可行的,可是太过丑陋和麻烦。后来,我学到可以把除了登录页面外的 jsp 或html 页面放到 WEB-INF 目录下, 这样用户就无法直接在浏览器中敲url 来访问页面了。可是,如果有人通过某种方式得知我们的action 名和方法名了呢?难道我们要在action的每个方法中,检查用户是否登录吗?这样子做光是想一想就觉得很蠢。好在我们有struts2 拦截器。

先来看看怎样实现。

我们写一个拦截器类,让它继承 MethodFilterInterceptor。

  1. /**
  2. * @Title: LoginInterceptoe.java
  3. * @Description: 拦截非登录用户请求
  4. * @author ThinkPad
  5. * @version 1.0
  6. * @date 2014年8月2日
  7. */
  8. package com.exam.interceptor;
  9. import com.exam.utils.Constants;
  10. import com.opensymphony.xwork2.ActionContext;
  11. import com.opensymphony.xwork2.ActionInvocation;
  12. import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
  13. /**
  14. * @author ThinkPad
  15. *
  16. */
  17. public class LoginInterceptor extends MethodFilterInterceptor{
  18. /**
  19. *
  20. */
  21. private static final long serialVersionUID = -4409507846064552966L;
  22. /* (non-Javadoc)
  23. * @see com.opensymphony.xwork2.interceptor.MethodFilterInterceptor#doIntercept(com.opensymphony.xwork2.ActionInvocation)
  24. */
  25. @Override
  26. protected String doIntercept(ActionInvocation invoker) throws Exception {
  27. // TODO Auto-generated method stub
  28. Object loginUserName = ActionContext.getContext().getSession().get(Constants.USERNAME);
  29. if(null == loginUserName){
  30. return Constants.VIEW_LOGIN;  // 这里返回用户登录页面视图
  31. }
  32. return invoker.invoke();
  33. }
  34. }

在struts.xml 文件中 填入:

  1. <interceptors>
  2. <interceptor name="loginInteceptor" class="com.exam.interceptor.LoginInterceptor" />
  3. <interceptor-stack name="loginStack">
  4. <interceptor-ref name="loginInteceptor">
  5. <param name="excludeMethods">goLogin,login</param>
  6. </interceptor-ref>
  7. <interceptor-ref name="defaultStack"></interceptor-ref>
  8. </interceptor-stack>
  9. </interceptors>
  10. <default-interceptor-ref name="loginStack" />

其中,<param name="excludeMethods">goLogin,login</param>  配置的过滤方法,意思是拦截器对其中的方法不起作用。在我这里, goLogin 是跳转到登录页面的方法。login 是验证用户名和密码的方法,在其中会将通过验证的用户名放入session中。没错,这就是我们需要做的全部事情了,是不是很方便呢?

关于 struts2 拦截器的详细介绍,可以参考这篇文章:http://wenku.baidu.com/link?url=GPQkMm2UkyFeRPMWH7RMTqJD1xVV2DWU90b5FwuNzDQjuAnx300jMePNb1IVgxMkM3dek3Irixm-kuTOmClbSQ8vdyEjRPwmAdXqZOlG_GK

我在这里稍微总结下:

1、在struts2 中,所有的拦截器都会继承 Interceptor 这个接口。

2、拦截器写好之后要在 struts.xml 文件中配置,如果该拦截器是用来拦截某个action的,那么,就在该action 的result 后面放入该拦截器。如(注:来自以上参考文章):

  1. <struts>
  2. <package name="struts2" extends="struts-default">
  3. <interceptors>
  4. <interceptor name="myinterceptor" class="com.interceptor.MyInterceptor">
  5. <param name="hello">world</param>
  6. </interceptor>
  7. </interceptors>
  8. <action name="register" class="com.test.action.RegisterAction" >
  9. <result name="input">/register.jsp</result>
  10. <result name="success">/success.jsp</result>
  11. <interceptor-ref name="myinterceptor"></interceptor-ref>
  12. </action>
  13. </package>
  14. <struts>

3、如果我们没有添加拦截器,struts2 会为我们添加默认拦截器。而如果我们指定了拦截器,我们自己的拦截器就会取代默认的拦截器,那么我们就不能享受默认拦截器提供的一些功能。所以,一般我会把默认拦截器也加上。例如,在以上配置项中,action 里面再加上<interceptor-ref name="defaultStack"></interceptor-ref>

4、Interceptor 接口有三个方法:init  、 destroy、intercept 。但一般我们不关心 init 和 destroy 方法。所以struts2 为我们提供了一个简化的拦截器类:AbstractInterceptor ,它实现了init 和 destroy 方法,我们只需实现 intercept 方法。

5、关于拦截器栈。可以把拦截器栈看成是一个“大”拦截器,里面由若干个拦截器组成。把它当成一个拦截器一样的引用。

6、方法过滤拦截器,需要继承 MethodFilterInterceptor 类(也就是我们这里示例使用的拦截器类的做法)。你可以指定该拦截器拦截哪些方法(使用<param name="includeMethods">method1,method2</param> 
),也可以指定该拦截器不去拦截哪些方法(<param name="excludeMethods">method1,method2</param>)

防止未登录用户操作—struts2拦截器简单实现(转)的更多相关文章

  1. struts2拦截器-简单实现非法登录验证

    概念:什么是拦截器 拦截器实现了面向切面的组件,它会影响多个业务对象的公共行为封装到一个个可重用的模块,减少了系统的重复代码,实现高度内聚,确保业务对象的整洁!   为什么使用拦截器 拦截器消除了动作 ...

  2. struts2拦截器の简单实现(日语系统,请忽略乱码,重在实现)

    1.创建类实现interceptor接口或者继承abstractinter~~~类 package com.mi.intercepter; import java.util.Date; import ...

  3. struts 用拦截器进行用户权限隔离,未登录用户跳到登录界面 *** 最爱那水货

    一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.对于个别页面来说,可能不需要进行拦截,此时,如果项目采用struts view ...

  4. 基于SSH2框架Struts2拦截器的登录验证实现(转)

        大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证.     修改数 ...

  5. Struts2拦截器登录验证

    Struts2拦截器 Struts2拦截器的概念和Spring Mvc拦截器一样. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截 ...

  6. Spring Filter过滤器,Spring拦截未登录用户权限限制

    转载自:http://pouyang.iteye.com/blog/695429 实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面.  比较好的做法是不管什 ...

  7. Struts2拦截器 解决登录问题

    一.了解Struts2 拦截器[Interceptor] 拦截器的工作原理如图  拦截器是由每一个action请求(request)都包装在一系列的拦截器的内部,通过redirectAction再一次 ...

  8. Struts2拦截器详解

    一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列 ...

  9. struts2拦截器与过滤器

    转载:http://www.cnblogs.com/JohnLiang/archive/2011/12/15/2288376.html 过滤器,是在java web中,你传入的request,resp ...

随机推荐

  1. 怎样查看Eclipse是32位还是64位?

    怎样查看Eclipse是32位还是64位? 1.去Eclipse的安装文件夹,找到eclipse.ini 2.打开这个文件.寻找:launcher.library,我的机器上,在第二行 3.查看&qu ...

  2. Java集合系列之TreeMap源代码分析

    一.概述 TreeMap是基于红黑树实现的.因为TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射依据其键的自然顺序进行排序或者依据创建映射时提供的C ...

  3. 精准 iOS 内存泄露检测工具

    MLeaksFinder:精准 iOS 内存泄露检测工具 发表于 2016-02-22   |   zepo   |   23 Comments 背景 平常我们都会用 Instrument 的 Lea ...

  4. 基于树莓派3B+Python3.5的OpenCV3.4的配置教程

    https://www.cnblogs.com/Pyrokine/p/8921285.html

  5. 从零开始学android -- 简易的socket通信

    先来介绍下socket,网上摘抄点资料,免得自己打字了 网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 1.消息传递(管道.FIFO.消息队列) 2.同步(互 ...

  6. python入门课程 第二章 安装Python

    2-1 选择python版本首先python2.7和python3是不可以通用的目前丰富的类库都支持python2.7,所以选用Python2.7    选择python2.7版本2-2 window ...

  7. python查询IP地址所属地

    1.linux命令行版 #!/usr/bin/python #-*- coding: utf-8 -*- import json import urllib import sys def get_da ...

  8. 【题解】P2161[SHOI2009]会场预约(set)

    [题解][P2161 SHOI2009]会场预约 题目很像[[题解]APIO2009]会议中心 \(set\)大法好啊! 然后我们有个小\(trick\)(炒鸡帅),就是如何优雅地判断线段交? str ...

  9. 为什么Git 比 SVN 好

    原文链接:http://www.worldhello.net/2012/04/12/why-git-is-better-than-svn.html Why Git is better than SVN ...

  10. PAT 1064. 朋友数(20)

    如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”.例如123和51就是朋友数,因为1+2+3 = 5+1 = 6,而6就是它们的朋友证号.给定一些整数,要求 ...