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

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

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]当前不可用

在这里插入图片描述

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

在这里插入图片描述

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

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

web.xml文件代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>characterEncodingFilter</filter-name>
        <filter-class>com.tianju.filter.CharacterEncodingFilter</filter-class>
<!-- 带上变量-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>htmlShow</param-name>
            <param-value>text/html;charset=utf-8</param-value>
        </init-param>

    </filter>

    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-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、静态资源等,或者登陆后才能访问;或者不登录也可以访问

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

在这里插入图片描述

		|| 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");
    }
}


![img](https://img-blog.csdnimg.cn/img_convert/8d4b5b6e6b96a769fba6940b30884103.png)
![img](https://img-blog.csdnimg.cn/img_convert/bf4de78d0126bcadff13a984c112f9d0.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618631832)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

...(img-7NOwBP3a-1715790930049)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618631832)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

### 如何确保HTML textarea元素正确显示中文字符 为了确保 HTML `textarea` 元素能够正确显示中文字符,需要关注几个方面:前端页面编码设置、表单提交方法以及服务器端处理。 #### 前端页面编码设置 确保网页文档声明了正确的字符集。在 `<head>` 部分加入如下 meta 标签可以指定整个页面使用的字符编码为 UTF-8: ```html <meta charset="UTF-8"> ``` 这一步骤对于防止浏览器错误解释输入内容至关重要[^4]。 #### 表单提交方式的选择 考虑到 GET 请求会将参数附加于 URL 后面并可能引起特殊字符的不当转义,建议优先选用 POST 方法来提交包含复杂或非ASCII字符的数据给服务器。这样不仅可以避免URL长度限制的问题,还能减少因字符编码差异带来的困扰。 #### 服务器端配置调整 如果应用运行环境基于 Tomcat 或其他 Java Servlet 容器,则需确认容器已适当设置了接收请求时所期望的字符编码格式。例如,在 Apache Tomcat 中可以通过修改 server.xml 文件内的 Connector 节点属性实现这一点: ```xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> ``` 此外,还可以考虑在应用程序层面增加过滤器(Filter),强制所有 HTTP 请求都按照统一的标准进行解码操作,从而进一步保障数据的一致性和准确性。 #### JavaScript 处理方案补充 针对某些特定场景下可能出现的个别字符无法正常呈现的情况,可以在客户端利用 JavaScript 对用户输入做预处理。比如使用正则表达式替换掉可能导致渲染异常的标记符号,或者手动执行一次 HTML 实体化转换后再展示给用户查看[^2]: ```javascript function escapeHtml(text) { var map = { '&amp;': '&amp;', '<': '<', '>': '>', '"': '"', "'": ''' }; return text.replace(/[&amp;<>"']/g, function(m) {return map[m];}); } ``` 以上措施结合起来可以帮助有效解决 `textarea` 组件内中文及其他多字节字符的正确表示问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值