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>