`
sdcharles
  • 浏览: 52219 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

关于struts2中应用拦截器与filter对权限进行控制

阅读更多

我的项目采用了struts2+ExtJs的框架,在extjs的导航树中应用了iframe,监听树节点的click事件,如:html:'<iframe............>'调用了对应的jsp文件,这种框架的结合实际上大部分采用了ajax的方式来取后台的数据.如struts2.xml文件中这样配置

 

  <package name="login" extends="json-default">
		<action name="login" class="com.wscm.action.main.LoginAction" method="loginValid">
			<result type="json">
				<param name="includeProperties">success,tip</param>
			</result>
		</action>       
  </package>

 

 有人说这样的配置,由于继承了json-default无法应用struts2中的拦截器,网上大部分的拦截器例子是继承了struts-default这个包,但是昨天仔细看struts2的源文件发现json-default也是继承了struts-default这个包,所以在

 

 <package name="login" extends="json-default">
...................
  </package>

 

 配置拦截器也是起作用的.注意的是login这个包就别拦截了,如果拦截了就永远也无法登录了,当然如果把它配置在其它的action中也是可以的,只不过要在拦截器类把它放行就可以了,不过我还是喜欢这样配置,简单,拦截器类写起来也简单下面就是那个简单的拦截器类,利用session进行判断:

 

public class AuthorityIntercept extends AbstractInterceptor {
	public String intercept(ActionInvocation invocation) throws Exception{
		ActionContext ctx = invocation.getInvocationContext();
		Map session = ctx.getSession();
		String username = (String)session.get("username");
		if(username!=null){
			return invocation.invoke();
		}
		System.out.println("非法登录拦截!");
		return "login";
	}
}

 在配置文件中这样写

 <package name="ajax-json" extends="json-default">    
<interceptors>
  	<interceptor name="loginintercept" class="com.wscm.common.AuthorityIntercept"/>
  		<interceptor-stack name="logininterceptStack">
  			<interceptor-ref name="defaultStack" />
  			<interceptor-ref name="loginintercept" />
  		</interceptor-stack>
    </interceptors>
  	<default-interceptor-ref name="logininterceptStack" />
  	<global-results>
            <result name="login" type="redirect">/login.jsp</result>
    </global-results>  
		<action name="findallyhxxk" class="com.wscm.action.yygl.YhxxkAction" method="findAllYhxxk">
			<result type="json">
				<param name="root">page</param>
				<param name="excludeProperties">conditions,limit,start,success,objCondition</param>
			</result>
		</action>
		<action name="findmaxyhbh" class="com.wscm.action.yygl.YhxxkAction" method="findMaxYhbh">
			<result type="json">
				<param name="root">yhbh</param>
			</result>
		</action>
		<action name="saveyhxxk" class="com.wscm.action.yygl.YhxxkAction" method="saveYhxxk">
			<result type="json">
				<param name="includeProperties">success,tip</param>
			</result>
		</action>
  </package>

 

注意:上述配置中红色的那一行,<result name="login" type="redirect">/login.jsp</result>返回的那个视图实际上是不起作用的,我试过好多次了,后来仔细有最大的可能就是我们继承了json-default它的的返回类型是json格式的,这一点可以从源文件json-default.xml中找到,尽管没有按配置的视图资源进行跳转,但是如果未经登录打开了其中的某个页面时,再点击其中的应用时(实际上是调用上述ajax-json包中的action)是会拦截的,因为测试时那个"非法登录拦截!"打印出来了.

上述这样的确可以拦截应用但是有一点不太爽,就是未经登录应用中的jsp页面还是被打开了,虽然没什么实际性的内容(实际测试如果那个页面中如果打开时就调用ajax-json包中的action是会自动跳转到登录页面的,即使未显式的配置拦截器,我的理解是调用了struts-default中内置的有个管理session的拦截器,如果此处不对请高人指点).看struts2的源文件发现struts2的拦截器拦截的是action而不是jsp文件,如果想拦截jsp文件网上有人说可以将所有的jsp文件放入web-inf目录下,这个未经测试,不过估计可以.仔细看struts2的拦截器其实核心也是应用了filter,这样我们可以写一个filrter类配置在web.xml中对那些非法打开的jsp文件跳转到登录页面.如下是就是那个filter类:

 

public class AuthFilter implements Filter {
	private static Log log = LogFactory.getLog(AuthFilter.class);

    public void init(FilterConfig filterConfig) throws ServletException { 
        if(log.isDebugEnabled()){ 
            log.debug("初始化权限过滤器。"); 
        } 
    }
    public void doFilter(ServletRequest servletRequest, 
            ServletResponse servletResponse, FilterChain filterChain) 
            throws IOException, ServletException { 
        /** 
         * 1,doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括 
         * 表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过 
         * 滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。 
         */
        HttpServletRequest request = (HttpServletRequest) servletRequest; 
        /** 
         * 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中 
         * 无法得到的方法,就要把此request对象构造成HttpServletRequest 
         */ 
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String currentURL = request.getRequestURI(); // 取得根目录所对应的绝对路径:
        HttpSession session = request.getSession(false);
        //如果jsp就验证(login.jsp,authImg.jsp图形验证码除外) 
        if (currentURL.indexOf("login.jsp")==-1 && currentURL.indexOf("authImg.jsp")==-1 && currentURL.indexOf(".jsp")>-1 ) { 
            if(log.isDebugEnabled()){ 
                log.debug("对jsp文件进行权限验证。"+"请求的URL:"+currentURL);             
            }
            // 判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环 
            if(session == null || session.getAttribute("username") == null ){ 
                response.sendRedirect(request.getContextPath()+"/login.jsp"); 
                return ; 
            } 
        } 
        // 加入filter链继续向下执行 
        filterChain.doFilter(request, response); 
        /** 
         * 调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作 为它 
         * 的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另 
         * 一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。 
         */ 
    }


    public void destroy() {

    } 
}

 这个类的源码也是从网上一个资料中摘抄的,不过关键位置做了修改,尤其要注意的是上述红色的地方authImg.jsp,那是我的一个产生图形验证码的类,在页面中用jsp方式来调用.对于login.jsp,authImg.jsp一定要放行,否则前者会造成无法打开登录页面,后者就不会产生验证码,当然如果登录窗口不含

有验证码或者不用这种方式调用的,可以不管它.

我是filter与拦截器配合完美实现了权限验证拦截,当然了把拦截器去掉放在filter中拦截也是可以的,但是觉得这样简单.拦截器应用简单功能强大,唯一不足的就是无法拦截jsp文件.

分享到:
评论
3 楼 wnfd369 2012-07-02  
2 楼 wzwahl36 2012-03-23  
使用struts + extjs做管理系统时,使用拦截器拦截action来验证是否登录,如果没有登录,会跳转到login.jsp,现在的问题就是拦截到了,但是不能跳转~~

这个问题在你的博文中也提到了,请问这个问题怎么解决?
因为这个web系统还有一个前台主页,如果采用过滤器的话,这个url太难解析了~

如果博主知道怎么解决这个问题,email:wzwahl36@qq.com
thx.
1 楼 xiaofengyu 2011-07-12  
你好,我也遇到了你所描述的问题,但不同的是访问json-default包下的action,它根本就没有进入到自定义的AuthorityIntercept中,不知道为什么,请教一下!PS:我的AuthorityIntercept 继承的是MethodFilterInterceptor

相关推荐

    使用struts2拦截器对登陆权限验证

    除了Struts2拦截器,我们还可以使用Servlet Filter进行权限验证。Filter是在HTTP请求进入Servlet之前运行的组件,它可以用于处理各种请求和响应过滤,包括登录验证。通常,我们在`web.xml`中配置Filter: ```xml ...

    struts2 拦截器

    2. **拦截器链**:在Struts2中,多个拦截器可以形成一个拦截器链,每个拦截器按照定义的顺序依次执行。如果所有拦截器都允许Action执行,那么Action的结果将被传递到下一个拦截器,直到整个链执行完毕。 ### 二、...

    简单理解Struts2中拦截器与过滤器的区别及执行顺序

    Struts2 中拦截器与过滤器的区别及执行顺序 Struts2 中的拦截器(Interceptor)和过滤器(Filter)是两个不同的概念,虽然它们都可以影响请求的处理过程,但它们的作用域、执行顺序和实现机制都有所不同。 拦截器...

    struts2拦截器原理

    拦截器是Struts2框架的核心组件之一,用于增强应用的功能,比如权限验证、日志记录、数据校验等。 在Struts2中,每个Action执行前都会经过一系列预定义或自定义的拦截器。这些拦截器按照配置的顺序逐个执行,每个...

    Struts2编写的通用(拦截器,过滤器)Filter

    总结来说,这个项目提供了Struts2中拦截器和过滤器的实际应用示例,特别关注了用户身份验证和非法访问控制。通过深入研究和实践这个示例,开发者可以更深入地理解这两个组件,并能够将这些知识应用于自己的项目中,...

    自定义拦截器struts2源代码

    记得检查`web.xml`中的`filter`和`filter-mapping`配置,它们是Struts2与请求交互的关键部分。 总之,自定义Struts2拦截器是一项强大的技术,可以增强应用程序的控制和扩展性。通过分析提供的源代码,你可以深入...

    Struts 2 过滤器和拦截器的区别

    通过对Struts 2框架中过滤器和拦截器的核心区别以及具体应用场景的分析,我们可以看到,虽然两者都能实现类似的功能(如权限验证),但它们的工作方式和技术基础存在明显差异。选择合适的技术方案取决于实际项目的...

    struts2拦截器

    #### 三、拦截器在Struts2中的应用 在Struts2框架中,拦截器的作用非常广泛。主要体现在以下几个方面: - **请求拦截**:拦截器可以拦截用户的请求,并对其进行预处理或后处理。 - **类型转换**:例如,将请求参数...

    struts过滤器(拦截器)程序.zip

    例如,在"struts过滤器(拦截器)程序.zip"中,`web.xml`可能包含了对Struts2 Filter的配置,像这样: ```xml &lt;filter&gt; &lt;filter-name&gt;struts2&lt;/filter-name&gt; &lt;filter-class&gt;org.apache.struts2.dispatcher.filter...

    Struts2拦截器详解源码

    与Servlet规范中的Filter相比,虽然两者都用于处理请求,但拦截器在Struts2中具有独立的生命周期和更灵活的调用顺序管理。 4.1.1 拦截器的调用时机与流程 拦截器的调用主要由`...

    模拟Struts2拦截器代码

    在Struts2中,拦截器扮演着至关重要的角色,它们是框架的核心组件,能够增强应用的功能并实现诸如日志记录、权限检查、事务管理等通用任务。本文将深入探讨如何模拟Struts2的拦截器,并通过一个实际的Filter类来阐述...

    对Struts2内建拦截器的知识总结以及将Struts的Jar包上传下

    在Struts2框架中,拦截器是一种设计模式,它允许开发者在Action执行前后插入额外的功能,比如日志记录、权限检查、性能监控等。这些功能可以通过编写自定义拦截器或者使用Struts2提供的内建拦截器实现。 Struts2内...

    struts03:拦截器、过滤器与拦截器的区别、文件上传

    本文将深入探讨Struts框架中的拦截器(Interceptor)以及它与过滤器(Filter)的区别,并结合文件上传功能进行讲解。 1. 拦截器与过滤器的概念 - **拦截器**:在Struts2框架中,拦截器是基于AOP(面向切面编程)的...

    Struts2--1.Filter作为控制器并搭建Struts2的基本环境

    Struts2是一个强大的Java web应用程序...总的来说,Struts2利用Filter作为控制器,结合Action、视图和拦截器,为Java Web应用提供了一套强大的MVC实现。通过深入学习和实践,开发者可以构建出高效、可扩展的应用系统。

    struts2拦截器的使用

    在深入探讨Struts2拦截器的使用之前,我们先来了解一下拦截器的基本概念以及它在Struts2框架中的角色和重要性。 ### Struts2拦截器的概念 拦截器(Interceptor)是Struts2框架的核心组件之一,它允许开发者在...

    Struts权限过滤器

    Struts权限过滤器是Java Web开发中用于控制用户访问权限的关键组件,主要应用于基于Struts 2框架的应用程序。在Struts 2框架中,过滤器扮演着重要的角色,它们在HTTP请求到达Action之前进行拦截,对请求进行预处理,...

    struts拦截器介绍

    Struts2 框架是Java Web开发中广泛使用的MVC框架之一,...Struts2的拦截器机制为开发者提供了强大的扩展性和灵活性,允许他们在不改动Action核心逻辑的情况下,实现诸如日志记录、权限控制、数据验证等复杂的业务需求。

    Struts2视频教程

    - **定义与特点**:Struts2是一款基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它继承了Struts1的优点,同时在设计上更加灵活、易用,支持拦截器、类型转换、文件上传等特性。Struts2使用过滤...

Global site tag (gtag.js) - Google Analytics