1、“登录过滤器”是干什么用的?
1)“登录过滤器”就是为了防止在用户没有登录的情况下来访问我们的网站。
2)举例:main.html 这个网页是需要通过login.html这个网页登录后才可以访问的,现在有一个用户没有登录,直接访问main.html成功了。那么,这样的网站是不是觉得不安全呢?用户不用登录随随便便就访问了。因此,我们需要用过滤器来过滤一些需要登录后才可以访问的页面.
2、我们要怎么过滤呢?
1)我们肯定要过滤掉需要登录的页面
2)我们拿到了需要登录的页面后,我们怎么判断用户有没有登录呢?
3)已session为依据,来判断用户是不是登录过了。登录过了我们就让他继续访问,没有登录的我们就让他返回到登录界面。
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.FilterChain;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.web.filter.OncePerRequestFilter;
- /**
- * 类名称:SessionFilter
- * 类描述: 登陆过滤器
- * 修改备注:
- * @version
- */
- public class SessionFilter extends OncePerRequestFilter {
- @Override
- protected void doFilterInternal(HttpServletRequest request,
- HttpServletResponse response, FilterChain filterChain)
- throws ServletException, IOException {
- // 不过滤的uri
- String[] notFilter = new String[] { "login.jsp"};
- // 请求的uri
- String uri = request.getRequestURI();
- // uri中包含pages时才进行过滤
- // 是否过滤
- boolean doFilter = true;
- for (String s : notFilter) {
- if (uri.indexOf(s) != -1) {
- // 如果uri中包含不过滤的uri,则不进行过滤
- doFilter = false;
- break;
- }
- }
- if (doFilter) {
- // 执行过滤
- // 从session中获取登录者实体
- Object obj = request.getSession().getAttribute("loginedUser");
- if (null == obj) {
- // 如果session中不存在登录者实体,则弹出框提示重新登录
- // 设置request和response的字符集,防止乱码
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
- PrintWriter out = response.getWriter();
- String loginPage = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
- StringBuilder builder = new StringBuilder();
- builder.append("<script charset=\"UTF-8\" language=\"javascript\" type=\"text/javascript\">");
- builder.append("alert('网页过期,请重新登录!');");
- builder.append("window.top.location.href='");
- builder.append(loginPage);
- builder.append("';");
- builder.append("</script>");
- out.print(builder.toString());
- } else {
- // 如果session中存在登录者实体,则继续
- filterChain.doFilter(request, response);
- }
- } else {
- // 如果不执行过滤,则继续
- filterChain.doFilter(request, response);
- }
- }
- }
- }
2. 写完过滤器后,需要在web.xml中进行配置:
- <!-- 登陆过滤器 -->
- <filter>
- <filter-name>sessionFilter</filter-name>
- <filter-class>com.wisdom.management.filter.SessionFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>sessionFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>