1、写SessionFilter (自定义)过滤器,要实现Filter接口
import java.io.IOException;import java.util.regex.Pattern;import java.net.URLEncoder;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.lang.StringUtils; public class SessionFilter implements Filter{ /要检讨的 session 的名称 / private String sessionKey; /须要打消(不拦截)的URL的正则表达式 / private Pattern excepUrlPattern; /检讨不通过期,转发的URL / private String forwardUrl; public void init(FilterConfig cfg) throws ServletException{ System.out.println(\公众SessionFilter的启动\公众); sessionKey= cfg.getInitparameter(\公众sessionKey\公众); String excepUrlRegex = cfg.getInitParameter(\"大众excepUrlRegex\"大众); if (!StringUtils.isBlank(excepUrlRegex)){ excepUrlPattern= Pattern.compile(excepUrlRegex); } forwardUrl= cfg.getInitParameter(\"大众forwardUrl\"大众); } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { System.out.println(\"大众实行SessionFilter过滤\公众); //如果 sessionKey 为空,则直接放行(个人以为在此这个判断条件没有用) if (StringUtils.isBlank(sessionKey)){ chain.doFilter(req,res); return; } / 要求 http://127.0.0.1:8080/sm/index.jsp?&a=1&b=2 时 request.getRequestURL(): http://127.0.0.1:8080/sm/index.jsp request.getContextPath(): /sm request.getServletPath():/index.jsp request.getRequestURI(): /sm/index.jsp request.getQueryString():a=1&b=2 / HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String servletPath = request.getServletPath(); System.out.println(\"大众servletPath=\"大众+servletPath); //如果要求的路径与forwardUrl相同,或要求的路径是打消的URL时,则直接放行 if (servletPath.equals(forwardUrl)|| excepUrlPattern.matcher(servletPath).matches()) { chain.doFilter(req,res); return; } //把稳:adminName为用户登录名,必须在登录信息传到后台时放到Session //里,我的项目在@Controller的登任命户传到后台时当判断用户名和密码精确 //后立马到Session里,浸染是用来判断Session如果还有效,返回不为空,可以在后台连续操作;如果超时了,返回null,则跳到登录页面 Object sessionObj = request.getSession().getAttribute(\公众adminName\公众); //如果Session为空,则跳转到指定页面 if (sessionObj== null){ String contextPath = request.getContextPath(); String redirect = servletPath + \"大众?\"大众 +StringUtils.defaultString(request.getQueryString()); response.sendRedirect(contextPath+ StringUtils.defaultIfEmpty(forwardUrl, \公众/\"大众) +\"大众?redirect=\公众 +URLEncoder.encode(redirect, \公众UTF-8\"大众)); }else { //如果能通过,就放行 chain.doFilter(req,res); } } public void destroy(){ System.out.println(\"大众SessionFilter的销毁\"大众); }}
笔墨有一处要把稳:即
Object sessionObj = request.getSession().getAttribute(\"大众adminName\公众);
中的“adminName”要在后台有设置,否则不起浸染,比如我在Controller中这样设置
2、在web.xml中配置如下过滤器信息(重点在如何设置哪些路径须要拦截,哪些不须要拦截)
<!-- 检讨用户是否登录了系统的过滤器配置 开始 --><filter><filter-name>SessionFilter</filter-name><filter-class>com.py.util.wrb.SessionFilter</filter-class><init-param><description>将当前登录的用户的信息保存在session 中时利用的key,如果没有配置此参数,则该过滤器不起浸染</description><param-name>sessionKey</param-name><param-value>adminName</param-value></init-param><init-param><description> 如果用户未登录(即在session 中 key 为 sessionKey 的属性不存在或为空),则将要求重定向到该 url。 该url 不包含web运用的 ContextPath。如果不配置此参数,则在用户未登录系统的情形下, 直接重定向到web运用的根路径(/) </description><param-name>forwardUrl</param-name><param-value>/index.jsp</param-value></init-param><init-param><description> 不须要进行拦截的url 的正则表达式,即:如果当前要求的 url 的 servletPath 能匹配该正则表达式,则直接放行(纵然未登录系统)。 此参数的值一样平常为loginServlet 和 registServlet 等。其余,参数redirectUrl 的值不用包含在该正则表达式中,由于 redirectUrl 对应的 url 会被自动放行。 还有一点须要解释的是,该参数的值不包含web运用的ContextPath。 </description><param-name>excepUrlRegex</param-name><!-- 不须要拦截的路径 (login_login_execute|login_2_login).do 会在后面有详细的阐明--><param-value>/(jumpIndex|loginAdmin)</param-value></init-param></filter><!-- / 表示所有的都要进行过滤--><filter-mapping><filter-name>SessionFilter</filter-name><url-pattern>/</url-pattern></filter-mapping>
耐心讲解:打个比方,如果你登录你的系统要输入这样的地址进入登录界面:
http://127.0.0.1:8080/sm/index.jsp
那么forwardUrl该当是这样写,代表页面的登录页面(forwardUrl可自定义名称,当然要见词知意最好,下同)
<param-name>forwardUrl</param-name><param-value>/index.jsp</param-value>
在一个别系中,我们一样平常把登录页面放在web-inf的表面,否则直接访问不了(个人见地),为了起到保护浸染,我们在登录页面点击登录,要做一些路径跳转,有多个跳转就有多少个路径,直到后台的主界面,这些路径也必须不能拦截,否则你登录不到后台。如下,这里解释登录到后台要经由jumpIndex和loginAdmin路径,“|”代表“或”
<description> 不须要进行拦截的url 的正则表达式,即:如果当前要求的 url 的 servletPath 能匹配该正 则表达式,则直接放行(纵然未登录系统)。 此参数的值一样平常为loginServlet 和 registServlet 等。其余,参数redirectUrl 的值不用 包含在该正则表达式中,由于 redirectUrl 对应的 url 会被自动放行。 还有一点须要解释的是,该参数的值不包含web运用的ContextPath。</description><param-name>excepUrlRegex</param-name><param-value>/(jumpIndex|loginAdmin)</param-value>
3、为了方便测试,最好设置Session的有效韶光短一点,如何设置Session有效韶光百度有一大堆,我是在web.xml重配置的,如:我设置有效韶光为1分钟
<session-config><session-timeout>1</session-timeout></session-config>
这样可以在Session失落效后直接登录后台看是否进得去
比如我登录后台后的一个路径为:http://127.0.0.1:8080/sm/camera
当Session失落效后在新的地址栏上输入:http://127.0.0.1:8080/sm/camera
看是否能进入。进不去,解释过滤器起浸染了。
至此完成,有什么问题可以留言,我会及时回答!
后面我会连续完善这篇文章,希望各位能给点指示,感激!
声明:我通过百度上找很多资料,结合自己项目做的,我希望能对大家有所帮助。