struts2的拦截器和filter的区别

所有的跳转和请求都走filter

对jsp的页面的请求不会走拦截器,

既走拦截器又走filter的请求会先走拦截器后走filter,

具体实例:

1.拦截器:

package com.ultratest.businessTest.interceptor;


import java.io.PrintWriter;
import java.util.Map;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.ultratest.businessTest.model.User;
import com.ultratest.businessTest.system.Constants;


/**
 * Session拦截器
 * 
 * @author linhb
 * 
 */
public class SessionInterceptor extends AbstractInterceptor {


private static final long serialVersionUID = 1L;
private static Logger log = Logger.getLogger(SessionInterceptor.class);





@Override
public String intercept(ActionInvocation invocation) throws Exception {

ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
User user = (User) session.get(Constants.SESSION_USER_KEY);
if (user == null) {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
PrintWriter pw = response.getWriter();
String flag = "";

//异步请求
if (request.getHeader("X-Requested-With") != null
&& request.getHeader("X-Requested-With").equalsIgnoreCase(
"XMLHttpRequest")) {
log.info("用户没登录或登录过期,不能访问");
response.setCharacterEncoding("text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
flag = "9999";
pw.write(flag);
return null;

//普通请求
} else {
response.setCharacterEncoding("text/html;charset=utf-8");
response.sendRedirect("/businessTest/login.jsp");
log.info("用户没登录或登录过期,不能访问");
return "login";
}
}
return invocation.invoke();
}


}

过滤器代码

package com.ultratest.businessTest.interceptor;
import java.io.IOException;


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;


import com.ultratest.businessTest.model.User;


public class JspFilter implements Filter {


private boolean isExcludePages(String url) {


return url.indexOf("login.jsp") != -1;  
         
}


public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
User user = (User) httpServletRequest.getSession(true).getAttribute(
"user");

if (!isExcludePages(httpServletRequest.getRequestURI())) {
if (user == null) {
httpServletResponse.sendRedirect(httpServletRequest
.getContextPath() + "/login.jsp");
}
}
filterChain.doFilter(servletRequest, servletResponse);


}


@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub


}
}

既所有的非  http://localhost:8080/businessTest/index.jsp(结尾是.jsp的) 形式的请求拦截器和过滤器都会走

且先走拦截器后走filter,

注:拦截器是struts特有的概念,所有使用了struts的组件都会走拦截器,而jsp是servlet中的概念,filter是web的概念,

所有方位servlet的都会走filter

拦截器和过滤器的配置:

在web-xml中配置

<filter>
<filter-name>jspFilter</filter-name>
<filter-class>com.ultratest.businessTest.interceptor.JspFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>jspFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

在struts-xml文件中配置

<package name="businessTest-json" extends="json-default">
<interceptors>
<interceptor name="sessionInterceptor" class="com.ultratest.businessTest.interceptor.SessionInterceptor">
</interceptor>
<interceptor-stack name="permissionStack">
<interceptor-ref name="sessionInterceptor" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="permissionStack"></default-interceptor-ref>
<global-results>  
            <!-- 当返回login视图名时,转入/login.jsp页面 -->  
            <result name="login">/login.jsp</result>
        </global-results>
</package>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值