IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 过滤器与监听器 -> 正文阅读

[网络协议]过滤器与监听器

一,过滤器(Filter):
1.用于在Servlet之外对Request 或 Response 进行修改。主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。
2.过程:对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
3.在一个web应用中可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
实例:请求乱码的处理,用户非法访问的拦截
4.在HttpServletRequest 到达 Servlet之前,拦截客户的HttpServletRequest。 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
5.在HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

@WebFilter("/One")
public class FilterTest implements Filter {
    @Override
    public void init(FilterConfig fc) throws ServletException{

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//           doFilter();放行方法前做请求拦截
            System.out.println("正在过滤/One 链接的请求资源");
//            设置可放行资源 ,如果不设置,则服务器将收不到相应的url请求
           filterChain.doFilter(servletRequest,servletResponse);
//           doFilter();  放行方法后做响应拦截
            System.out.println("Filter处理响应");
    }

    @Override
    public void destroy() {

    }
}




//处理请求乱码问题
@WebFilter("/*")
public class FilterTest implements Filter {
    @Override
    public void init(FilterConfig fc) throws ServletException{

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//             基于HTTP
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

//        处理post请求乱码
        request.setCharacterEncoding("UTF-8");

//        处理GET请求且服务器版本在Tomcat8以下的
        String method = request.getMethod();
//        若是Get请求
        if("GET".equalsIgnoreCase(method)){
//            获取服务器版本
            String ServerInfo = request.getServletContext().getServerInfo();
            String version = ServerInfo.substring(ServerInfo.indexOf("/")+1,ServerInfo.indexOf("."));
//            判断服务器是否小于8
            if(Integer.parseInt(version) < 8){
//    得到自定义内部类,MyWapper 继承了HttpServletRequestWapper对象,而HttpServletRequestWapper对象实现了
//                HttpServletRequest接口,所以MyWapper的本质也是request对象
                HttpServletRequest myRequest = new MyWapper(request);
//                放行资源
                filterChain.doFilter(myRequest,response);
                return ;
            }
        }
//        这里放行的资源是post请求的
        filterChain.doFilter(request,response);
    }

    @Override
    public void destroy() {

    }
}
//Mywapper,自定义的Request包装类
public class MyWapper  extends HttpServletRequestWrapper {
//    定义成员变量,提升构造器中的request对象的范围
    private HttpServletRequest req;
    public MyWapper(HttpServletRequest request) {
        super(request);
        this.req = request;
    }
// 重写getParameter()方法
    @Override
    public String getParameter(String name){
        String val = req.getParameter(name);

        if(val != null && "".equals(val.trim())){
            try{
//                将默认的ISO-8859-1编码的字符转换成UTF-8
                val = new String(val.getBytes("ISO-8859-1"),"UTF-8");
            } catch (UnsupportedEncodingException e){
                e.printStackTrace();
            }
        }
        return val;
    }
}




//用户非法访问拦截
 *  非法访问拦截(即当用户未登录时,拦截需要登录授权才能使用的请求)
 *       拦截的资源:   所有,“/*”
 *       可放行访问的资源:
 *                 -不需要登录就能访问的页面:(登录页面,注册页面等)
 *                 -静态资源:(css,js,image等)
 *                 -放行指定操作(登录操作,注册操作等)
 *                 -登录状态放行(如果存在指定sessuin对象,则为登录状态)
 */
public class BlockIllegalAccess implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//                      将变量转换成基于HTTP实现
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse res = (HttpServletResponse) servletResponse;

//        得到请求路径
        String UrlPath = req.getRequestURI();     //      站点名/资源路径

//        放行可访问的资源
        if(UrlPath.contains("/Login.jsp") || UrlPath.contains("/Register.jsp")){
            filterChain.doFilter(req,res);
            return;
        }
        if(UrlPath.contains("/js") || UrlPath.contains("/css") ||UrlPath.contains("/image")){
            filterChain.doFilter(req,res);
            return;
        }
        if(UrlPath.contains("/Login") || UrlPath.contains("/Register") || UrlPath.contains("/ElseOperation")){
            filterChain.doFilter(req,res);
            return;
        }
        //        获取用户登录状态
        HttpSession hsr = req.getSession();
        String UserStatus = (String) hsr.getAttribute("UserStatus");

        if(UserStatus.equals("0")){
            //当用户未登录时,拦截请求跳转到登录页面
            res.sendRedirect("Login.jsp");
            
        } else{
            filterChain.doFilter(req,res);
            return;
        }

    }

    @Override
    public void destroy() {

    }
}

二,监听器:
1.web监听器是Servlet中一种的特殊的类,能帮助开发者监听web中的特定事件,如:
SevletContext,HttpSession, ServletRequest等的创建和销毁,其变量的创建和销毁,修改等,
可以在某些动作前后增加处理,实现监控。
2. 实例:在线人数统计
3.监听器有三类:
-监听生命周期:
ServletRequestListener
HttpSessionListener
ServletContextListener

             -监听属性的值的变化:
                     ServletRequestAttributeListener
                     ServletSessionAttributeListener
                     ServletContextAttributeListener
          
             -监听Session中的对象:
                    监听Session中java对象(javaBean),是javaBean直接实现监听器的接口。 
//监听Session创建和销毁的类
@WebListener("/*")
public class ListenerTest implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Session被创建了");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
         System.out.println("Session被销毁了");
    }
}

@WebServlet("/SessionTest")
public class TestServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        HttpSession MySession  = req.getSession();
        MySession.setAttribute("Name","vodka");

    }
}


@WebServlet
public class SessionDestroy extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//      销毁对象
        req.getSession().invalidate();
    }
}




//监听在线人数
@WebListener
public class DetectedNumbers implements HttpSessionListener {

//    定义一个变量记录登录人数
    private int PeopleNumbers = 0;
    @Override
    public void sessionCreated(HttpSessionEvent hse) {
        System.out.println("session已建立");
        PeopleNumbers++;
//    将人数变量存进ServletContext作用域
        hse.getSession().getServletContext().setAttribute("PeopleNumbers",PeopleNumbers);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent hse) {
        PeopleNumbers--;
//        修改人数
        hse.getSession().getServletContext().setAttribute("PeopleNumbers",PeopleNumbers);
        System.out.println("session被销毁了");
    }
}





@WebServlet("/PeopleNum")
public class DetectedServer extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//             设置响应编码
             resp.setContentType("text/html;charset=UTF-8");
        HttpSession session = req.getSession();
//        获取参数key ,判断是否为空,若不为空,则退出
             String key = req.getParameter("key");
             if(key != null && "logout".equals(key)){
//                  销毁session对象
                 session.invalidate();
                 return;
             }

        ServletContext sc =  session.getServletContext();
             int nums = (int) sc.getAttribute("PeopleNumbers");
             resp.getWriter().write("<h1>当前在线人数为:"+ nums+"</h1> <a href='PeopleNum?key=logout'>退出</a>");
    }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 00:04:46  更:2021-09-11 00:05:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:40:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码