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>

 

posted on 2019-09-28 14:11  忆夏KhaZix  阅读(880)  评论(0编辑  收藏  举报