Filter过滤器&JSON

1.Filter过滤器基本介绍

在这里插入图片描述

2.filter过滤器的使用

在这里插入图片描述

工作流程图:
在这里插入图片描述
下面代码中访问工程路径下a.jsp文件,由于该文件设置filter过滤器,所以先执行filter过滤器,由于没有登录没有权限访问,则跳到登录页面。

过滤器代码

package com.atguigu.filter;

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

public class AdminFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /*** doFilter 方法,专门用于拦截请求。可以做权限检查 */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");

        if(user==null){
            //如果user为空说明还没有登录,跳转到登录页面
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
        }else{
            //已经登录则让程序继续往下走
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

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 过滤器-->
    <filter>
        <!--给 filter 起一个别名-->
        <filter-name>AdminFilter</filter-name>
        <!--配置 filter 的全类名-->
        <filter-class>com.atguigu.filter.AdminFilter</filter-class>
    </filter>
    <!--filter-mapping 配置 Filter 过滤器的拦截路径-->
    <filter-mapping>
        <!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
        <filter-name>AdminFilter</filter-name>
        <!--url-pattern 配置拦截路径-->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
</web-app>

3.完整的用户登录

如果访问admin目录下的资源,会先执行filter过滤器,如果你还没有登陆账号,则返回登陆页面登录账号,并将用户名session中的user,如果已经登录即session不为空,即可以访问admin目录下的资源。

login.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/11/8
  Time: 0:44
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="http://localhost:8080/filter_1/loginServlet" method="get">
        用户名:<input type="text" name = "username"><br>
        密 码:<input type="password" name = "password"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

LoginServlet代码

package com.atguigu.filter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if("lwb123".equals(username)&&"123456".equals(password)){
            req.getSession().setAttribute("user",username);
            resp.getWriter().write("登录成功");
        }else{
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }
    }
}

4.Filter的生命周期

在这里插入图片描述

package com.atguigu.filter;

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

public class AdminFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init初始化方法执行了");
    }

    /*** doFilter 方法,专门用于拦截请求。可以做权限检查 */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");

        if(user==null){
            //如果user为空说明还没有登录,跳转到登录页面
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
        }else{
            //已经登录则让程序继续往下走
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    @Override
    public void destroy() {
        System.out.println("destroy方法执行了");

    }
}

5.FilterConfig类

在这里插入图片描述
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 过滤器-->
    <filter>
        <!--给 filter 起一个别名-->
        <filter-name>AdminFilter</filter-name>
        <!--配置 filter 的全类名-->
        <filter-class>com.atguigu.filter.AdminFilter</filter-class>
        
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost3306/test</param-value>
        </init-param>
    </filter>
    <!--filter-mapping 配置 Filter 过滤器的拦截路径-->
    <filter-mapping>
        <!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
        <filter-name>AdminFilter</filter-name>
        <!--url-pattern 配置拦截路径-->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.atguigu.filter.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>
</web-app>

java代码

 @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //1.获取Filter的名称filter-name的内容
        System.out.println("filter-name 的值是:" + filterConfig.getFilterName());
        //2.获取在web.xml中配置的init-param初始化参数
        System.out.println("初始化参数 username 的值是:" +filterConfig.getInitParameter("username"));
        System.out.println("初始化参数 url 的值是:" +filterConfig.getInitParameter("url"));
        //3.获取ServletContext对象
        System.out.println(filterConfig.getServletContext());
    }

6.FilerChain 过滤器链

在这里插入图片描述
web.xml配置文件

 <filter>
        <filter-name>Filter1</filter-name>
        <filter-class>com.atguigu.filter.Filter1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Filter1</filter-name>
        <url-pattern>/target.jsp</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>Filter2</filter-name>
        <filter-class>com.atguigu.filter.Filter2</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Filter2</filter-name>
        <url-pattern>/target.jsp</url-pattern>
    </filter-mapping>

Filter1代码

package com.atguigu.filter;

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

public class Filter1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter1前置代码");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("filter1后置代码");
    }

    @Override
    public void destroy() {

    }
}

Filter2代码

package com.atguigu.filter;

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

public class Filter2 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter2前置代码");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("filter2后置代码");
    }

    @Override
    public void destroy() {

    }
}

7.Filter的拦截路径

在这里插入图片描述

8.JSON基本介绍

