此文主要讲如何用Java的过滤器实现用户未登录重定向,即实现用户身份验证,用户未登录就跳转到登录页面。这在我们做项目的过程中会经常使用到。
首先我们在Java Resources的src目录下新建一个packet,用来存放我们过滤器的SessionFilter.java文件。然后在web.xml进行过滤的配置。
目录详情.png
SessionFilter.java 代码:
package com.ted.myPlant.filter;import java.io.IOException;import java.net.URLEncoder;import java.util.regex.Pattern;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;import org.apache.commons.lang3.StringUtils;public class SessionFilter implements Filter { /** * 要检查的 session 的名称 */ private String sessionKey; /** * 需要排除(不拦截)的URL的正则表达式 */ private Pattern excepUrlPattern; /** * 检查不通过时,转发的URL */ private String redirectUrl; @Override public void init(FilterConfig cfg) throws ServletException { sessionKey = cfg.getInitParameter("sessionKey"); String excepUrlRegex = cfg.getInitParameter("excepUrlRegex"); if (!StringUtils.isBlank(excepUrlRegex)) { excepUrlPattern = Pattern.compile(excepUrlRegex); } redirectUrl = cfg.getInitParameter("redirectUrl"); } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 如果 sessionKey 为空,则直接放行 if (StringUtils.isBlank(sessionKey)) { chain.doFilter(req, res); return; } // * 请求 http://127.0.0.1:8080/webApp/home.jsp?&a=1&b=2 时 // * request.getRequestURL():http://127.0.0.1:8080/webApp/home.jsp // * request.getContextPath(): /webApp // * request.getServletPath():/home.jsp // * request.getRequestURI(): /webApp/home.jsp // * request.getQueryString():a=1&b=2 HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String servletPath = request.getServletPath(); String type = request.getHeader("X-Requested-With") == null ? "" : request.getHeader("X-Requested-With"); // 如果请求的路径与forwardUrl相同,或请求的路径是排除的URL时,则直接放行 if (servletPath.equals(redirectUrl) || excepUrlPattern.matcher(servletPath).matches()) { chain.doFilter(req, res); return; } Object sessionObj = request.getSession().getAttribute(sessionKey); // 如果Session为空,则跳转到指定页面 if (sessionObj == null) { String contextPath = request.getContextPath(); String redirect = servletPath + "?" + StringUtils.defaultString(request.getQueryString()); String jumpUrl = contextPath + StringUtils.defaultIfEmpty(redirectUrl, "/") + "?redirect=" + URLEncoder.encode(redirect, "UTF-8"); if ("XMLHttpRequest".equals(type)) { response.setHeader("SESSIONSTATUS", "TIMEOUT"); response.setHeader( "CONTEXTPATH", contextPath + StringUtils.defaultIfEmpty(redirectUrl, "/")); response.setStatus(HttpServletResponse.SC_FORBIDDEN); return; } else { response.sendRedirect(jumpUrl); } } else { chain.doFilter(req, res); } } @Override public void destroy() { } }
web.xml 配置加上过滤这段:
<filter> <filter-name>SessionFilter</filter-name> <filter-class>com.ted.myPlant.filter.SessionFilter</filter-class> <init-param> <description>将当前登录的用户的信息保存在 session 中时使用的key,如果没有配置此参数,则该过滤器不起作用</description> <param-name>sessionKey</param-name> <param-value>user</param-value> </init-param> <init-param> <description>未登录重定向地址</description> <param-name>redirectUrl</param-name> <param-value>/page/login.html</param-value> </init-param> <init-param> <description>不需要进行拦截的 </description> <param-name>excepUrlRegex</param-name> <param-value>^.*(login|assert|favicon|js|img|css).*$</param-value> </init-param> </filter> <filter-mapping> <filter-name>SessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <session-config> <session-timeout>10</session-timeout> </session-config>
配置完之后就已经实现了未登录的重定向,效果图如下:
先输入首页的地址:
访问首页.png
按下回车,进行访问,用户验证未登录,过滤器重新定向到了登录页面:
作者:白昼黯淡了星光
链接:https://www.jianshu.com/p/b5e44b9dd03c
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