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

img
img

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

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

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

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


![在这里插入图片描述](https://img-blog.csdnimg.cn/32a9d9ab67914c89aa5d60abeeb5781a.png)


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


![在这里插入图片描述](https://img-blog.csdnimg.cn/8e48618d067f428a946ff643893060d7.png)


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


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


web.xml文件代码如下:



<?xml version="1.0" encoding="UTF-8"?>

    过滤器中可以配置一个参数-->
<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>

此时过滤器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、静态资源等,或者登陆后才能访问;或者不登录也可以访问


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


![在这里插入图片描述](https://img-blog.csdnimg.cn/cc3e11980bc94fbf9dcc6612c50dcbf6.png)



	|| 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/f33f9b60acda5b472163294359ffc275.png)
![img](https://img-blog.csdnimg.cn/img_convert/6ace146a7305f441cede515d96555c07.png)
![img](https://img-blog.csdnimg.cn/img_convert/ce68418eb18bfe921bc35eeec5c07609.png)

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

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

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

1715790897244)]
[外链图片转存中...(img-Qp2ETsYv-1715790897245)]

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

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

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

  • 30
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值