区别是 :
过滤器拦截的是 浏览器在请求前端页面时进行拦截 ,但是他不会拦截controller层
拦截器主要是springMVC对controller层的监控, 它主要拦截的是对controller请求前和请求后,以及前端页面的转发这三个步骤
过滤器写法:
web.xml文件里添加
<!-- ==================过滤器 判断用户是否登录====================== -->
<filter>
<filter-name>filter</filter-name>
<filter-class>com.liang.filter.LoginFilter</filter-class>
<init-param>
<param-name>noLoginPaths</param-name>
<param-value>login.jsp;userRegister.jsp;</param-value>
<!-- ==============在此添加不需拦截的url============== -->
</init-param>
<init-param>
<param-name>charset</param-name>
<!-- ==========防止中文乱码====== -->
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<!-- =======过滤器设置复编码========= -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<!-- =======响应体编码设置========= -->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//LoginFilter类写法
package com.liang.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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet Filter implementation class LoginFilter
*/
@WebFilter("/LoginFilter")
public class LoginFilter implements Filter {
private FilterConfig config;
//执行顺序:最先初始化init(),然后dofilter函数 最后destory()
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("filter我启动了");
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
HttpSession session = req.getSession();
String login = (String) session.getAttribute("login");
//已获取filterconfig对象,可以获取其中属性
String noLoginPaths = config.getInitParameter("noLoginPaths");
String charset = config.getInitParameter("charset");
if (charset == null) {
charset = "UTF-8";
}
request.setCharacterEncoding(charset);
response.setContentType("text/html;charset=UTF-8");
if (noLoginPaths != null) {
String[] strArray = noLoginPaths.split(";"); //对属性的值分割。分别放行
for (int i = 0; i < strArray.length; i++) {
if (strArray[i] == null || "".equals(strArray[i])) continue;
if (req.getRequestURI().indexOf(strArray[i]) != -1) {
chain.doFilter(request, response);
return;
}
}
}
System.out.println("你还没有登录请先登录");
if (login == null) {
resp.sendRedirect("/jsp/login.jsp");
} else {
chain.doFilter(request, response);
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
config = fConfig;
}
}
拦截器写法
<!--在springMVC.xml文件里添加-->
<mvc:interceptors>
<mvc:interceptor>
<!--
/**的意思是所有文件夹及里面的子文件夹
/*是所有文件夹,不含子文件夹
/是web项目的根目录
-->
<mvc:mapping path="/**"/>
<!-- 需排除拦截的地址 -->
<!--<mvc:exclude-mapping path="/userLogin"/>-->
<bean id="commonInterceptor"
class="com.liang.interceptor.CommonInterceptor">
</bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>
/**
*CommonInterceptor类写法
*/
package com.liang.interceptor;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import java.io.IOException;
public class CommonInterceptor extends HandlerInterceptorAdapter {
public static final String LAST_PAGE = "lastPage";
// 在业务处理器处理请求之前被调用 预处理
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws ServletException, IOException {
System.out.println("==============执行顺序: 1、preHandle================");
return true;
}
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
* 可在modelAndView中加入数据,比如当前时间
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("==============执行顺序: 2、postHandle================");
String username = (String) request.getSession().getAttribute("user");
System.out.println(username);
if (username == null) {
System.out.println("Interceptor:跳转到login页面!");
response.sendRedirect("/login.jsp");
}
}
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("==============执行顺序: 3、afterCompletion================");
}
}