在这里插入图片描述

9.JSON在js中的基本使用

在这里插入图片描述

9.1 JSON的定义

在这里插入图片描述

// json的定义
			var jsonObj = {
				//值可以是多种类型
				"key1":12,
				"key2":"abc",
				"key":true,
				//值为数组
				"key4":[11,"arr",false],
				//值为json对象
				"key5":{
					"key5_1":551,
					"key5_2":"key5_2_value"
				},
				//值为json数组
				"key6":[{
					"key6_1_1":6611,
					"key6_1_2":"key6_1_2_value"
				},{
					"key6_2_1":6621,
					"key6_2_2":"key6_2_2_value"
				}]
			};

9.2 JSON的访问

在这里插入图片描述

alert(typeof(jsonObj));// object json 就是一个对象
			// json的访问
			alert(jsonObj.key1);//12
			alert(jsonObj.key2);//abc
			alert(jsonObj.key3);//true
			//json中数组的遍历
			for(var i=0;i<jsonObj.key4.length;i++){
				alert(jsonObj.key4[i]);
			}
			//输出值为json对象的json对象
			alert(jsonObj.key5.key5_1);//551
			alert(jsonObj.key5.key5_2);//key_5_2_value

			//得到json数组
			alert(jsonObj.key6);
			//key6数组中取出来的元素都是json对象
			var jsonItem = jsonObj.key6[0];
			alert(jsonItem.key6_1_1);//6611

9.3 json的两种常用方法

在这里插入图片描述

		// json对象转字符串
			var jsonObjString = JSON.stringify(jsonObj);
			alert(jsonObjString);
			// json字符串转json对象
			var jsonObj2 = JSON.parse(jsonObjString);
			alert(jsonObj2.key1);//12

json对象转字符串结果
在这里插入图片描述
字符串转json对象结果
在这里插入图片描述

9.4 json在java中的使用

9.4.1 javabean和json的互转

 @Test
    public void test1(){
        Person person = new Person(1,"林伟波");
        //创建gson对象实例
        Gson gson = new Gson();
        //toJson方法可以把java对象转换成json字符串
        String personJsonString = gson.toJson(person);
        System.out.println(personJsonString);//{"id":1,"name":"林伟波"}

        //fromJson方法可以把Json字符串转换成java对象
        Person person1 = gson.fromJson(personJsonString, Person.class);
        System.out.println(person1);//Person{id=1, name='林伟波'}
    }

9.4.2 list和json的互转

  //list集合和json的互转
    @Test
    public void test2(){
        List<Person> list = new ArrayList<>();
        list.add(new Person(1,"国哥"));
        list.add(new Person(2,"林师傅"));
        //创建gson对象
        Gson gson = new Gson();
        //调用toJson方法将集合转换为json字符串
        String personListJsonString = gson.toJson(list);
        System.out.println(personListJsonString);//[{"id":1,"name":"国哥"},{"id":2,"name":"林师傅"}]

        //要将集合的json字符串转换成集合,需要创建一个类实现 TypeToken类
        // 在fromJson调用该类的getType方法作为参数
        List<Person> list1 = gson.fromJson(personListJsonString, new PersonListType().getType());
        System.out.println(list1.get(0));// TypeToken
    }

创建一个类实现 TypeToken类

package com.atguigu.json;

import com.atguigu.pojo.Person;
import com.google.gson.reflect.TypeToken;

import java.util.ArrayList;

public class PersonListType extends TypeToken<ArrayList<Person>> {
}

9.4.3 map和json的互转

//map集合和json的互转
    @Test
    public void test3(){
        Map<Integer,Person> map = new HashMap<>();
        map.put(1,new Person(1,"帅"));
        map.put(2,new Person(2,"美"));

        //调用toJson方法将map转换为json字符串
        Gson gson = new Gson();
        String mapJsonString = gson.toJson(map);
        System.out.println(mapJsonString);//{"1":{"id":1,"name":"帅"},"2":{"id":2,"name":"美"}}

        //用匿名内部类代替创建一个类实现 TypeToken类,将json字符串转换为map集合
        Map<Integer,Person> map1 = gson.fromJson(mapJsonString,new TypeToken<HashMap<Integer,Person>>(){}.getType());
        System.out.println(map1.get(1));//Person{id=1, name='帅'}
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值