当前位置: 首页 > news >正文

JavaWeb过滤器(Filter)

参考:https://blog.csdn.net/yuzhiqiang_1993/article/details/81288912

原理:

一般实现流程:

1、新建一个类,实现Filter接口
2、实现doFilter()方法,打印一句话,来证明能够进行拦截
3、在web.xml中进行配置(参照Servlet配置)
4、访问一个页面,看看能不能拦截

 

1、Filter实现类

import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
public class UserFilter implements Filter {
 
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
         
    }
     
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
 
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 获取session对象,判断是否登录
        HttpServletRequest req=(HttpServletRequest)request;
        HttpServletResponse res=(HttpServletResponse)response;
        HttpSession session = req.getSession();
        if(session.getAttribute("user")==null){
            // 非法访问,没有登录,跳转到登录页面
            session.setAttribute("error","非法访问");
            // 保存客户想要去的地址, 登录成功后则直接跳转,而不是到首页
            // 获取请求的地址, 包括工程名,但是不包括参数
            System.out.println(req.getRequestURI());
            // 获取请求的参数
            System.out.println("参数:" + req.getQueryString());
            // 获取当前项目的绝对路径,方法已过时,不推荐使用 推荐使用  request.getServletContext().getRealPath("")
            System.out.println(req.getRealPath(""));
            // 获取请求的地址, 但是不包括工程名和参数
            System.out.println(req.getServletPath());
            // 此方法需要在servlet 3.0的版本上使用, 开发的环境需要J2EE6 运行需要Tomcate7.0
            //System.out.println("request.getServletContext().getRealPath:" +request.getServletContext().getRealPath(""));
            String goURL=req.getServletPath();
            if(req.getQueryString()!=null){
                goURL += "?" + req.getQueryString();
            }
            System.out.println(goURL);
            session.setAttribute("goURL", goURL);
            res.sendRedirect(req.getContextPath() + "/login.jsp");
            System.out.println(req.getContextPath());
        }else{
            // 如果有下一个过滤器则跳转到下一个过滤器否则目标页面
            chain.doFilter(request, response);
        }
    }
}
session.setAttribute("error","非法访问")可以用对象取代,如:
request.getSession().setAttribute("humanSession", human对象);

2、web.xml配置

<filter>
    <filter-name>userFilter</filter-name>
    <filter-class>
        cn.***.UserFilter
    </filter-class>
  </filter>
  <filter-mapping>
    <filter-name>userFilter</filter-name>
    <url-pattern>/user/*</url-pattern><br>    <dispatcher>REQUEST</dispatcher> <!-- 没有配置dispatcher就是默认request方式的 --> 
      <dispatcher>FORWARD</dispatcher> 
      <dispatcher>ERROR</dispatcher> 
      <dispatcher>INCLUDE</dispatcher>
  </filter-mapping>

 

转载于:https://www.cnblogs.com/zhaoyanhaoBlog/p/11309194.html

相关文章:

  • Hadoop 系列(四)—— Hadoop 开发环境搭建
  • hibernate 持久化对象 save
  • 进阶1:基础查询
  • MyBatis 核心配置综述之 ParameterHandler
  • webbrowser
  • maven多模块profiles的石使用
  • 史上最强maven配置详情
  • vue-preview 缩略图
  • Redis 学习笔记(篇八):事件
  • Spring Boot使用Liquibase最佳实践
  • Hibernate相关概念及序列化和持久化的区别
  • Oracle常用指令
  • leetcode 25. Reverse Nodes in k-Group
  • python异常处理
  • 极客时间-左耳听风-程序员攻略-UI/UX设计
  • $translatePartialLoader加载失败及解决方式
  • CentOS从零开始部署Nodejs项目
  • CSS魔法堂:Absolute Positioning就这个样
  • Git 使用集
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript DOM 10 - 滚动
  • laravel with 查询列表限制条数
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 机器学习中为什么要做归一化normalization
  • 记录一下第一次使用npm
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端代码风格自动化系列(二)之Commitlint
  • 我这样减少了26.5M Java内存!
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • $$$$GB2312-80区位编码表$$$$
  • (09)Hive——CTE 公共表达式
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (笔试题)合法字符串
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (六)c52学习之旅-独立按键
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • .NET gRPC 和RESTful简单对比
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET性能优化(文摘)
  • /proc/stat文件详解(翻译)
  • @Autowired自动装配