SpringMVC拦截器与JavaEE过滤器的使用及区别

拦截器

在我们的程序中,请求网页时,我们都会判断该用户是否登陆,若未登陆,重定向到登陆页面。如果我们每一次请求都判断一下是否登陆,显然是不现实的。
SpringMVC提供了拦截器,也就是每一次请求都会拦截并作出相应判断。若判断成功放行,否则阻止或者重定向到相应页面!我们拿登陆为例演示:

  1. 写一个拦截器类,实现HandlerInterceptor接口,并重写他的三个方法
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    //请求之前调用的方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        //从session中获取用户名
        String userName = (String) session.getAttribute("userName");
        //判断是否存在用户名,如果不存在代表未登录
        if(StringUtils.isEmpty(userName)){
            //重定向到登陆请求
            response.sendRedirect(request.getContextPath()+"/login.form");
            //阻止继续运行
            return false;
        }
        //用户名存在,代表已登陆,放行,继续运行
        return true;
    }

    @Override
    //请求之后调用的方法
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    //请求完成调用的方法
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
  1. 在Spring的配置文件中配置拦截路径
    关于springmvc的配置文件的头内容,可参考官方文档Springmvc官方
	<!--配置拦截器链-->
    <mvc:interceptors>
        <!--配置拦截器-->
        <mvc:interceptor>
            <!--拦截路径,可配置多个-->
            <mvc:mapping path="/a.form"/>
            <mvc:mapping path="/b.form"/>
            <!-- 也可设置全部拦截 -->
            <mvc:mapping path="/*.form"/>
            <!--不拦截路径,即白名单,可配置多个-->
            <mvc:exclude-mapping path="/c.form"/>
            <bean class="sml.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

过滤器

浏览器的编码默认是ISO8859,解决乱码问题,统一编码格式,我们可以使用JavaEE提供的过滤器。
在web.xml中加入该配置,解决前端传后台中文数据乱码问题。如果webapp报红,说明webapp头配置的版本较低,自行百度更改

<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>
    </filter>

    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

注:过滤器(Filter)是Java EE中的组件,则任何一个Java的WEB项目都可以使用过滤器;而拦截器(Interceptor)是SpringMVC中的组件,仅当使用了SpringMVC框架才可以使用这个拦截器,并且,仅当被SpringMVC框架处理的请求才有可能被拦截器进行处理,假如将DispatcherServlet的路径映射为*.form,则只有以.form作为后缀的请求才可能被拦截器处理,其它请求是不会被拦截器处理的!

在这里我只是举了个简单的例子进行演示,他的用法还有很多,比如打印日志,监听等。

发布了10 篇原创文章 · 获赞 9 · 访问量 272

猜你喜欢

转载自blog.csdn.net/weixin_45056780/article/details/104797810