众所周知,struts2拦截器主要功能是实现对action请求的拦截,当从jsp页面发送数据到action时,先经过拦截器进行处理,我现在有个疑问是struts2是不是只能针对于action进行拦截,如果是某个地址页面呢?它还能实现拦截的功能吗?
   比如经常用到的权限验证问题,如果用户没有登录,那直接打开任何登录后的页面将会跳到登录首页,这是由拦截器来实现的,但是,大多数页面打开时并不能向action发送请求啊,那拦截器怎么去拦截?

解决方案 »

  1.   

    我现在有个疑问是struts2是不是只能针对于action进行拦截,如果是某个地址页面呢?它还能实现拦截的功能吗?这个是根据你自己配置核心控制器来的,如果参数是/*  那就表示拦截所有的请求,假如是某个地址的页面,也会拦截,去找有不有满足条件的action,没有的话 就按路径跳转。 
    如果是*.action  那就只会拦截action  。        判断用户是否登录 ,这个可以自己定义一个拦截器嘛 ,import com.chenghui.entity.User;
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;/**
     * 验证用户是否登录
     * @author Administrator
     *
     */
    public class CheckIsLoginInterceptor extends AbstractInterceptor{ private static final long serialVersionUID = 5572804837134361839L; @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
    User user = (User)actionInvocation.getInvocationContext().getSession().get("user");

    if(user==null){
    ActionContext.getContext().getSession().put("loginMessage", "请先登录!");
    return Action.LOGIN;
    }
    return actionInvocation.invoke();
    }}然后 重新指定一下 默认的拦截器就ok了<package name="ch" namespace="/" extends="struts-default">
    <interceptors>
    <interceptor name="checkIsLogin" class="com.jzaccp.interceptor.CheckIsLoginInterceptor"></interceptor>
    <interceptor-stack name="crmDefaultStack">
    <interceptor-ref name="checkIsLogin"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="crmDefaultStack"></default-interceptor-ref>
     </package>不过有一个不好的地方,就是 只能拦截action ,所以 jsp什么的就没有办法拦截了后来我在现在的项目中发现好办法了,粘贴给你吧。package com.beyondbit.common.util;import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;public class SessionFilter implements Filter {    private FilterConfig config;
        private List<String> excludedUrls = new ArrayList<String>();    /**
         * 销毁
         */
        @Override
        public void destroy() {
            // TODO Auto-generated method stub    }    /**
         * 执行
         */
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
                ServletException {
            // TODO Auto-generated method stub
            boolean flag = true;
            HttpServletRequest req = (HttpServletRequest) request;
            String url = req.getRequestURI();
            for (String one : excludedUrls) {
                if (url.indexOf(one) != -1) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                Object obj = req.getSession().getAttribute("loginuser");
                if (obj == null) {
                    HttpServletResponse res = (HttpServletResponse) response;
                    res.sendRedirect(PropertyManager.getProperty("contextPath") + "/common/validate-session.jsp");
                } else {
                    chain.doFilter(request, response);
                }
            } else {
                chain.doFilter(request, response);
            }    }    /**
         * 初始
         */
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
            config = arg0;
            String s = config.getInitParameter("excludedUrls");
            if (s != null) {
                excludedUrls = StrUtils.split(s, ",");
            }
        }}
    <!-- session Filter -->
     <filter> 
        <filter-name>sessionFilter</filter-name> 
         <filter-class>com.beyondbit.common.util.SessionFilter</filter-class> 
         <init-param> 
       <param-name>excludedUrls</param-name> 
       <param-value>/login!index.action,/login!logout.action,/login!login.action,/*/*.shtml,/system/article/article!getClickCounts.action,/system/article/article!addClickCount.action,</param-value> 
         </init-param> 
       </filter> 

    <!-- Filter 映射 -->

    <filter-mapping>
    <filter-name>sessionFilter</filter-name>
    <url-pattern>*.action</url-pattern>
    </filter-mapping>
    那个初始化参数就是为了过滤你不需要拦截的请求,以逗号分隔~~~