实现一个判断某值是否为空的过滤器
过滤器逻辑
过滤器不通过就会到login,然后经拦截器和控制器,到/jsp/index.jsp
过滤器通过,则传递请求success2,经拦截器和控制器,然后返回/jsp/success.jsp
文章目录
相关的文件
web.xml
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.how2java.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<!-- 所有的管理页面需要登录后才能访问 -->
<!--<url-pattern>/jsp/*</url-pattern>-->
<url-pattern>/jsp/success</url-pattern>
<url-pattern>/jsp/login</url-pattern>
</filter-mapping>
com.how2java.filter.LoginFilter
package com.how2java.filter;
import javax.servlet.Filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
/**
* @program: ssm
* @description: 实现一个判断某值是否为空的过滤器
* @author: LiuYing
* @create: 2019-04-29 13:15
**/
public class LoginFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
HttpSession session = request.getSession();
// 没有userName为空就转发到登陆页面
if(session.getAttribute("userName")==null){
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
// response.sendRedirect(request.getContextPath()+"/index.jsp"); //重定向就相当于地址栏输入 也不能随便访问jsp
}else{
// 不为空,就继续请求下一级资源(继续访问)
arg2.doFilter(arg0, arg1);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
过滤器和拦截器的区别
参考文献
1.过滤器执行完交给拦截器和控制器
2.两者都可以传递请求
3.拦截器不依赖与servlet容器,过滤器依赖与servlet容器
4.一个是容器支持一个是框架支持
5.拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。因为bean是spring框架里面的
6.拦截器是基于java的反射机制的,而过滤器是基于函数回调。
按照上图这个逻辑应该是这样,但是我觉得跟文章的有些说法有点矛盾
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
System.out.println("before...");
chain.doFilter(request, response);
{
//Servlet的doService()方法是在chain.doFilter(request, response);这个方法中进行的
//SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。
doService()
{
dispatcher
{
preHandle()//这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行
controller
afterCompletion()
}
}
}
System.out.println("after...");
}
源码: