我的项目采用了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文件.
分享到:
相关推荐
除了Struts2拦截器,我们还可以使用Servlet Filter进行权限验证。Filter是在HTTP请求进入Servlet之前运行的组件,它可以用于处理各种请求和响应过滤,包括登录验证。通常,我们在`web.xml`中配置Filter: ```xml ...
2. **拦截器链**:在Struts2中,多个拦截器可以形成一个拦截器链,每个拦截器按照定义的顺序依次执行。如果所有拦截器都允许Action执行,那么Action的结果将被传递到下一个拦截器,直到整个链执行完毕。 ### 二、...
Struts2 中拦截器与过滤器的区别及执行顺序 Struts2 中的拦截器(Interceptor)和过滤器(Filter)是两个不同的概念,虽然它们都可以影响请求的处理过程,但它们的作用域、执行顺序和实现机制都有所不同。 拦截器...
拦截器是Struts2框架的核心组件之一,用于增强应用的功能,比如权限验证、日志记录、数据校验等。 在Struts2中,每个Action执行前都会经过一系列预定义或自定义的拦截器。这些拦截器按照配置的顺序逐个执行,每个...
总结来说,这个项目提供了Struts2中拦截器和过滤器的实际应用示例,特别关注了用户身份验证和非法访问控制。通过深入研究和实践这个示例,开发者可以更深入地理解这两个组件,并能够将这些知识应用于自己的项目中,...
记得检查`web.xml`中的`filter`和`filter-mapping`配置,它们是Struts2与请求交互的关键部分。 总之,自定义Struts2拦截器是一项强大的技术,可以增强应用程序的控制和扩展性。通过分析提供的源代码,你可以深入...
通过对Struts 2框架中过滤器和拦截器的核心区别以及具体应用场景的分析,我们可以看到,虽然两者都能实现类似的功能(如权限验证),但它们的工作方式和技术基础存在明显差异。选择合适的技术方案取决于实际项目的...
#### 三、拦截器在Struts2中的应用 在Struts2框架中,拦截器的作用非常广泛。主要体现在以下几个方面: - **请求拦截**:拦截器可以拦截用户的请求,并对其进行预处理或后处理。 - **类型转换**:例如,将请求参数...
例如,在"struts过滤器(拦截器)程序.zip"中,`web.xml`可能包含了对Struts2 Filter的配置,像这样: ```xml <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter...
与Servlet规范中的Filter相比,虽然两者都用于处理请求,但拦截器在Struts2中具有独立的生命周期和更灵活的调用顺序管理。 4.1.1 拦截器的调用时机与流程 拦截器的调用主要由`...
在Struts2中,拦截器扮演着至关重要的角色,它们是框架的核心组件,能够增强应用的功能并实现诸如日志记录、权限检查、事务管理等通用任务。本文将深入探讨如何模拟Struts2的拦截器,并通过一个实际的Filter类来阐述...
在Struts2框架中,拦截器是一种设计模式,它允许开发者在Action执行前后插入额外的功能,比如日志记录、权限检查、性能监控等。这些功能可以通过编写自定义拦截器或者使用Struts2提供的内建拦截器实现。 Struts2内...
本文将深入探讨Struts框架中的拦截器(Interceptor)以及它与过滤器(Filter)的区别,并结合文件上传功能进行讲解。 1. 拦截器与过滤器的概念 - **拦截器**:在Struts2框架中,拦截器是基于AOP(面向切面编程)的...
Struts2是一个强大的Java web应用程序...总的来说,Struts2利用Filter作为控制器,结合Action、视图和拦截器,为Java Web应用提供了一套强大的MVC实现。通过深入学习和实践,开发者可以构建出高效、可扩展的应用系统。
在深入探讨Struts2拦截器的使用之前,我们先来了解一下拦截器的基本概念以及它在Struts2框架中的角色和重要性。 ### Struts2拦截器的概念 拦截器(Interceptor)是Struts2框架的核心组件之一,它允许开发者在...
Struts权限过滤器是Java Web开发中用于控制用户访问权限的关键组件,主要应用于基于Struts 2框架的应用程序。在Struts 2框架中,过滤器扮演着重要的角色,它们在HTTP请求到达Action之前进行拦截,对请求进行预处理,...
Struts2 框架是Java Web开发中广泛使用的MVC框架之一,...Struts2的拦截器机制为开发者提供了强大的扩展性和灵活性,允许他们在不改动Action核心逻辑的情况下,实现诸如日志记录、权限控制、数据验证等复杂的业务需求。
- **定义与特点**:Struts2是一款基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它继承了Struts1的优点,同时在设计上更加灵活、易用,支持拦截器、类型转换、文件上传等特性。Struts2使用过滤...