package com.gaze.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(filterName = "LoginFilter", urlPatterns = {"/user/*", "/order/*"}, initParams = {
@WebInitParam(name = "login_url", value = "login.jsp"),
@WebInitParam(name = "encoding", value = "UTF-8")
})
public class LoginFilter implements Filter {
private FilterConfig filterConfig;
private String encoding;
private String loginPage;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CustomFilter init ");
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
this.loginPage = filterConfig.getInitParameter("login_url");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("CustomFilter doFilter ");
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
response.setContentType("text/html;charset=utf-8");
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse =
(HttpServletResponse) response;
//session⾥里里⾯面有⽤用户信息
if (httpServletRequest.getSession().getAttribute("loginUser") != null) {
chain.doFilter(request, response);
} else {
httpServletRequest.setAttribute("msg", "⾮非法访问,请登录");
httpServletRequest.getRequestDispatcher(loginPage).forward(
httpServletRequest, httpServletResponse);
}
}
@Override
public void destroy() {
System.out.println("CustomFilter destroy ");
Filter.super.destroy();
}
}
@WebFilter(filterName = "LoginFilter", urlPatterns = {"/user/*", "/order/*"}, initParams = { @WebInitParam(name = "login_url", value = "login.jsp"), @WebInitParam(name = "encoding", value = "UTF-8") })
-
@WebFilter
:这是一个注解,用于声明一个过滤器。它告诉Servlet容器这个类是一个过滤器。 -
filterName = "LoginFilter"
:这是过滤器的名称。在这个例子中,过滤器的名称被设置为"LoginFilter"。 -
urlPatterns = {"/user/*", "/order/*"}
:这个属性定义了过滤器应该拦截哪些URL模式。在这个例子中,过滤器会拦截所有以"/user/“和”/order/"开头的请求。 -
initParams = { ... }
:这个属性用于定义初始化参数,这些参数可以在过滤器初始化时使用。-
@WebInitParam(name = "login_url", value = "login.jsp")
:这是一个初始化参数,它的名字是"login_url",值是"login.jsp"。这意味着如果用户未登录尝试访问被拦截的URL,过滤器可以将用户重定向到"login.jsp"页面。 -
@WebInitParam(name = "encoding", value = "UTF-8")
:这是另一个初始化参数,它的名字是"encoding",值是"UTF-8"。这通常用于设置请求和响应的字符编码。
-
@Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("CustomFilter init "); this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); this.loginPage = filterConfig.getInitParameter("login_url"); }
-
存储配置信息:
filterConfig
变量用于存储过滤器的配置信息。这些信息通常在Web应用程序的部署描述符(web.xml)或者通过注解(如@WebFilter
)中指定。 -
获取初始化参数:通过
filterConfig
对象,可以在过滤器的init
方法中获取初始化参数。这些参数在过滤器初始化时设置,可以在整个过滤器生命周期中使用 -
获取过滤器名称:可以通过
filterConfig
获取在部署描述符中指定的过滤器名称。 -
String filterName = filterConfig.getFilterName();
-
获取ServletContext:
filterConfig
提供了一个方法来获取ServletContext
对象,该对象代表了Web应用程序的上下文。 - ServletContext context = filterConfig.getServletContext();
HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletResponse httpServletResponse = (HttpServletResponse) response;
public interface A {
void eat();
}
package com.gaze.test;
public interface B extends A{
}
/**
* 向上转型是指将一个子类型(在这里是 B)的对象转换为父类型(在这里是 A)的引用。向上转型总是安全的,因为子类型保证实现了父类型的所有方法。
*
*/
B b = new ImpB();
//向上转型不需要显示转换
A a = b;
//向下转型是指将一个父类型(在这里是 A)的对象转换为子类型(在这里是 B)的引用。向下转型是不安全的,因为父类型的对象可能并不是子类型的实例
B b = (B) new ImpA();
-
为什么要进行类型转换:
- 访问HTTP特定的功能:
HttpServletRequest
和HttpServletResponse
接口提供了对HTTP协议特定功能的访问,这些功能超出了ServletRequest
和ServletResponse
接口提供的通用功能。例如,HttpServletRequest
提供了访问HTTP请求头、cookies、请求参数、会话管理等功能。同样,HttpServletResponse
提供了设置HTTP状态码、HTTP响应头、重定向等功能。 - 代码清晰性:通过显式地转换到
HttpServletRequest
和HttpServletResponse
,代码的意图更加明确,表明你打算处理HTTP请求和响应。
- 访问HTTP特定的功能:
子类实现父类更多功能,应该把父类转子类处理