Java网络开发(Filter过滤器)—— tomcat的过滤器 & 编码控制 + 网页权限控制

目录

  • 引出
  • 1.过滤器简介
  • 2.用过滤器实现全局编码控制
    • (1)导包import javax.servlet.*;
    • (2)如果是tomcat8.5,要把3个方法都实现
    • (3)代码如下,要点:放行,chain.doFilter(request, response)
    • 【bug】过滤器的相关bug
    • (4)过滤器代码升级,配置文件解耦
  • 3.用过滤器进行权限控制
    • (1)权限控制流程
    • (2)LoginAuthorServlet.java代码
  • 总结

引出

1.过滤器是啥,能干啥;
2.如果定义一个过滤器;


1.过滤器简介

Java网络开发(Filter过滤器)—— tomcat的过滤器 & 编码控制 + 网页权限控制_第1张图片

过滤器可以做下面的事情:

1.拦截浏览器的请求,让请求不能进入服务器;

2.经过过滤器的doFilter后放行;

2.用过滤器实现全局编码控制

之前每个servlet中都需要设置编码,请求和响应的编码需要设置成UTF-8,即以下代码

        // 编码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

用过滤器就可以实现全局的编码控制

(1)导包import javax.servlet.*;

Java网络开发(Filter过滤器)—— tomcat的过滤器 & 编码控制 + 网页权限控制_第2张图片

(2)如果是tomcat8.5,要把3个方法都实现

Java网络开发(Filter过滤器)—— tomcat的过滤器 & 编码控制 + 网页权限控制_第3张图片

(3)代码如下,要点:放行,chain.doFilter(request, response)

package com.tianju.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * 解决编码问题的过滤器
 */
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 编码问题
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        // 一定要记得放行
        chain.doFilter(request, response);

    }

    @Override
    public void destroy() {

    }
}

【bug】过滤器的相关bug

报错信息:写成了@WebServlet @WebFilter(“/*”)

Servlet[com.tianju.filter.CharacterEncodingFilter]当前不可用

Java网络开发(Filter过滤器)—— tomcat的过滤器 & 编码控制 + 网页权限控制_第4张图片

如果忘记放行,项目可以启动,但所有资源都不可访问

Java网络开发(Filter过滤器)—— tomcat的过滤器 & 编码控制 + 网页权限控制_第5张图片

(4)过滤器代码升级,配置文件解耦

上面的代码可以解决编码的问题,但是无法更改编码,通过web.xml的配置,可以实现解耦

web.xml文件代码如下:


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

        过滤器中可以配置一个参数-->
    <filter>
        <filter-name>characterEncodingFilterfilter-name>
        <filter-class>com.tianju.filter.CharacterEncodingFilterfilter-class>

        <init-param>
            <param-name>encodingparam-name>
            <param-value>UTF-8param-value>
        init-param>
        <init-param>
            <param-name>htmlShowparam-name>
            <param-value>text/html;charset=utf-8param-value>
        init-param>

    filter>

    <filter-mapping>
        <filter-name>characterEncodingFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

web-app>

此时过滤器CharacterEncodingFilter.java的代码如下,

package com.tianju.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * 解决字符编码的问题
 */

public class CharacterEncodingFilter implements Filter {
    // 获取web.xml文件中的配置utf-8
    private String encoding;
    private String htmlShow;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 从web.xml的过滤器的init-param中,对应的值,在赋值给全局变量
        encoding = filterConfig.getInitParameter("encoding");
        htmlShow =filterConfig.getInitParameter("htmlShow");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 设置编码;
        servletRequest.setCharacterEncoding(encoding);
        servletResponse.setCharacterEncoding(encoding);
        servletResponse.setContentType(htmlShow);
        // 放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

3.用过滤器进行权限控制

(1)权限控制流程

任何一个系统,都会有登陆权限的问题:

系统中所有请求的资源,servlet、静态资源等,或者登陆后才能访问;或者不登录也可以访问

以一个图书管理系统为例,不登录就可以访问的如下:

Java网络开发(Filter过滤器)—— tomcat的过滤器 & 编码控制 + 网页权限控制_第6张图片

		|| requestURI.contains("/js/")
        || requestURI.contains("/bootstrap/")
        || requestURI.contains("/css/")
        || requestURI.contains("/img/"

其他资源必须登陆后才能访问:

(1)如果没有登陆,就去登陆页面;

(2)如果登陆了,就放行;

(2)LoginAuthorServlet.java代码

控制 Jsp静态资源 + Servlet的访问权限

package com.tianju.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 登陆权限的确认;
 * 注意要实现3个方法,如果不加会报错
 */
@WebFilter("/*")
public class LoginAuthorServlet implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("DemoFilter init");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        String requestURI = req.getRequestURI();

        // 1.不登录也可以访问的连接,就放行
        // TODO:如果把contains换成equals
        if (requestURI.contains("/user/login")
        || requestURI.contains("/user/register.jsp")
        || requestURI.contains("/user/register")
        || requestURI.contains("/user/register.jsp")
        || requestURI.contains("/image/get")
//                需要放行这些静态文件
        || requestURI.contains("/js/")
        || requestURI.contains("/bootstrap/")
        || requestURI.contains("/css/")
        || requestURI.contains("/img/")
//        || requestURI.contains("/index.jsp")
        ){
            // 对于登陆,注册,验证码请求的连接,就放行
            filterChain.doFilter(servletRequest, servletResponse);
        }else{
            // 2.其他连接必须登陆才能访问
            HttpSession session = req.getSession();
            Object user = session.getAttribute("user");
            // 如果没有登陆,就去登陆页面
            if (user==null){
                resp.sendRedirect(req.getContextPath()+"/user/login.jsp");
            }else {
                //登陆了,就放行
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }
    }

    @Override
    public void destroy() {
        System.out.println("DemoFilter destroy");
    }
}


总结

1.过滤器可以拦截浏览器的请求,让请求不能进入服务器,或者经过过滤器的doFilter后放行;
2.过滤器实现全局编码控制,记得放行;
3.过滤器进行权限控制,(1)不登录就可以访问的资源直接放行;(2)登陆后才能访问:如果没登录,去登陆页面;如果登陆了,就放行;

你可能感兴趣的:(Java,tomcat,java,servlet)