防止未登录用户操作—基于struts2拦截器的简单实现

 更新时间:2017年10月11日 10:06:04   作者:逐兔郎  
下面小编就为大家带来一篇防止未登录用户操作—基于struts2拦截器的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

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

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

登录页面为 login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <title>登录页面</title>

 </head>
 
 <body>
 <h1>用户登录</h1>
        用户名:<input type="text" name="username" /><br />
        密码:<input type="text" name="pwd" />
 </body>
</html>

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

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

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

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

先来看看怎样实现。

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

/** 
 * @Title: LoginInterceptoe.java
 * @Description: 拦截非登录用户请求
 * @author ThinkPad
 * @version 1.0
 * @date 2014年8月2日
 */
package com.exam.interceptor;

import com.exam.utils.Constants;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/**
 * @author ThinkPad
 *
 */
public class LoginInterceptor extends MethodFilterInterceptor{

	/**
	 * 
	 */
	private static final long serialVersionUID = -4409507846064552966L;


	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.interceptor.MethodFilterInterceptor#doIntercept(com.opensymphony.xwork2.ActionInvocation)
	 */
	@Override
	protected String doIntercept(ActionInvocation invoker) throws Exception {
		// TODO Auto-generated method stub

		Object loginUserName = ActionContext.getContext().getSession().get(Constants.USERNAME);
		if(null == loginUserName){
			return Constants.VIEW_LOGIN; // 这里返回用户登录页面视图
		}
		return invoker.invoke();
	}

}

在struts.xml 文件中 填入:

 <interceptors>
	  <interceptor name="loginInteceptor" class="com.exam.interceptor.LoginInterceptor" />
	  <interceptor-stack name="loginStack">
	    <interceptor-ref name="loginInteceptor">
	     <param name="excludeMethods">goLogin,login</param>
	    </interceptor-ref>
	    <interceptor-ref name="defaultStack"></interceptor-ref>
	  </interceptor-stack>
</interceptors>
	
<default-interceptor-ref name="loginStack" />

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

我在这里稍微总结下:

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

2、拦截器写好之后要在 struts.xml 文件中配置,如果该拦截器是用来拦截某个action的,那么,就在该action 的result 后面放入该拦截器。

<struts>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; <package&nbsp;name="struts2"&nbsp;extends="struts-default">&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <interceptors>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <interceptor&nbsp;name="myinterceptor"&nbsp;class="com.interceptor.MyInterceptor">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <param&nbsp;name="hello">world</param>&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </interceptor>&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </interceptors>&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <action&nbsp;name="register"&nbsp;class="com.test.action.RegisterAction"&nbsp;>&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <result&nbsp;name="input">/register.jsp</result>&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <result&nbsp;name="success">/success.jsp</result>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <interceptor-ref&nbsp;name="myinterceptor"></interceptor-ref>&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </action>&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp; </package>&nbsp;&nbsp; 
&nbsp;<struts>&nbsp;

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拦截器的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot项目中处理返回json的null值(springboot项目为例)

    SpringBoot项目中处理返回json的null值(springboot项目为例)

    本文以spring boot项目为例给大家介绍SpringBoot项目中处理返回json的null值问题,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下
    2019-10-10
  • 关于Java中Comparable 和 Comparator的用法

    关于Java中Comparable 和 Comparator的用法

    这篇文章主要介绍了关于Java中Comparable 和 Comparator的用法,Comparable 和 Comparator 是关于排序的两个接口,用来实现 Java 集合中的的排序功能,需要的朋友可以参考下
    2023-04-04
  • 一文带你掌握Java SPI的原理和实践

    一文带你掌握Java SPI的原理和实践

    在Java中,我们经常会提到面向接口编程,这样减少了模块之间的耦合,更加灵活,Java SPI (Service Provider Interface)就提供了这样的机制,本文就来讲讲它的原理与具体使用吧
    2023-05-05
  • Java正则表达式易错知识点汇总

    Java正则表达式易错知识点汇总

    这篇文章主要总结Java正则表达式易错知识,对易错知识点进行分类整理,帮助大家更好的学习Java正则表达式,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 代理模式之Java动态代理实现方法

    代理模式之Java动态代理实现方法

    今天一个偶然的机会我突然想看看JDK的动态代理,因为以前也知道一点,而且只是简单的想测试一下使用,使用很快里就写好了这么几个接口和类,需要的朋友可以参考下
    2012-11-11
  • redisson实现分布式锁原理

    redisson实现分布式锁原理

    本文将详细介绍redisson实现分布式锁原理。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • JavaMail与Spring整合过程解析

    JavaMail与Spring整合过程解析

    这篇文章主要介绍了JavaMail与Spring整合过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • java 通过cmd 调用命令启动tomcat的操作

    java 通过cmd 调用命令启动tomcat的操作

    这篇文章主要介绍了java 通过cmd 调用命令启动tomcat的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Java局部内部类和匿名内部类定义与用法实例分析

    Java局部内部类和匿名内部类定义与用法实例分析

    这篇文章主要介绍了Java局部内部类和匿名内部类,结合实例形式分析了java局部内部类和匿名内部类相关定义、原理与用法,需要的朋友可以参考下
    2019-08-08
  • 详解mybatis-plus的 mapper.xml 路径配置的坑

    详解mybatis-plus的 mapper.xml 路径配置的坑

    这篇文章主要介绍了详解mybatis-plus的 mapper.xml 路径配置的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论