Javaweb
未登录被filter过滤,过滤后重定向到登录页面,然后登录后就不放行被过滤的页面了该怎么办
```java
package filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class LoginCheckFilter implements Filter {
private String excludedPages;
private String[] excludedPageArray;
@Override
public void init(FilterConfig config) throws ServletException {
excludedPages = config.getInitParameter("excludedPages");
if (null != excludedPages && excludedPages.length() > 0) {
excludedPageArray = excludedPages.split(",");
}
return;
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
boolean isExcludedPage = false;
HttpSession session = ((HttpServletRequest) req).getSession();
Object user = session.getAttribute("user");
System.out.println("user"+user);
// 获取不过滤的列表
for (String page : excludedPageArray) {
if (((HttpServletRequest) req).getServletPath().equals(page)) {
isExcludedPage = true;
break;
}
}
if (isExcludedPage) { //如果有不过滤的页面,放行
chain.doFilter(req, resp);
} else {
if (user != null){
chain.doFilter(req,resp);
}else {
((HttpServletRequest)req).getRequestDispatcher("/first.jsp").forward(req,resp);
}
}
}
@Override
public void destroy() {
}
}
```
在Filter中,可以通过检查会话中是否存在登录状态信息来判断用户是否已登录,如果已登录,则放行请求,否则进行重定向到登录页面
public class AuthenticationFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 获取当前会话
HttpSession session = httpRequest.getSession(false);
// 检查会话中是否存在登录状态信息
if (session != null && session.getAttribute("loggedIn") != null) {
// 用户已登录,放行请求
chain.doFilter(request, response);
} else {
// 用户未登录,重定向到登录页面
httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
}
}
// 省略其他方法
}
不知道你这个问题是否已经解决, 如果还没有解决的话:1、编写一个类去实现 Filter 接口
public class AdminFilter implements Filter {
/***
* @Description: doFilter方法专门用于拦截请求(可以做权限检查),过滤响应。
* @Param: [servletRequest, servletResponse, filterChain]
* @return: void
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
//如果等于null,说明还没有登录。
if (user == null) {
//请求转发
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
return;
} else {
// 让 程 序 继 续 往 下 访 问 用 户 的 目 标 资 源
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
2、实现过滤方法 doFilter()
3、到 web.xml 中去配置 Filter 的拦截路径
<!--filter标 签 用 于 配 置 一 个 Filter过 滤 器 -->
<filter>
<!--给 filter起 一 个 别 名 -->
<filter-name>AdminFilter</filter-name>
<!--配 置 filter 的 全 类 名 -->
<filter-class>filter.AdminFilter</filter-class>
</filter>
<!--filter-mapping配 置 Filter过 滤 器 的 拦 截 路 径 -->
<filter-mapping>
<!--filter-name表 示 当 前 的 拦 截 路 径 给 哪 个 filter使 用 -->
<filter-name>AdminFilter</filter-name>
<!--url-pattern 配 置 拦 截 路 径
/ 表 示 请 求 地 址 为 : http://ip:port/ 工 程 路 径 /映 射 到 IDEA的web目 录
/admin/*表 示 请 求 地 址 为 : http://ip:port/ 工 程 路 径 /admin/*-->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>