SpringMVC过滤器

今天用到了过滤器小结一下:
SpringMVC过滤器在web.xml中通常有两种配置一种是字符集过滤器(CharacterEncodingFilter),一种是自定义的过滤器(实现Filter接口)
过滤器类继承关系和实现如下:
这里写图片描述

web.xml字符集过滤器配置如下

<filter>  
    <filter-name>characterEncodingFilter</filter-name>  
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>UTF-8</param-value>  
    </init-param>  
    <init-param>  
        <param-name>forceEncoding</param-name>  
        <param-value>true</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>characterEncodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping> 

CharacterEncodingFilter源码如下:

package org.springframework.web.filter;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;

public class CharacterEncodingFilter extends OncePerRequestFilter {
    private String encoding;
    private boolean forceEncoding = false;

    public CharacterEncodingFilter() {
    }

    public void setEncoding(String encoding) {
        this.encoding = encoding;
    }

    public void setForceEncoding(boolean forceEncoding) {
        this.forceEncoding = forceEncoding;
    }

    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        if(this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
            request.setCharacterEncoding(this.encoding);
            if(this.forceEncoding) {
                response.setCharacterEncoding(this.encoding);
            }
        }

        filterChain.doFilter(request, response);
    }
}

encoding属性:指定的编码格式(在该配置文件中该属性被SpringIoC注入的值为UTF-8)
forceEncoding属性:表示在response字符集是否也采用encoding属性值(源码中默认为false,所以想要项目编码格式一致,应该在web.xml中配置其初始值为true)
当属性注入完成后开始执行doFilterInternal()函数:在this.encoding中指定了值的前提下如果指定forceEncoding=true或者发出的请求中没有指定request字符集的编码格式(request.getCharacterEncoding() == null))那么将过滤到的request的字符集设置为encoding指定的值,并根据this.forceEncoding的值判断是否需要设置response的字符集的值,如果this.encoding为空那么直接放行.

web.xml自定义过滤器配置如下

  <filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.filter.LoginFilter</filter-class>
    <init-param>
      <param-name>unchecked</param-name>
      <param-value>/WEB-INF/Public/login.jsp,/R33/menu/login1.do,/R33/menu/login.do,/R33/Js/jquery.sorted.js,/R33/Js/jquery.sorted.js,/R33/menu/childs1.do</param-value>
    </init-param>
  </filter>

注:在为param-value字段指定值时最好可一行写,换行后貌似会出现空格问题

LoginFilter代码如下

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;

public class LoginFilter implements Filter{
    private String[] unchecked;

    //private List<User> userarr=new ArrayList<User>();

    public void init(FilterConfig config) throws ServletException {
        String url=config.getInitParameter("unchecked");
        unchecked=url.split(",");
        System.out.println(url+"==============");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("登陆路径===="+java.util.Arrays.toString(unchecked));
        //如何获取当前的路径
        HttpServletRequest request1=(HttpServletRequest)request;
        HttpServletResponse response1=(HttpServletResponse)response;
        HttpSession session=request1.getSession();
        User user=(User) session.getAttribute("u");
        String currenturl=request1.getRequestURI();
        System.out.println("当前的路径====="+currenturl);
        //路径放行*/
        if(Arrays.asList(unchecked).contains(currenturl)||user!=null){
            chain.doFilter(request,response);
        }else{
            response1.sendRedirect(request1.getContextPath()+"/menu/login1.do");
        }
    }

    public void destroy() {

    }
}

设置项目开始运行时的跳转页(登陆页面)

  <welcome-file-list>
    <welcome-file>/R33/menu/login1.do</welcome-file>
  </welcome-file-list>

login1.do代码

    @RequestMapping("/login1")
    public String login1(){
        return "Public/login";
    }

因为/R33/menu/login1.do在unchecked集合中所以直接放行,登陆页面跳转出来。
这里写图片描述
输入用户名和密码点击登录,登录按钮的action为/R33/menu/login.do,该地址也在unchecked集合中直接放行,login.do代码如下

    @RequestMapping("/login")
    public String login(User user,HttpServletRequest request,HttpServletResponse responseUser,Model model){
        System.out.println(user.getName()+"----"+user.getPassword());
        System.out.println("=======");
        User u=uservice.querybyUser(user);//查询数据库中是否有此用户
        request.getSession().setAttribute("u",u);
        System.out.println("=======");
        if(u==null){
            return "redirect:/menu/login1.do";
        }else{
            //获取用户一级菜单列表
            List<Menu> list=aservice.querybyRoleid(u.getRole_id());
            model.addAttribute("mlist",list);
            model.addAttribute("u",u);
            return "../index";
        }
    }

LoginFilter的doFilter()函数功能是如果请求的路径在 unchecked集合中,或者用户已登录成功(user!=null)那么所有请求均放行,其他请求一律跳转到登录页面。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringMVC中的过滤器(Filter)是一种拦截器,用于在请求被分派到处理程序之前或响应被发送到客户端之前对请求和响应进行预处理和后处理。它可以用于实现一些通用的功能,例如日志记录、安全性、性能监控等。 在SpringMVC中,过滤器的实现方式与Servlet中的过滤器类似。SpringMVC过滤器实现类必须实现javax.servlet.Filter接口,并且需要在web.xml文件中进行配置。例如: ``` <filter> <filter-name>myFilter</filter-name> <filter-class>com.example.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/</url-pattern> </filter-mapping> ``` 上面的配置定义了一个名为myFilter过滤器,并将其映射到所有请求路径上。在实现MyFilter类时,可以在doFilter()方法中实现自定义的过滤器逻辑。 过滤器的执行顺序与在web.xml文件中定义的顺序有关,先定义的过滤器先执行。另外,SpringMVC还提供了一种更便捷的方式来配置过滤器,即使用注解@Order来指定过滤器的执行顺序。例如: ``` @Component @Order(1) public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 过滤器逻辑 } } ``` 上面的配置定义了一个名为MyFilter过滤器,并使用@Order(1)指定了它的执行顺序。可以通过更改@Order的值来改变过滤器的执行顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值