Filter的作用
Filter在Java web应用中起到拦截器的作用,常见使用场景是检查是否已登陆.敏感词汇过滤等,作为Servlet的核心技术被广泛使用在各个方面
Filter的功能
Filter能在请求到达Servlet之前修改请求和响应的信息,经过判断以后决定是否要放行改(修改)请求的内容.
Filter的使用
Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,Web服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:
调用目标资源之前,让一段代码执行。
是否调用目标资源(即是否让用户访问web资源)。
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。
使用的第一步,是需要在web.xml中配置Filter,主要是配置Filter对应的实体类和配置拦截请求的样式,配置方法如下:
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>cn.wufeng.core.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
第二步编写实体类,要实现Filter接口
里面包含了三个需要实现的方法:
public void destroy();//销毁的时候可以同时销毁FilterConfig 的配置
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//必须经过的方法,需要判断的条件可以写在里面
public void init(FilterConfig filterConfig) throws ServletException;//初始化会调用的方法,
在doFilter里面,进行了业务所需要的判断,如果准予放行,则调用chain.doFilter(request, response);方法放行.
例子如下:
package cn.wufeng.core.filter;
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 org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import cn.itcast.core.constant.Constant;
import cn.itcast.core.permission.PermissionCheck;
import cn.itcast.nsfw.user.entity.User;
public class LoginFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
String uri = request.getRequestURI();
//判断当前行为是否为登陆请求
if(!uri.contains("sys/login_")){
//已经登陆过的时候直接放行
if(request.getSession().getAttribute(Constant.USER) !=null){
//权限坚定
if(uri.contains("/nsfw")){
User user =(User)request.getSession().getAttribute(Constant.USER);
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
PermissionCheck pc = (PermissionCheck) applicationContext.getBean("permissionCheck");
if (pc.isAccessible(user,"nsfw")){
//说明有权限,放行
chain.doFilter(request, response);
}else{
//没有权限,跳转到没有权限的提示页面
response.sendRedirect(request.getContextPath()+"/sys/login_toNoPermissionUI.action");
}
}else{
chain.doFilter(request, response);
}
}else{
//没有登陆的时候跳转到登陆页面
response.sendRedirect(request.getContextPath()+"/sys/login_toLoginUI.action");
}
}else{
//登陆请求,直接放行
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}