【Web】filter过滤器
前言
暑期项目实习第八课,用filter过滤器实现登陆验证功能,让功能只有在登陆后才能使用。
Code
该篇为【Web】ssm注册修改查询实现的衍生篇,其余详细代码部分查阅上篇详解。
webapp中的web.xml
首先编写配置文件让程序能够识别到我们写的Filter过滤器。
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.zr0701.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
完整文件,代码上方出现的Filter过滤器为原有的中文过滤器,防止出现中文报错问题。我们本次添加的Filter在下方。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 配置加载类路径的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
<!-- 配置监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!-- 解决中文乱码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 前端控制器(加载classpath:spring-mvc.xml 服务器启动创建servlet) -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数,创建完DispatcherServlet对象,加载springmvc.xml配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- 服务器启动的时候,让DispatcherServlet对象创建 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.zr0701.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>
filter下的LoginFilter
package com.zr0701.filter;
import com.zr0701.bean.User;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { //初始化
}
@Override //添加过滤规则
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
String uri = request.getRequestURI(); //获得请求路径(除去host(域名或者IP)部分路径) 8080端口号后面部分
// String uri = .getRequestURL();返回全路径
System.out.println(uri.indexOf("findAll.do"));
System.out.println(uri.indexOf("login.do"));
if(user == null && uri.indexOf("login.do")==-1) {
response.sendRedirect(request.getContextPath() + "/");
}else {
filterChain.doFilter(request,response); //链状过滤 此中只有一层Filter过滤器
}
}
@Override //清除Filter
public void destroy() {
}
}
最终效果
尚未登陆,点击查看数据,会发现无法查看且一直跳回主页。
当登陆后再去点击查看数据时,便可以正常查看了。
注:此时网页会记录登陆数据,当清理cookie等数据后,便需再次登陆。