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='帅'}
}