1.过滤器和拦截器
区别:
过滤器作用于请求到达servlet之前,在spring中也就是在dispacherServlet(前端控制器)之前。而拦截器最早只能作用于请求到达servlet之后,在执行controller之前。
过滤器:依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。
拦截器:依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于java的反射机制,属于面向切面编程(AOP)的一种运用。一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
2.ssm下实现过滤器
<!--loginFilter-->
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.hdh.web.filter.LoginFilter</filter-class>
<init-param>
<!--不进行过滤的url,因为它就是跳转到登陆界面, -->
<param-name>unFiltetRequest</param-name>
<param-value>/login</param-value>
</init-param>
<init-param>
<!--未登录用户跳转的url -->
<param-name>unFilterPag</param-name>
<param-value>/login.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
unFiltetRequest:在配置文件中定义好不需要过滤的登陆请求路劲
unFilterPag:在配置文件中定义好不需要过滤登陆页面
3.拦截所有的html和jsp资源
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
4.编写自定义过滤器实现Filter接口
public class LoginFilter implements Filter { private String unFilterPag = ""; private String unFiltetRequest = ""; public void init(FilterConfig filterConfig) throws ServletException { unFilterPag = filterConfig.getInitParameter("unFilterPag"); unFiltetRequest = filterConfig.getInitParameter("unFiltetRequest"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response;
//拿到当前页面的路径 http://localhost:8080/register.html 就是/register.html String servletPath = req.getServletPath(); HttpSession session = req.getSession(); Object ifLogin = session.getAttribute("user"); if (servletPath.equals(unFilterPag) || servletPath.equals(unFiltetRequest)){
//放行 chain.doFilter(req,res); }else { if (ifLogin==null){ res.sendRedirect(req.getContextPath()+unFilterPag); }else{
//放行 chain.doFilter(req,res); } } } public void destroy() { } }
5.ssm下实现拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/user/login"></mvc:exclude-mapping>
<bean class="com.hdh.web.interceptor.LoginInterecpt"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截所有的controller请求(拦截器只能拦截controller请求,无法拦截静态资源)
不拦截的资源:
<mvc:exclude-mapping path="/user/login"></mvc:exclude-mapping>
6.自定义拦截器实现HandIntercept接口
public class LoginInterecpt implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); if (session.getAttribute("user")==null){ response.sendRedirect(request.getContextPath()+"/login.jsp"); return false; }else { return true; } } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
其他一些常用的filter
字符集编码过滤器
<!-- 配置 springMVC 编码过滤器 -->
<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>