过滤器和拦截器的区别:
-
拦截器只能对action 请求起作用,而过滤器则可以对几乎所有的请求起作用
-
过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
-
过滤器的触发时机是容器后,servlet之前,所以过滤器的doFilter(
ServletRequest request, ServletResponse response, FilterChain chain
)的入参是ServletRequest ,而不是httpservletrequest。因为过滤器是在httpservlet之前。
配置拦截器 interceptor :
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在执行前进行拦截,如果拦截成功,返回True
// 获取session
HttpSession session = request.getSession();
// 获取登录的url。这个url是不进行拦截的
// String url = request.getRequestURI();
// if(session.getAttribute("userInfo") !=null || url.indexOf("userInfoController/doLogin.do") !=-1)
if(session.getAttribute("userInfo") !=null){
// 登录成功,不拦截
return true;
}else {
// 拦截后,重新返回到登陆了页面
response.sendRedirect( request.getContextPath()+ "/userInfoController/doLogin.do");
return false;
}
拦截器是要配置的,将这个类,配置在 spring-mvc.xml 的配置文件中,如下:
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有的mvc控制器 -->
<mvc:mapping path="/**"/>
<!-- mvc:exclude-mapping - 是另一种拦截,他可以在你后来测试中对某一个页面进行不拦截,这样 就不要在LoginInterceptor中获取登陆的url,进行放行 –>-->
<mvc:exclude-mapping path="/userInfoController/doLogin.do"/>
<!-- 告诉使用哪一个拦截器 -->
<bean class="com.zrgj.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
将登陆拦截器类 LoginInterceptor,配置到里面这个拦截器有2个知识要点:
①:
<mvc:mapping path="/**"/> 是已经拦截了所有请求,包括登录,如果后来想不拦截某个页面,就在拦截配置里面配置:
<mvc:exclude-mapping path="/system/login" />
②:也可以不在配置文件里拦截某个页面请求,在拦截类里面获取拦截路径,然后做个判断
配置过滤器filter:
过滤器就分两步:新建过滤器类,接着配置web.xml
- 建一个LoginFilter 类,继承 Filter 类: import javax.servlet.filter
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 过滤器出生
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 强转
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 获取sessioin
HttpSession session = request.getSession();
if(session.getAttribute("userInfo") == null && request.getRequestURI().indexOf("/userInfoController/doLogin.do") == -1){
// 没有登录
response.sendRedirect(request.getContextPath() + "/userInfoController/doLogin.do");
}else{
// 已经登录,继续请求下一步操作
filterChain.doFilter(request,response);
}
}
}
- 配置 web.xml ,在字符过滤器下面接着配置一个过滤器
<!-- <!– 使用filter过滤器进行登录控制 –>-->
<!-- <filter>-->
<!-- <filter-name>SessionFilter</filter-name>-->
<!-- <filter-class>com.zrgj.filter.LoginFilter</filter-class>-->
<!-- </filter>-->
<!-- <filter-mapping>-->
<!-- <filter-name>SessionFilter</filter-name>-->
<!-- <url-pattern>/pages/ *</url-pattern>-->
<!-- <url-pattern>*.jsp</url-pattern>-->
<!-- </filter-mapping>-->
<!-- 配置SpringSecurity;添加过滤器拦截所有请求 -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/ *</url-pattern>
</filter-mapping>