Java 过滤器

Java 过滤器_第1张图片

过滤器的作用:实现对web资源请求的拦截,完成特殊的操作,尤其是对请求的预处理。

过滤器的使用场景

  • Web资源权限访问控制
  • 请求字符集编码处理
  • 内容敏感字符词汇过滤
  • 响应信息压缩

过滤器的工作流程

Java 过滤器_第2张图片

过滤器的生命周期

  • web 应用程序启动时,web 服务器创建Filter 的实例对象,以及对象的初始化。
  • 当请求访问与过滤器关联的Web资源时,过滤器拦截请求,完成指定功能。
  • Filter对象创建后会驻留在内存,在web应用移除或服务器停止时才销毁。
  • 过滤器的创建和销毁由WEB服务器负责。

过滤器的实现步骤

1.编写java类实现Filter接口,并实现其doFilter方法。
2.在web.xml文件中对filter类进行注册,并设置所拦截的资源。

过滤器链

  • 在一个web应用中,多个过滤器组合起来称之为一个过滤器链。
  • 过滤器的调用顺序取决于过滤器在web.xml文件中的注册顺序

案例介绍

1.项目案例为Java Web应用程序,完成一个简单的数据提交功能。
2.增加中文编码字符集预处理过滤器,解决中文乱码问题。
3.增加系统用户登录安全控制过滤器,解决web资源访问控制问题

中文编码过滤器的实现

public class CharacterEncodingFilter implements Filter {

    private FilterConfig config;

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        request.setCharacterEncoding(config.getInitParameter("charset"));// 根据过滤器配置字符集,设置请求字符集编码

        // System.out.println("characterEncodingFilter 请求预处理");//测试过滤器(链)工作流程使用
        chain.doFilter(request, response);
        // System.out.println("characterEncodingFilter 响应后处理");//测试过滤器(链)工作流程使用
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }

    public FilterConfig getConfig() {
        return config;
    }

    public void setConfig(FilterConfig config) {
        this.config = config;
    }
}

用户登录安全控制过滤器实现

public class SessionFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest hrequest = (HttpServletRequest) request;// 涉及到HTTP请求处理,转型处理
        HttpServletResponse hresponse = (HttpServletResponse) response;// 涉及到HTTP请求处理,转型处理

        String loginUser = (String) hrequest.getSession().getAttribute("loginUser");// 判断用户是否完成了登录操作,session中是否存储用户名

        if (loginUser == null) {
            hresponse.sendRedirect(hrequest.getContextPath() + "/index.jsp?flag=1");// 未登录,系统强制重定向至登录页面
            return;
        } else {
            chain.doFilter(hrequest, hresponse);
            return;
        }
    }

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

在web.xml注册过滤器,配置拦截器映射



    FilterDemo

    
        index.jsp
    

    
    
        characterEncodingFilter
        filter.CharacterEncodingFilter
        
            charset
            UTF-8
        
    

    
        characterEncodingFilter
        /*
    

    
    
        sessionFilter
        filter.SessionFilter
    

    
        sessionFilter
        /message.jsp
    

Message.java

public class Message {
    private String title;
    private String content;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String flag = request.getParameter("flag");
%>




用户登录




  

系统登录

 

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        session.setAttribute("loginUser", username);        //模拟登录操作,在session中存入登录用户的用户名
        response.sendRedirect(request.getContextPath()+"/message.jsp");//重定向至留言板页面
%>

message.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*,model.*" %>
<%
  String user = (String)session.getAttribute("loginUser");

  String subFlag = request.getParameter("subFlag");
  
  List messages = (List)session.getAttribute("messages");
%>




留言板





留言板

 

<% if(messages!=null){ for(Message message : messages){ %> <% } } %>
留言人 标题 内容
<%=user %> <%=message.getTitle() %> <%=message.getContent() %>

messageSub.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*,model.*" %>

<% 
    String title = request.getParameter("title");
    String content = request.getParameter("content");
    
    Message message = new Message();
    message.setTitle(title);
    message.setContent(content);
    
    List messages = (List)session.getAttribute("messages");
    if(messages == null){
        messages = new ArrayList();
        session.setAttribute("messages", messages);
    }
    
    messages.add(message);//留言列表信息存储至session中
    
    response.sendRedirect(request.getContextPath()+"/message.jsp?subFlag=1");//重定向至留言板页面
%>

过滤器中filter-mapping子元素dispatcher配置

        
        testFilter
        filter.TestFilter
    

    
        testFilter
        /test2.jsp
        REQUEST
        
        
        
    
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

<%
    //request.getRequestDispatcher("/test2.jsp").forward(request, response);//测试dispatcher FORWARD配置
    //response.sendError(404);//测试dispatcher ERROR配置
%>




Test1


    
    
    

Test1

你可能感兴趣的:(Java 过滤器)