struts2配置过滤器与拦截器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2配置过滤器与拦截器相关的知识,希望对你有一定的参考价值。

我现在做一个后台,需要登录才能访问后台的action,jsp页面都在WEB-INF下,这个可以不管,如果用户输入不是action请求的话都会直接报404。
我的问题在于我自己写了一个过滤器拦截所以action请求,对每次的action请求进行拦截,在过滤器里面判断当session.getAttribute("user")为空的话直接重定向到登录页。
现在我拦截不到action请求,不知道为什么
web.xml
<filter>
<filter-name>jspFilter</filter-name>
<filter-class>com.huihui168.cooperate.common.JspFilter</filter-class>
<init-param>
<param-name>e</param-name>
<param-value>/css,/image,/js,/login.jsp,/loginView.action</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jspFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

你在过滤器中 重定向的啊。我们这个项目是在 拦截器 中返回字符串,然后通过 struts.xml 跳转到 你要跳转的页面。。。。
代码:
这是配置的拦截器。
<!-- 只有admin 用户才能访问的action -->
<package name="onlyadmin" extends="struts-default">
<interceptors>
<!--定义一个名为admin的拦截器-->
<interceptor class="edu.cuit.course.interceptor.AdminInterceptor"
name="admin" />
<!--定义一个包含权限检查的拦截器栈-->
<interceptor-stack name="adminInterceptor">
<!--配置内建默认拦截器-->
<interceptor-ref name="defaultStack" />
<!--配置自定义的拦截器-->
<interceptor-ref name="admin">
<param name="excludeMethods">list</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>

<default-interceptor-ref name="adminInterceptor" />
<global-results>
<result name="login">/user/userLogin.jsp</result>
</global-results>
【这是全局的result,你就晓得,当自定义拦截器返回login的时候,它就会跳转到你要跳转的页面了。】
<action name="admin" class="edu.cuit.course.action.AdminAction">
</action>
<action name="module" class="edu.cuit.course.action.ModuleAction">
<result name="addModule">/module/moduleadd.jsp</result>
<result name="addSuccess">/module/suc.jsp</result>
<result name="listByPageSuccess">/page/modulelist.jsp</result>
<result name="update">/module/moduleupdate.jsp</result>
<result name="updateSuccess">/module/suc.jsp</result>
</action>

<action name="menu" class="edu.cuit.course.action.MenuAction">
<result name="add">/menu/menuadd.jsp</result>
<result name="addSuccess">/menu/suc.jsp</result>
<result name="listByPageSuccess">/page/menulist.jsp</result>
<result name="update">/menu/menuupdate.jsp</result>
<result name="updateSuccess" type="redirectAction">
<param name="actionName">menu</param>
<param name="method">listByPage</param>
</result>
</action>
</package>
。。。。。。。。。。。。。。。。。。。。。。。。。。。
这就是自定义的拦截器:
package edu.cuit.course.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

import edu.cuit.course.action.UserAction;
import edu.cuit.course.pojo.User;

public class UserInterceptor extends MethodFilterInterceptor
private static final long serialVersionUID = -4390311642665624081L;

private UserAction userAction = new UserAction();
@Override
public String doIntercept(ActionInvocation invocation) throws Exception

ActionContext ctx = invocation.getInvocationContext();

Map<String ,Object> session = ctx.getSession();

User user = (User) session.get("user");
if (user == null)
ctx.put("loginTip", "你还没有登录");
return Action.LOGIN;

return invocation.invoke();


public void setUserAction(UserAction userAction)
this.userAction = userAction;

public UserAction getUserAction()
return userAction;


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
应该差不多了,还有个system 的拦截器,差不多的结构。。要知道 你提交请求的时候,先叫由web。xml然后通过过滤器一层一层到 拦截器,也就是在你的逻辑前加一些 验证的东西,系统的拦截器有很多, invocation.invoke()就是一层一层去 触发拦截器,当系统 的拦截器和 自定义的拦截器 都通过了的时候 才回访问你的 逻辑 action 或者方法,这个叫做aop编程 。面向切面编程。追问

adminInterceptor是在哪里定义的、
list这句是拦截什么方法?
我要拦截除了/login路径之外的所有action请求,具体应该怎么写 呢

追答

adminInterceptor 是个自定义 的拦截器,就是一个java类,就想这样public class UserInterceptor extends MethodFilterInterceptor 。。上面我已经贴了代码出来了,。。list这句代码的意思是 不拦截的方法,就是当你请求的方法是list 的时候,拦截器不会拦截。。。要拦截 的方法 你吧excludeMethods 改为:
includeMethods 后面写上你要拦截的方法,。。。。。你要拦截除了/login 之外 的action 请求。。这个你还是可以 在 struts。xml 里面配置的。你要拦截那个action,你就在哪个action里面配置你的拦截器。。。action 就是你说的url。我们请求的时候就是通过url来找到action,然后再请求后台的,应该符合你的要求了吧。

参考技术A struts2不需要你以传统方式定义过滤器,你直接继承struts2提供的自定义拦截器就行了。 参考技术B 如果你拦截除/longin之外的所有,完全可以通过截取uri的最后longin然后判断如果不是login,js,css,image..就拦截,否则放过,还有,你那判断用户Id是否为空里return是什么意思 参考技术C 楼主用的是servlet过滤器与struts2无关 另外是你别重定向试试 用转发 在WEB-INF下浏览器是过不去追问

转发URL地址不变,在这里用不是很好 ,我把login.jsp单独拿出来了,所以重定向是没有问题的

struts2拦截器与过滤器

 

转载:http://www.cnblogs.com/JohnLiang/archive/2011/12/15/2288376.html

 过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符

      拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

 

    拦截器与过滤器的区别 :

  1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

     执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程(还没想到要做啥),再向上返回到过滤器的后续操作。

以上是关于struts2配置过滤器与拦截器的主要内容,如果未能解决你的问题,请参考以下文章

详解Struts2拦截器机制与自定义拦截器

Struts 2 中的过滤器与拦截器

Struts2

struts2的拦截器和springmvc的拦截器的区别

struts2拦截器与过滤器

深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载