SSM-过滤器 demo

实现一个判断某值是否为空的过滤器

过滤器逻辑
过滤器不通过就会到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...");
    }

源码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值