Spring MVC中登录过滤器使用
2018/08/10 20:03:53 来源:Linux社区 作者:ljy-20180122

前言

一般的JavaWeb项目中我们肯定会使用过滤器来实现对一些请求的过滤,通过过滤来实现对一些请求参数的设置和校验,比如我们比较熟悉的CharacterEncodingFilter就是一个字符编码的过滤器,小编今天就filter实现拦截登录的过程做一个简单的演示。

预期效果

一般当我们访问某个页面时,如果没有登录,则需要跳转到登录页面,登陆后在跳转到主页面。

实现代码

主要通过实现Servlet的Filter接口即可,主要代码如下,其中为了防止静态资源、登录页面、登录请求被过滤拦截,可将对应的请求排除掉(具体见代码标红部分)

package com.yongcheng.liuyang.filter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.util.StringUtils;

/**
 * 用户登录过滤器
 *
 *
 *
 * @author Administrator
 *
 */
public class UserLoginFilter implements Filter
{

    private static List<String> urls = Arrays.asList(new String[]{"js/","images/","jsp/","/doLogin","/login"});
   
    @Override
    public void destroy()
    {
       
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                        FilterChain chain)
            throws IOException, ServletException
    {
        HttpServletRequest req = (HttpServletRequest)servletRequest;
        HttpServletResponse rep = (HttpServletResponse)servletResponse;
        HttpSession session = req.getSession();
       
        //获取当前请求的uri
        String uri = req.getRequestURI();
       
        if (isIegalUrl(uri))
        {
            chain.doFilter(servletRequest, servletResponse);
        }
        else
        {
            //如果当前session中存储了用户信息则直接访问,否则跳转到登录页面
            if (StringUtils.isEmpty(session.getAttribute("user")))
            {
                rep.sendRedirect("login");
            }
            else
            {
                chain.doFilter(servletRequest, servletResponse);
            }
        }
       
    }
       

    @Override
    public void init(FilterConfig arg0) throws ServletException
    {
       
    }

   
    private boolean isIegalUrl(String uri)
    {
        for (String string : urls) {
            //如果当前请求包括这些静态资源文件,则不处理,
            if (uri.indexOf(string) > -1)
            {
                return true;
            }
        }
       
        return false;
    }
   
}

上面提到的对静态资源不过滤,当然springmvc中也要设置静态资源的请求不经过DispatcherServlet,此时就需要在spring-mvc.xml中进行设置,小编基本使用默认的配置,如下代码中的<mvc:default-servlet-handler />

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd ">
       
    <context:component-scan base-package="com.yongcheng.liuyang.controller">
    </context:component-scan>
    <context:component-scan base-package="com.yongcheng.liuyang.listener" />
       
<!--    spring MVC不处理静态资源  -->
    <mvc:default-servlet-handler />   
<!--    支持MVC的注解驱动 -->
    <mvc:annotation-driven />
   
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        id="internalResourceViewResolver" >
<!--        自动添加到路径中的前缀 -->
        <property name="prefix" value="/jsp/" />
<!--        自动添加到路径中的后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>
   
</beans>

好了,以上就是springmvc中简答的filter使用!如有任何疑问,欢迎留言交流!!

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2018-08/153450.htm


6

本栏最新