Java过滤器是一个用来处理HTTP请求和响应的组件,它可以拦截客户端发送给服务器的请求,并在请求到达目标资源之前对请求进行修改或者对请求进行一些预处理操作。
应用场景:
-
用户权限控制:通过过滤器可以拦截用户请求,检查用户是否具有访问某个资源的权限,然后根据权限决定是否允许用户继续访问。
-
请求参数验证和处理:过滤器可以对请求参数进行验证和处理,确保参数的合法性和正确性。
-
缓存控制:过滤器可以对响应进行缓存控制,设置过期时间、缓存策略等。
项目目录
创建一个过滤器,session不存在user则跳转到login.jsp进行登录操作
public class LoginFilter implements Filter{
public void LoginFilter(){
/*构造方法*/
System.out.println("LoginFilter构造方法");
}
public void destroy() {
/*销毁时调用*/
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
/*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/
HttpServletRequest httprequest = (HttpServletRequest) req;
HttpSession session= httprequest.getSession();
Object user=session.getAttribute("user");
if(user==null){
req.getRequestDispatcher("/login.jsp").forward(req, resp);
}else{
chain.doFilter(req, resp);//执行Filter2
}
}
public void init(FilterConfig config) throws ServletException {
/*初始化方法 接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/
}
}
创建Servlet控制器,比对用户名、密码并将用户名保存入session
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if("admin".equals(username)&&"12345".equals(password)){
request.getSession().setAttribute("user",username);
response.getWriter().write("success");
}else {
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
System.out.println(username);
System.out.println(password);
}
}
web.xml配置映射,拦截/admin/*的资源
<?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>AdminFilter</filter-name>
<filter-class>com.jm.LoginFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>12345</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.jm.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
设置登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录页面
<form action="http://localhost:8080/login" method="get">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
此时访问a.html,会被拦截并跳转到登录页
Filter的生命周期
FilterConfig类
public void init(FilterConfig config) throws ServletException {
/*初始化方法 接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/
// 获取过滤器名称
System.out.println(config.getFilterName());
// 获取初始化值
System.out.println(config.getInitParameter("username"));
// 获取servletcontext对象
System.out.println(config.getServletContext());
}
FilterChain过滤器链
FilterChain.doFilter(req, resp);当有多个过滤器时会按照顺序执行,多个过滤器的执行顺序由web.xml中配置的顺序决定
标签:username,Web,Java,void,request,---,println,过滤器,public From: https://blog.csdn.net/weixin_52153645/article/details/140110944