在实际应用中,访问某些页面需要相应权限。
比如只有登录的用户才能访问个人中心,如果未登录的用户访问个人中心,就应该进行拦截并重定向到登录页面。
为了实现这个需求,可以使用过滤器(Filter)。
一、编写过滤器类
rootFilter类实现Filter接口(javax.servlet.Filter)。
在doFilter方法中写过滤逻辑,如果用户未登录,则拦截访问请求并重定向跳转到登录页面。
通过session判断用户是否登录,具体实现方法是用户登录成功后,把用户类的实例化对象user存储到session中。
request.getSession().setAttribute(Constants.USER_SESSION, user);
在过滤逻辑中尝试从session获取用户对象user。
User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);
user为空,用户未登录,就重定向跳转到登录页面。
//未登录跳转到登录页面
if(user == null){
resp.sendRedirect("/login.jsp");
}
过滤器完整代码:
package com.hohong.filter;
import com.hohong.pojo.User;
import com.hohong.util.Constants;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//如果用户未登录则不能访问登录以外的页面
public class rootFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//获取登录用户信息
User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);
//未登录跳转到登录页面
if(user == null){
resp.sendRedirect("/login.jsp");
}
chain.doFilter(req,resp);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
二、注册过滤器
过滤器写完后,和Servlet一样,需要在web.xml中注册才能使用。
filter-name:过滤器名称,不需要和过滤器类名一致。 filter-class:过滤器类的包路径 url-pattern:使用该过滤器的页面,“/*”代表全选。
<filter>
<filter-name>rootFilter</filter-name>
<filter-class>com.hohong.filter.rootFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>rootFilter</filter-name>
<url-pattern>/jsp/frame.jsp</url-pattern>
</filter-mapping>
如果不是webapp,也可以通过配置@WebFilter注册
@WebFilter(filterName="EncodeFilter",urlPatterns = "*")
public class rootFilter implements Filter {
/* 执行语句 */
}
filterName:过滤器名称,用作区别不同过滤器。
urlPatterns:使用该过滤器的页面,“*”表示所有页面。