filter 和 struts2拦截器的比较
比较一,filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别。
比较二,filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法。而interceptor与servlet容器无关。
比较三,Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。
比较四,Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤
Servlet过滤器的基本原理
在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。
具体实例:
建一个JAVA 类
package Interceptor;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class LoginCheckFilter implements Filter {
private String loginPage="";
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest=(HttpServletRequest)request;
String url=httpServletRequest.getServletPath();
//如果用户是登陆的ACTION 则要放行~~ 不做拦截
if(url.indexOf("login.jsp")>=0 ||url.indexOf("loginAction.action")>=0)
{
chain.doFilter(request, response);
}
else
{
HttpSession session = httpServletRequest.getSession();
//判断用户session是否过期或是否登录
if (session!= null&&session.getAttribute("user")!=null)
{
chain.doFilter(request, response);
}
else
{
//转向登录页面
RequestDispatcher rd=request.getRequestDispatcher(loginPage);
rd.forward(request, response);
}
}
}
public void init(FilterConfig filterConfig) throws ServletException
{
this.loginPage=filterConfig.getInitParameter("loginPage");
}
}
WEB.XML 里添加
<!-- FILTER 过滤器 -->
<filter>
<filter-name>LoginCheckFilter</filter-name>
<filter-class>
Interceptor.LoginCheckFilter
</filter-class>
<init-param>
<param-name>loginPage</param-name>
<param-value>/login.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LoginCheckFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LoginCheckFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
这里也可以设置其他的文件格式,比如 jpg xml等等