目录
一:过滤器的使用以及实现原理
(1)当前的oa项目还存在什么缺陷?
(2)Filter是什么,有什么用,执行原理是什么?
(3)过滤器怎么写?
package com.bjpowernode.javaweb.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.javaweb.servlet
* @Project:JavaWeb
* @name:MyFilter
* @Date:2022/12/3 15:31
*/
public class MyFilter implements Filter {
public MyFilter() {
System.out.println("无参数构造方法执行");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init方法执行");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Filter1 doFilter方法开始执行");
}
@Override
public void destroy() {
System.out.println("destroy方法执行");
}
}
<?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-name>myfilter</filter-name>
<filter-class>com.bjpowernode.javaweb.servlet.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>/a.do</url-pattern>
</filter-mapping>
</web-app>
package com.bjpowernode.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.javaweb.servlet
* @Project:JavaWeb
* @name:Aservlet
* @Date:2022/12/3 15:40
*/
@WebFilter("/a.do")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("AServlet中的doGet方法执行了。");
}
}
BServlet类
package com.bjpowernode.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.javaweb.servlet
* @Project:JavaWeb
* @name:BServlet
* @Date:2022/12/3 15:41
*/
@WebFilter("/b.do")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("BServlet中的doGet方法执行了。");
}
}
package com.bjpowernode.javaweb.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.javaweb.servlet
* @Project:JavaWeb
* @name:MyFilter
* @Date:2022/12/3 15:31
*/
public class MyFilter implements Filter {
public MyFilter() {
System.out.println("无参数构造方法执行");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init方法执行");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 在请求的时候添加过滤规则。
System.out.println("Filter1 doFilter方法开始执行");
// 执行下一个过滤器,如果下一个不是过滤器了,则执行目标程序Servlet
// 简单理解就是向下走
chain.doFilter(request,response);
// 在响应的时候添加过滤规则。
System.out.println("Filter1 doFilter方法执行结束。");
}
@Override
public void destroy() {
System.out.println("destroy方法执行");
}
}
执行结果如下:
补充:
(4)过滤器的调用顺序?
定义一个MyFilter1过滤器
package com.bjpowernode.javaweb.servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init方法执行");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Filter1 doFilter方法开始执行");
chain.doFilter(request,response);
System.out.println("Filter1 doFilter方法执行结束。");
}
@Override
public void destroy() {
System.out.println("destroy方法执行");
}
}
定义一个MyFilter2过滤器
package com.bjpowernode.javaweb.servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter2 doFilter begin");
chain.doFilter(request, response);
System.out.println("Filter2 doFilter end");
}
@Override
public void destroy() {
}
}
选择在xml文件中配置,对应的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-name>myfilter</filter-name>
<filter-class>com.bjpowernode.javaweb.servlet.MyFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter>
<filter-name>myfilter2</filter-name>
<filter-class>com.bjpowernode.javaweb.servlet.MyFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter2</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>
定义一个AServlet类,路径通过注解的方式
package com.bjpowernode.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter("/a.do")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("AServlet中的doGet方法执行了。");
}
}
(5)Filter的生命周期?
二:责任链设计模式改造oa项目
package com.bjpowernode.javaweb.servlet;
public class Test {
public static void main(String[] args) {
System.out.println("main begin");
m1();
System.out.println("main over");
}
private static void m1() {
System.out.println("m1 begin");
m2();
System.out.println("m1 over");
}
private static void m2() {
System.out.println("m2 begin");
m3();
System.out.println("m2 over");
}
private static void m3() {
System.out.println("目标正在执行中。。。。");
}
}
①首先配置web.xml文件
<filter>
<filter-name>loginfilter</filter-name>
<filter-class>com.bjpowernode.oa.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
②编写一个过滤器,作为判断的登录
package com.bjpowernode.oa.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.oa.filter
* @Project:JavaWeb
* @name:LoginFilter
* @Date:2022/12/3 17:39
*/
public class LoginFilter implements Filter {
// 也可以只重写其中一个方法
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
// 注意这里要先进行强转为HttpServlet,后面才能调用对应的方法
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse) resp;
// 获取请求路径
String servletPath = request.getServletPath();
// 获取当前session对象,获取不到就返回null
HttpSession session = request.getSession(false);
if("/index.jsp".equals(servletPath) || "/welcome".equals(servletPath) ||
"/dept/login".equals(servletPath) || "/dept/exit".equals(servletPath)
|| (session != null && session.getAttribute("username") != null)){
// 经过上面过滤,只有上面的路径才会直接通过;其它的操作都要先跳转到登录页面
// 继续往下走
chain.doFilter(request, response);
}else{
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
}
}
package com.bjpowernode.oa.web.action;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
/**
* 员工管理的。
* 员工管理的前提也是需要先登录。
*/
public class EmpServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 乱码问题也可以写入过滤器当中
// post请求乱码问题
request.setCharacterEncoding("UTF-8");
// 响应中文乱码问题
response.setContentType("text/html;charset=UTF-8");
HttpSession session = request.getSession(false);
if(session != null && session.getAttribute("username") != null){
String servletPath = request.getServletPath();
//...
}else{
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
}
}
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute("username") != null){ // session对象不一定为null
// 获取servlet path
String servletPath = request.getServletPath();
if ("/dept/list".equals(servletPath)){
doList(request,response);
}else if("/dept/detail".equals(servletPath)){
doDetail(request,response);
}else if("/dept/delete".equals(servletPath)) {
doDel(request, response);
}else if("/dept/add".equals(servletPath)) {
doAdd(request, response);
}else if("/dept/modify".equals(servletPath)) {
doModify(request, response);
}
}else{
// 跳转到登录页面
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
修改为:
String servletPath = request.getServletPath();
if ("/dept/list".equals(servletPath)){
doList(request,response);
}else if("/dept/detail".equals(servletPath)){
doDetail(request,response);
}else if("/dept/delete".equals(servletPath)) {
doDel(request, response);
}else if("/dept/add".equals(servletPath)) {
doAdd(request, response);
}else if("/dept/modify".equals(servletPath)) {
doModify(request, response);
}