需求
为了不让没有登录的用户来访问我们的网站,希望在每次请求的时候检查用户是否登录,如果没有登录则跳转到登录界面。
思路:
1.新建过滤器类实现Filter接口并在dofilter方法中写下判断逻辑
2.使用web.xml配置或者使用注解进行配置
实例代码:
1.新建过滤器类实现Filter接口并在dofilter方法中写下判断逻辑,我这里的登录界面是index.jsp。另外这里的limitStr 是根据自己的去求来设置的,你也可以只是限制固定的访问地址,或者直接在web.xml的配置中来设置要限制的地址格式。
package ssm.filter;
import org.springframework.util.AntPathMatcher;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Description: 过滤器检查是否登录,如果没有登录则自动跳转到登录页面
* 过滤器在服务器启动的时候就就会初始化,每次访问只会调用dofilter方法
*/
public class LoginCheckFilter implements Filter {
//路径匹配器,支持通配符
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request1 = (HttpServletRequest) request;
HttpServletResponse response1 = (HttpServletResponse) response;
//1、获取本次请求的URI
String requestURI1 = request1.getRequestURI();// /backend/index.html
String requestURI = request1.getServletPath();
System.out.println("拦截到请求:{}"+requestURI);
//定义需要处理的请求路径
String[] limitStr = new String[]{
"/jsp/system/**",
"/muban1Action/qusrTpl.do/**"
};
//定义已经在limitStr中但是又不想处理的地址
String[] urls = new String[]{
"/jsp/system/index.jsp",
"/jsp/system/AdminLogin.jsp"
};
//2、判断本次请求是否需要处理
boolean check = check(limitStr,urls, requestURI);
//3、如果不需要处理,则直接放行
if(check){
//System.out.println("本次请求{}不需要处理"+requestURI);
chain.doFilter(request,response);
return;
}
//4-1、判断登录状态,如果已登录,则直接放行
if(request1.getSession().getAttribute("user") != null){
System.out.println("用户已登录,用户id为:{}"+request1.getSession().getAttribute("user"));
chain.doFilter(request,response);
return;
}
System.out.println("用户未登录");
//5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
//response1.getWriter().write(JSON.toJSONString(""));
String basePath = request.getScheme() + "://" + request.getServerName() + ":" +
request.getServerPort() +((HttpServletRequest) request).getContextPath()+"/jsp/system/index.jsp";//绝对地址
// request.getRequestDispatcher(basePath).forward(request,response);
response1.sendRedirect(basePath);
return;
}
@Override
public void destroy() {
}
/**
* 路径匹配,检查本次请求是否需要放行
* @param urls
* @param requestURI
* @return
*/
public boolean check(String[] limitStr,String[] urls,String requestURI){
boolean isOk = true;
for (String url : limitStr) {//是否在限制目录中
boolean match = PATH_MATCHER.match(url, requestURI);
if(match){
isOk= false;//false表示需要处理
}
}
for (String url : urls) {//是否在放行目录中
boolean match = PATH_MATCHER.match(url, requestURI);
if(match){
isOk= true;//true表示放行
}
}
System.out.println("==============="+requestURI);
return isOk;
}
}
2.使用web.xml配置或者使用注解进行配置
这里的url-pattern可以自己设置,我这里是设置过滤所有的请求
<!--登录检查过滤器-->
<filter>
<filter-name>LoginCheckFilter</filter-name>
<filter-class>ssm.filter.LoginCheckFilter</filter-class><!--src下的 路径-->
</filter>
<filter-mapping>
<filter-name>LoginCheckFilter</filter-name>
<url-pattern>/*</url-pattern><!--过滤所有的请求-->
</filter-mapping>
该文章介绍如何创建一个过滤器类,实现Filter接口,用于检查用户是否登录。如果用户未登录,系统将重定向到登录页面。过滤器在每次请求时运行,通过AntPathMatcher匹配请求URI,决定是否允许访问特定路径。文章提供了具体的Java代码示例和在web.xml中的配置方法。
968

被折叠的 条评论
为什么被折叠?



