SSM项目中的拦截器(Interceptor)和过滤器(Filter)介绍及简单实现验证登录
一个简单的练习项目 地址栏直接输入页面的url 就可以访问
这样的项目不太安全 因为用户可以直接访问任意页面 只要他知道页面的url
用过滤器(Filter)和拦截器(Interceptor)可以解决此问题
那么 让我们先来了解一下:
一、拦截器和过滤器的区别
1、拦截器(Interceptor)只对action请求起作用 即对外访问路径
而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件
2、拦截器(Interceptor)是在Servlet和Controller控制器之间执行
而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行
在请求结束返回时也是一样 是在Servlet处理完之后返回给前端之间执行
二、拦截器和过滤器的代码实现
1、拦截器
首先需要一个拦截器类 并且这个类要实现HandlerInterceptor接口
这个接口里面有三个方法:
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在拦截点(Controller方法处理之前)执行拦截 若返回的是false则中断执行 反之亦然 return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在处理过程中(Controller方法处理完之后 DispatcherServlet进行视图的渲染之前)执行拦截 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在DispatcherServlet进行视图的渲染后 返回前进行拦截 }
稍微写一下方法:
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在Controller方法处理之前执行拦截 若返回的是false则中断执行 反之亦然 // 判断当前的User是否为空 若不为空则不拦截 if (request.getSession().getAttribute("USERINFO")!=null) { return true; } // 进行拦截 返回登录界面 response.sendRedirect(request.getContextPath()+"/user/doLogin.do"); return false; }
然后需要去SpringMVC的配置文件中配置拦截器:
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截所有的mvc控制器(Controller) --> <mvc:mapping path="/**"/> <!-- 放行机制 指定对某个页面不进行拦截 --> <!-- 拦截器只对action起作用 因此填入的不是页面路径 而是方法 --> <mvc:exclude-mapping path="/user/doLogin.do"/> <!-- 指定使用哪个拦截器 --> <bean class="net.zjitc.interceptor.LoginInterceptor"/> </mvc:interceptor> </mvc:interceptors>
如此 当访问的请求不为/user/doLogin.do会被拦截然后重定向到/user/doLogin.do
但是访问其它的页面不会被拦截
想要让页面也被拦截?你需要过滤器!
2、过滤器
同理 需要一个过滤器类 然后实现
javax.servlet.Filter接口
注意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 { } @Override public void destroy() { // 过滤器销毁 } }
稍微写一下方法:
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // ServletRequest是一个接口 而HttpServletRequest是接口的实现 // 但有些方法是HttpServletRequest独有的 例如getSession() // HttpServletRequest接口继承自ServletRequest接口 增加了和Http相关的方法 // 但是我们可以强制转换 HttpServletRequest request=(HttpServletRequest)servletRequest; HttpServletResponse response=(HttpServletResponse)servletResponse; // 若用户没有登录 if (request.getSession().getAttribute("USERINFO")==null && request.getRequestURI().indexOf("/user/doLogin.do")==-1) { response.sendRedirect(request.getContextPath()+"/user/doLogin.do"); } // 若用户已经登录 则继续下一个请求(继续访问) filterChain.doFilter(request,response); }
然后需去web.xml中配置过滤器:
<!-- 配置自定义的Filter 实现登录控制 --> <filter> <filter-name>sessionFilter</filter-name> <filter-class>net.zjitc.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <!-- 拦截所有的页面 /斜杠代表在webapp目录下 --> <url-pattern>/pages/*</url-pattern> <url-pattern>/css/*</url-pattern> <url-pattern>/img/*</url-pattern> <url-pattern>/failer.jsp</url-pattern> </filter-mapping>
总结:
拦截器和过滤器其实都是AOP编程思想的实现
都可以体现例如权限的检查 日志的记录等功能
但是有不同之处:
1、使用范围不同
拦截器既可以用在web层 又可以用在Application和Swing程序中
而filter是Servlet规范规定的 只能用于web程序中
2、规范不同
拦截器是在Spring容器内的 是Spring框架支持的
而filter是Servlet规范规定的 是Servlet容器支持的
3、使用的资源不同
4、深度不同
- 点赞
- 收藏
- 分享
- 文章举报
- VUE+SSM 以VUE做项目前端,SSM做后端框架,难点在于数据的传输处理,下面我记录一下一个简单的登录退出功能的实现,如果有缺陷还请大佬指出,个人菜鸟 一个,正在学习当中,以此记录一下自己的学习
- SSM实现最简单的登录验证
- node.js学习笔记(3)-node.js结合mysql数据库实现的web项目中常见功能--登录验证、session传值、拦截器、ajax传值等
- java web项目利用Filter进行单点登录的简单实现(解决方案)
- struts2拦截器配置;拦截器栈;配置默认拦截器;拦截方法的拦截器MethodFilterInterceptor;完成登录验证
- Spring框架学习(11)基于Maven的SSM框架实现简单登录验证
- Filter二(利用Filter实现简单的登录验证)
- struts2拦截器-简单实现非法登录验证
- ssh项目的登录拦截器的实现(interceptor)
- java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例
- java web项目利用Filter进行单点登录的简单实现
- 最简单使用的配置登录拦截器(过滤器)的方法(SSH)
- 过滤器(opensessioninviewfilter)与拦截器(opensessioninviewinterceptor)的区别?
- 怎样实现简单Forms验证(登录,注销)
- javaweb 简单验证过滤器防止未登录直接进入主页
- 拦截器Interceptor和过滤器Filter的用法区别
- 过滤器(Filter)和拦截器(Interceptor)的区别
- 用struts拦截器实现登录验证功能AuthorizationInterceptor
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- asp.net mvc4 过滤器的简单应用:登录验证