欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot设置过滤器

程序员文章站 2022-04-28 16:44:39
...

最近一直在做老项目的移植,以前写的过滤器希望直接能够用到springboot项目上,争取用最少代码完成最多的事情。
首先spring boot上没有默认项目名,公司要求,我这里设置了一个项目名:

//springboot2.0之前
server.context-path=/demo
//springboot2.0以后
server.servlet.context-path=/demo

这里参考了这篇文章写的东西。
https://blog.csdn.net/wushengjun753/article/details/80612652

然后掏出了祖传的过滤器,详情看代码,逻辑不难理解,自己跑一遍基本能懂。



import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zhirong.smsshui.base.util.Constants;
import org.springframework.http.HttpStatus;
import org.springframework.web.filter.OncePerRequestFilter;
/*
 * 
 * */

public class SessionFilter extends OncePerRequestFilter{
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        // 不过滤的uri
        String[] notFilter = new String[] {"","login","index.jsp"};

        // 请求的uri
        String uri = request.getRequestURI();
        String requestPath = uri.substring(uri.lastIndexOf("/")+1,uri.length());

        // uri中包含background时才进行过滤

        if (uri.indexOf("demo") != -1) { 				//此处demo为项目名
            // 是否过滤
            boolean doFilter = true;
            for (String s : notFilter) {
                if (requestPath.equals(s) || uri.substring(uri.lastIndexOf(".")+1).equals("css")
                        ||uri.substring(uri.lastIndexOf(".")+1).equals("js")
                        ||uri.substring(uri.lastIndexOf(".")+1).equals("gif")
                        ||uri.substring(uri.lastIndexOf(".")+1).equals("jpg")){
                    // 如果uri中包含不过滤的uri,则不进行过滤
                    doFilter = false;
                    break;
                }
            }
            if (doFilter) {
                // 执行过滤
                // 从session中获取登录者实体
                Object obj = request.getSession().getAttribute(Constants.USER_INFO_SESSION);
                if (null == obj) {
                    response.setCharacterEncoding("utf-8");
                    response.setContentType("text/html;charset=utf-8");
                    // 如果session中不存在登录者实体,则弹出框提示重新登录
                    // 设置request和response的字符集,防止乱码
                    PrintWriter out = response.getWriter();

                    out.print("<script>alert('会话超时,请重新登录...'); document.location.href='index.jsp';</script>");
                    out.flush();
                    out.close();
                     	/*request.getRequestDispatcher("index.jsp").forward(request,response);*/

                } else {
                    // 如果session中存在登录者实体,则继续
                    filterChain.doFilter(request, response);
                }
            } else {
                // 如果不执行过滤,则继续
                filterChain.doFilter(request, response);
            }
        } else {
            // 如果uri中不包含background,则继续
            filterChain.doFilter(request, response);
        }
    }

}




哈哈,其实这个过滤器是我自己写的,为了迎合业务的需要,我增加了许多请求是直接通过过滤的,比如js,css之类的。
回到正题,然后我们编写一个过滤器设置类,这里参考了这位老哥写的后半段,代码如下
https://www.cnblogs.com/xiaoping1993/p/7873975.html

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean someFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(sessionFilter());
        registration.addUrlPatterns("/*");
        registration.addInitParameter("paramName", "paramValue");
        registration.setName("sessionFilter");
        return registration;
    }

    /**
     * 创建一个bean
     * @return
     */
    @Bean(name = "sessionFilter")
    public Filter sessionFilter() {
        return new SessionFilter();
    }
}

这样一来,我们的过滤器就生效了,你可以debug看看有没有用,拜拜,咕噜拜。

相关标签: spring boot filter