struts的内置_struts自定义拦截器

struts的内置_struts自定义拦截器一般我们的web应用都是只有在永固

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一般,我们的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中。没错,这就是我们需要做的全部事情了,是不是很方便呢?

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

我在这里稍微总结下:

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

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

<struts>   
    <package name="struts2" extends="struts-default">  
        <interceptors>   
          <interceptor name="myinterceptor" class="com.interceptor.MyInterceptor">   
               <param name="hello">world</param>  
           </interceptor>  
       </interceptors>   
   
       <action name="register" class="com.test.action.RegisterAction" >   
          <result name="input">/register.jsp</result>   
          <result name="success">/success.jsp</result>   
          <interceptor-ref name="myinterceptor"></interceptor-ref>   
       </action>  
     </package>   
 <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>)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189556.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 带通 带阻滤波器 幅频响应_二阶有源带通滤波器设计

    带通 带阻滤波器 幅频响应_二阶有源带通滤波器设计二阶有源带通滤波器设计1、背景对于微弱的信号的处理方式一般是:放大和滤波,这个过程中就涉及到放大电路的选取、滤波器的选择以及偏置电路的设计。本例以实例的方式讲解并附带参数计算、仿真、实物测试三个环节。 假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频率范…

  • A左右ndroid正在使用Uri监视数据库中的更改

    A左右ndroid正在使用Uri监视数据库中的更改

  • python判断文件是否存在、不存在则创建_python判断文件是否存在,不存在就创建一个的实例…「建议收藏」

    python判断文件是否存在、不存在则创建_python判断文件是否存在,不存在就创建一个的实例…「建议收藏」python判断文件是否存在,不存在就创建一个的实例如下所示:try:f=open(“D:/1.txt”,’r’)f.close()exceptIOError:f=open(“D:/1.txt”,’w’)以上这篇python判断文件是否存在,不存在就创建一个的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。时间:2019-02-17python中查找指定…

  • AngularJS进阶(二)AngularJS路由问题解决

    AngularJS进阶(二)AngularJS路由问题解决AngularJS路由问题解决遇到了一个棘手的问题:点击优惠详情时总是跳转到药店详情页面中去。再加一层地址解决了,但是后来发现问题还是来了:Couldnotresolve’yhDtlMaintain/yhdetail’fromstate’yhMaintain’药店详情http://192.168.1.118:8088/lmapp/index.html#/0优惠券详情

  • IoT — (四) 物联网系统架构介绍[通俗易懂]

    IoT — (四) 物联网系统架构介绍[通俗易懂]  物联网(IoT)是目前最新最热的技术热点之一,也是这个信息化时代的重要发展节点。相对于互联网而言,物联网的本质在于“万物相连”。物联网的核心和基础仍然是互联网,是在互联网基础上延伸和扩展的网络;其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信,也就是物物相息。  物联网操作系统概述:尽管物联网的发展形态受到普遍看好和关注,但是“连接、区别、识别、沟通、操作”这五大问题一直如影随形…

  • Ubuntu20.04安装详细图文教程(双系统)[通俗易懂]

    Ubuntu20.04安装详细图文教程(双系统)[通俗易懂]Ubuntu安装前言最近想把自己开发环境换成linux的,想了一下还是ubuntu比较面向桌面,而且想熟悉使用一下Linux操作系统,决定使用ubuntu。开始了着手查找安装Ubuntu双系统的方法。安装有三种,虚拟机安装、wubi安装和U盘安装。第一种发挥不出硬件本身的性能,尝鲜还行。使用wubi–就是ubuntu提供的一种简便的安装系统方法,但是当时使用一直出错。所以我用了第三种,就出现了这篇博客。一、需要资源U盘一个(提前备份数据)Ubuntu20.04LTS镜像下载地址:清华源

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号