原作者:尚硅谷-佟刚
检查登录的过滤器
程序目录结构
web.xml
<!-- 存放到session中的键 -->
<context-param>
<param-name>sessionKey</param-name>
<param-value>SESSIONKEY</param-value>
</context-param>
<!-- 重定向的页面 -->
<context-param>
<param-name>redirectPage</param-name>
<param-value>/checklist/login.jsp</param-value>
</context-param>
<!-- 不需要拦截的列表 -->
<context-param>
<param-name>unCheckedUrls</param-name>
<param-value>/checklist/login.jsp,/checklist/doLogin.jsp,/checklist/list.jsp,/checklist/a.jsp</param-value>
</context-param>
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.atweihai.javaweb.filter.LoginFilter</filter-class>
</filter>
<!-- Filter过滤器 拦截的列表 -->
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/checklist/*</url-pattern>
</filter-mapping>
login.jsp
doLogin.jsp
list.jsp
a.jsp(b.jsp,c.jsp等类似)
自定义实现Filter接口的HttpFilter类
package com.atweihai.javaweb.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*自定义实现Filter接口的HttpFilter类
*/
public abstract class HttpFilter implements Filter{
private FilterConfig filterConfig;
public FilterConfig getFilterConfig() {
return filterConfig;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
init();
}
//供子类初始化
protected void init() throws ServletException {}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
try {
HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) resp;
doFilter(request, response, filterChain);
} catch (Exception e) {
e.printStackTrace();
}
}
//供子类进行重写
protected abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException;
@Override
public void destroy() {}
}
LoginFilter.java
package com.atweihai.javaweb.filter;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.servlet.FilterChain;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginFilter extends HttpFilter{
String sessionKey;
String redirectPage;
String unCheckedUrls;
//从web.xml中获取对应的值
@Override
protected void init() throws ServletException {
ServletContext servletContext=getFilterConfig().getServletContext();
sessionKey=servletContext.getInitParameter("sessionKey");
redirectPage=servletContext.getInitParameter("redirectPage");
unCheckedUrls=servletContext.getInitParameter("unCheckedUrls");
}
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
String servletPath=request.getServletPath();
//获取不需要检查的页面列表
List<String> unUrls=Arrays.asList(unCheckedUrls.split(","));
//判断不需要检查的页面
if(unUrls.contains(servletPath)){
filterChain.doFilter(request, response);
return;
}
//判断是否登陆
HttpSession session=request.getSession();
Object sessionValue=session.getAttribute(sessionKey);
if(sessionValue!=null){
filterChain.doFilter(request, response);
return;
}
//重定向到登录页面
response.sendRedirect(request.getContextPath()+redirectPage);
}
}
页面运行效果
login.jsp
list.jsp
d.jsp